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)