air_purifier.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. """Air Purifier adv parser."""
  2. from __future__ import annotations
  3. import struct
  4. from ..const.air_purifier import AirPurifierMode, AirQualityLevel
  5. def process_air_purifier(
  6. data: bytes | None, mfr_data: bytes | None
  7. ) -> dict[str, bool | int]:
  8. """Process air purifier services data."""
  9. if mfr_data is None:
  10. return {}
  11. device_data = mfr_data[6:]
  12. _seq_num = device_data[0]
  13. _isOn = bool(device_data[1] & 0b10000000)
  14. _mode = device_data[1] & 0b00000111
  15. _is_aqi_valid = bool(device_data[2] & 0b00000100)
  16. _child_lock = bool(device_data[2] & 0b00000010)
  17. _speed = device_data[3] & 0b01111111
  18. _aqi_level = (device_data[4] & 0b00000110) >> 1
  19. _aqi_level = AirQualityLevel(_aqi_level).name.lower()
  20. _work_time = struct.unpack(">H", device_data[5:7])[0]
  21. _err_code = device_data[7]
  22. return {
  23. "isOn": _isOn,
  24. "mode": get_air_purifier_mode(_mode, _speed),
  25. "isAqiValid": _is_aqi_valid,
  26. "child_lock": _child_lock,
  27. "speed": _speed,
  28. "aqi_level": _aqi_level,
  29. "filter element working time": _work_time,
  30. "err_code": _err_code,
  31. "sequence_number": _seq_num,
  32. }
  33. def get_air_purifier_mode(mode: int, speed: int) -> str | None:
  34. if mode == 1:
  35. if 0 <= speed <= 33:
  36. return "level_1"
  37. if 34 <= speed <= 66:
  38. return "level_2"
  39. return "level_3"
  40. if 1 < mode <= 4:
  41. mode += 2
  42. return AirPurifierMode(mode).name.lower()
  43. return None