weather_station.py 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. """Weather Station parser."""
  2. from __future__ import annotations
  3. from typing import Any
  4. from ._sensor_th import decode_temp_humidity
  5. def process_weather_station(
  6. data: bytes | None, mfr_data: bytes | None
  7. ) -> dict[str, Any]:
  8. """
  9. Process Weather Station advertisement data.
  10. Manufacturer data layout (mfr_id=2409, after company ID stripped by bleak):
  11. Byte 0-5: MAC address
  12. Byte 6: Sequence number
  13. Byte 7: Battery (bit7=charging, bit6-0=level%)
  14. Byte 8: Temp alarm(bit7-6), Humidity alarm(bit5-4), Temp decimal(bit3-0)
  15. Byte 9: Temp sign(bit7: 0=neg,1=pos), Temp integer(bit6-0)
  16. Byte 10: Fahrenheit flag(bit7), Humidity(bit6-0)
  17. """
  18. temp_data: bytes | None = None
  19. battery: int | None = None
  20. if mfr_data and len(mfr_data) >= 11:
  21. temp_data = mfr_data[8:11]
  22. battery = mfr_data[7] & 0b01111111
  23. if data and len(data) >= 6:
  24. if not temp_data:
  25. temp_data = data[3:6]
  26. if battery is None:
  27. battery = data[2] & 0b01111111
  28. if not temp_data:
  29. return {}
  30. return decode_temp_humidity(temp_data, battery)