12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- """Air Purifier adv parser."""
- from __future__ import annotations
- import struct
- from ..const.air_purifier import AirPurifierMode, AirQualityLevel
- def process_air_purifier(
- data: bytes | None, mfr_data: bytes | None
- ) -> dict[str, bool | int]:
- """Process air purifier services data."""
- if mfr_data is None:
- return {}
- device_data = mfr_data[6:]
- _seq_num = device_data[0]
- _isOn = bool(device_data[1] & 0b10000000)
- _mode = device_data[1] & 0b00000111
- _is_aqi_valid = bool(device_data[2] & 0b00000100)
- _child_lock = bool(device_data[2] & 0b00000010)
- _speed = device_data[3] & 0b01111111
- _aqi_level = (device_data[4] & 0b00000110) >> 1
- _aqi_level = AirQualityLevel(_aqi_level).name.lower()
- _work_time = struct.unpack(">H", device_data[5:7])[0]
- _err_code = device_data[7]
- return {
- "isOn": _isOn,
- "mode": get_air_purifier_mode(_mode, _speed),
- "isAqiValid": _is_aqi_valid,
- "child_lock": _child_lock,
- "speed": _speed,
- "aqi_level": _aqi_level,
- "filter element working time": _work_time,
- "err_code": _err_code,
- "sequence_number": _seq_num,
- }
- def get_air_purifier_mode(mode: int, speed: int) -> str | None:
- if mode == 1:
- if 0 <= speed <= 33:
- return "level_1"
- if 34 <= speed <= 66:
- return "level_2"
- return "level_3"
- if 1 < mode <= 4:
- mode += 2
- return AirPurifierMode(mode).name.lower()
- return None
|