climate_panel.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. """Advertisement data parser for climate panel devices."""
  2. import logging
  3. _LOGGER = logging.getLogger(__name__)
  4. def process_climate_panel(
  5. data: bytes | None, mfr_data: bytes | None
  6. ) -> dict[str, bool | int | str]:
  7. """Process Climate Panel data."""
  8. if mfr_data is None or len(mfr_data) < 16:
  9. return {}
  10. seq_number = mfr_data[6]
  11. isOn = bool(mfr_data[7] & 0x80)
  12. battery = mfr_data[7] & 0x7F
  13. humidity_alarm = (mfr_data[8] >> 6) & 0x03
  14. temp_alarm = (mfr_data[8] >> 4) & 0x03
  15. temp_decimal = mfr_data[8] & 0x0F
  16. temp_sign = 1 if (mfr_data[9] & 0x80) else -1
  17. temp_int = mfr_data[9] & 0x7F
  18. temperature = temp_sign * (temp_int + temp_decimal / 10)
  19. humidity = mfr_data[10] & 0x7F
  20. pir_state = bool(mfr_data[15] & 0x80)
  21. is_light = ((mfr_data[15] >> 1) & 0x03) == 0x02
  22. # Keystate bytes report physical ON/OFF button presses. For each byte,
  23. # Bit[7:5] is the press mode (0: power-on init, 1: single, 2: double,
  24. # 3: long) and Bit[4:0] is a 1-30 cyclic counter that resets to 1 when the
  25. # mode changes. A value of 0x00 is the power-on state and must not trigger.
  26. # The raw byte is also exposed so consumers can watch it for any change.
  27. on_keystate = mfr_data[13]
  28. off_keystate = mfr_data[14]
  29. on_keystate_mode = (on_keystate >> 5) & 0x07
  30. on_keystate_counter = on_keystate & 0x1F
  31. off_keystate_mode = (off_keystate >> 5) & 0x07
  32. off_keystate_counter = off_keystate & 0x1F
  33. result = {
  34. "sequence_number": seq_number,
  35. "isOn": isOn,
  36. "battery": battery,
  37. "temperature": temperature,
  38. "humidity": humidity,
  39. "temp_alarm": temp_alarm,
  40. "humidity_alarm": humidity_alarm,
  41. "motion_detected": pir_state,
  42. "is_light": is_light,
  43. "on_keystate": on_keystate,
  44. "off_keystate": off_keystate,
  45. "on_keystate_mode": on_keystate_mode,
  46. "on_keystate_counter": on_keystate_counter,
  47. "off_keystate_mode": off_keystate_mode,
  48. "off_keystate_counter": off_keystate_counter,
  49. }
  50. _LOGGER.debug(
  51. "Processed climate panel mfr data: %s, result: %s", mfr_data.hex(), result
  52. )
  53. return result