"""Air Purifier adv parser.""" from __future__ import annotations from typing import Any from ..const.hub3 import LIGHT_INTENSITY_MAP def process_hub3(data: bytes | None, mfr_data: bytes | None) -> dict[str, Any]: """Process hub3 sensor manufacturer data.""" if mfr_data is None: return {} device_data = mfr_data[6:] seq_num = device_data[0] network_state = (device_data[6] & 0b11000000) >> 6 sensor_inserted = not bool(device_data[6] & 0b00100000) light_level = device_data[6] & 0b00001111 illuminance = calculate_light_intensity(light_level) temperature_alarm = bool(device_data[7] & 0b11000000) humidity_alarm = bool(device_data[7] & 0b00110000) temp_data = device_data[7:10] _temp_sign = 1 if temp_data[1] & 0b10000000 else -1 _temp_c = _temp_sign * ( (temp_data[1] & 0b01111111) + ((temp_data[0] & 0b00001111) / 10) ) _temp_f = round(((_temp_c * 9 / 5) + 32), 1) humidity = temp_data[2] & 0b01111111 motion_detected = bool(device_data[10] & 0b10000000) return { "sequence_number": seq_num, "network_state": network_state, "sensor_inserted": sensor_inserted, "lightLevel": light_level, "illuminance": illuminance, "temperature_alarm": temperature_alarm, "humidity_alarm": humidity_alarm, "temp": {"c": _temp_c, "f": _temp_f}, "temperature": _temp_c, "humidity": humidity, "motion_detected": motion_detected, } def calculate_light_intensity(light_level: int) -> int: """ Convert Hub 3 light level (1-10) to actual light intensity value Args: light_level: Integer from 1-10 Returns: Corresponding light intensity value or 0 if invalid input """ return LIGHT_INTENSITY_MAP.get(max(0, min(light_level, 10)), 0)