Skip to main content

Govee Bluetooth Hygrometers

Playing with some Govee H5074 and H5075 Bluetooth hygrometers. All code below was grabbed from Google search AI responses and then altered to suite.

 

import asyncio
import struct

from bleak import BleakScanner

timeout_seconds = 20
address_to_look_for = 'A4:C1:38'
service_id_to_look_for = '0000ec88-0000-1000-8000-00805f9b34fb'


class MyScanner:
    def __init__(self):
        self._scanner = BleakScanner()
        self._scanner.register_detection_callback(self.detection_callback)
        self.scanning = asyncio.Event()

    def detection_callback(self, device, advertisement_data):
        if device.address.startswith(address_to_look_for):
            if "H5074" in device.name:
                print(f"[FOUND] [{device.address}] Govee H5074: {device.name}")
            elif "H5075" in device.name:
                print(f"[FOUND] [{device.address}] Govee H5075: {device.name}")
            else:
                print(f"[FOUND] [{device.address}] Other Govee device: {device.name}")

            byte_data = advertisement_data.service_data.get(service_id_to_look_for)
            print(f"     -> {advertisement_data}")
            print(f"     -> byte_data -> {byte_data}")

#        if device.address.startswith(address_to_look_for)
#            byte_data = advertisement_data.service_data.get(service_id_to_look_for)
#            num_to_test, = struct.unpack_from('<I', byte_data, 0)
#            if num_to_test == 62976:
#                print('\t\tDevice found so we terminate')
#                self.scanning.clear()

    async def run(self):
        await self._scanner.start()
        self.scanning.set()
        end_time = loop.time() + timeout_seconds
        while self.scanning.is_set():
            if loop.time() > end_time:
                self.scanning.clear()
                print('\t\tScan has timed out so we terminate')
            await asyncio.sleep(0.1)
        await self._scanner.stop()


if __name__ == '__main__':
    my_scanner = MyScanner()
    loop = asyncio.get_event_loop()
    loop.run_until_complete(my_scanner.run())

 

Script output with MAC addresses redacted:

[FOUND] [A4:C1:38:xx:xx:xx] Govee H5074: Govee_H5074_24XX
     -> AdvertisementData(local_name='Govee_H5074_24XX', manufacturer_data={60552: b'\x00e\x08\x86\x13d\x02', 76: b'\x02\x15INTELLI_ROCKS_HWPu\xf2\xff\xc2'}, service_uuids=['0000ec88-0000-1000-8000-00805f9b34fb'], rssi=-55)
[FOUND] [A4:C1:38:xx:xx:xx] Govee H5075: GVH5075_7EXX
     -> AdvertisementData(local_name='GVH5075_7EXX', manufacturer_data={60552: b'\x00\x03:-d\x00', 76: b'\x02\x15INTELLI_ROCKS_HWPu\xf2\xff\x0c'}, service_uuids=['0000ec88-0000-1000-8000-00805f9b34fb'], rssi=-62)