| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- """Advertisement data parser for presence sensor devices."""
- from __future__ import annotations
- import logging
- from ..const.presence_sensor import BATTERY_LEVEL_MAP
- _LOGGER = logging.getLogger(__name__)
- def process_presence_sensor(
- data: bytes | None, mfr_data: bytes | None
- ) -> dict[str, bool | int | str]:
- """Process Presence Sensor data."""
- if mfr_data is None:
- return {}
- seq_number = mfr_data[6]
- adaptive_state = bool(mfr_data[7] & 0x80)
- motion_detected = bool(mfr_data[7] & 0x40)
- battery_bits = (mfr_data[7] >> 2) & 0x03
- battery_range = BATTERY_LEVEL_MAP.get(battery_bits, "Unknown")
- duration = (mfr_data[8] << 8) + mfr_data[9]
- trigger_flag = mfr_data[10]
- led_state = bool(mfr_data[11] & 0x80)
- light_level = mfr_data[11] & 0x1F
- result = {
- "sequence_number": seq_number,
- "adaptive_state": adaptive_state,
- "motion_detected": motion_detected,
- "battery_range": battery_range,
- "duration": duration,
- "trigger_flag": trigger_flag,
- "led_state": led_state,
- "lightLevel": light_level,
- }
- if data:
- battery = data[2] & 0x7F
- result["battery"] = battery
- _LOGGER.debug(
- "Processed presence sensor mfr data: %s, result: %s", mfr_data.hex(), result
- )
- return result
|