diff --git a/gateway/gateway.py b/gateway/gateway.py index 0e93ea6..9a064cc 100644 --- a/gateway/gateway.py +++ b/gateway/gateway.py @@ -113,29 +113,25 @@ class Gateway: log.info(f"Published to {topic} : {payload}") def on_device_found(self, device, adv_data): - """BLE scan callback — filters on Thingy:52 service UUID and decodes payload.""" - uuids = [str(u).lower() for u in adv_data.service_uuids] - if self.service_uuid.lower() not in uuids: - return + """BLE scan callback — filters on Adrien's preamble (0xffff) in manufacturer data.""" + if not adv_data.manufacturer_data: + return - # Try manufacturer data first, then service data - raw = None - if adv_data.manufacturer_data: - raw = list(adv_data.manufacturer_data.values())[0] - elif adv_data.service_data: - raw = list(adv_data.service_data.values())[0] + raw = list(adv_data.manufacturer_data.values())[0] - if raw is None: - log.debug(f"{device.address} | no payload data found") - return + # Filter on preamble 0xffff (company id defined in firmware spec) + if len(raw) < 2 or raw[0] != 0xff or raw[1] != 0xff: + return - data = self.decode_payload(raw) - if not data: - log.warning(f"{device.address} | empty decoded payload") - return + log.debug(f"{device.address} | Thingy detected, raw: {list(raw)}") - log.debug(f"{device.address} | decoded: {data}") - self.publish(device.address, data) + data = self.decode_payload(raw) + if not data: + log.warning(f"{device.address} | empty decoded payload") + return + + log.debug(f"{device.address} | decoded: {data}") + self.publish(device.address, data) async def run(self): """Start passive BLE scan and run indefinitely."""