# 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.

```python
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)
```