presence_sensor.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. """Advertisement data parser for presence sensor devices."""
  2. from __future__ import annotations
  3. import logging
  4. from ..const.presence_sensor import BATTERY_LEVEL_MAP
  5. _LOGGER = logging.getLogger(__name__)
  6. def process_presence_sensor(
  7. data: bytes | None, mfr_data: bytes | None
  8. ) -> dict[str, bool | int | str]:
  9. """Process Presence Sensor data."""
  10. if mfr_data is None:
  11. return {}
  12. seq_number = mfr_data[6]
  13. adaptive_state = bool(mfr_data[7] & 0x80)
  14. motion_detected = bool(mfr_data[7] & 0x40)
  15. battery_bits = (mfr_data[7] >> 2) & 0x03
  16. battery_range = BATTERY_LEVEL_MAP.get(battery_bits, "Unknown")
  17. trigger_flag = mfr_data[10]
  18. led_state = bool(mfr_data[11] & 0x80)
  19. light_level = mfr_data[11] & 0x0F
  20. result = {
  21. "sequence_number": seq_number,
  22. "adaptive_state": adaptive_state,
  23. "motion_detected": motion_detected,
  24. "battery_range": battery_range,
  25. "trigger_flag": trigger_flag,
  26. "led_state": led_state,
  27. "lightLevel": light_level,
  28. }
  29. if data:
  30. battery = data[2] & 0x7F
  31. result["battery"] = battery
  32. _LOGGER.debug(
  33. "Processed presence sensor mfr data: %s, result: %s", mfr_data.hex(), result
  34. )
  35. return result