src/bluetooth/devices/Govee5074.ts (74 lines of code) (raw):

import {Device} from 'react-native-ble-plx'; import {BleDeviceModel, DeviceItemProps} from './BleDevice'; import {Buffer} from 'buffer'; interface Govee5074Data { temperature: number; humidity: number; battery: number; rssi?: number; } export const Govee5074Model: BleDeviceModel<Govee5074Data> = { matches(device: Device): boolean { return device.name?.startsWith('Govee_H5074') ?? false; }, onScan(device: Device): Govee5074Data | null { if (!device.manufacturerData) { return null; } const buf = Buffer.from(device.manufacturerData, 'base64'); if (buf.toString('ascii').includes('INTELLI_ROCKS')) { return null; } // 88 ec 00 14 09 3b 0e 64 02 // 0 1 2 [3 4] [5 6] [7] 8 // ^ ^ ^ // temp hum batt const temperature = buf.readInt16LE(3) / 100; const humidity = buf.readInt16LE(5) / 100; const battery = buf.readUint8(7); const data: Govee5074Data = { temperature, humidity, battery, rssi: device.rssi ?? undefined, }; return data; }, getItemProps: function (data: Govee5074Data): DeviceItemProps[] { const props: DeviceItemProps[] = [ data.temperature && { id: 'temp', name: 'Temperature', enabled: true, simulated: false, dataType: 'number', value: data.temperature, unit: '°C', }, data.humidity && { id: 'humidity', name: 'Humidity', enabled: true, simulated: false, dataType: 'number', value: data.humidity, unit: '%', }, { id: 'rssi', name: 'RSSI', enabled: true, simulated: false, dataType: 'number', value: data.rssi, unit: 'dBm', }, data.battery && { id: 'battery', name: 'Battery', enabled: true, simulated: false, dataType: 'number', value: data.battery, unit: '%', }, ].filter(Boolean) as DeviceItemProps[]; return props; }, };