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