1
0

presence_sensor.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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. duration = (mfr_data[8] << 8) + mfr_data[9]
  18. trigger_flag = mfr_data[10]
  19. led_state = bool(mfr_data[11] & 0x80)
  20. light_level = mfr_data[11] & 0x1F
  21. result = {
  22. "sequence_number": seq_number,
  23. "adaptive_state": adaptive_state,
  24. "motion_detected": motion_detected,
  25. "battery_range": battery_range,
  26. "duration": duration,
  27. "trigger_flag": trigger_flag,
  28. "led_state": led_state,
  29. "lightLevel": light_level,
  30. }
  31. if data:
  32. battery = data[2] & 0x7F
  33. result["battery"] = battery
  34. _LOGGER.debug(
  35. "Processed presence sensor mfr data: %s, result: %s", mfr_data.hex(), result
  36. )
  37. return result