smart_thermostat_radiator.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. """Smart Thermostat Radiator"""
  2. import logging
  3. from ..const.climate import SmartThermostatRadiatorMode
  4. _LOGGER = logging.getLogger(__name__)
  5. def process_smart_thermostat_radiator(
  6. data: bytes | None, mfr_data: bytes | None
  7. ) -> dict[str, bool | int | str]:
  8. """Process Smart Thermostat Radiator data."""
  9. if mfr_data is None:
  10. return {}
  11. _seq_num = mfr_data[6]
  12. _isOn = bool(mfr_data[7] & 0b10000000)
  13. _battery = mfr_data[7] & 0b01111111
  14. temp_data = mfr_data[8:11]
  15. target_decimal = (temp_data[0] >> 4) & 0x0F
  16. local_decimal = temp_data[0] & 0x0F
  17. local_sign = 1 if (temp_data[1] & 0x80) else -1
  18. local_int = temp_data[1] & 0x7F
  19. local_temp = local_sign * (local_int + (local_decimal / 10))
  20. target_sign = 1 if (temp_data[2] & 0x80) else -1
  21. target_int = temp_data[2] & 0x7F
  22. target_temp = target_sign * (target_int + (target_decimal / 10))
  23. last_mode = SmartThermostatRadiatorMode.get_mode_name((mfr_data[11] >> 4) & 0x0F)
  24. mode = SmartThermostatRadiatorMode.get_mode_name(mfr_data[11] & 0x07)
  25. need_update_temp = bool((mfr_data[12] >> 5) & 0x01)
  26. restarted = bool((mfr_data[12] >> 4) & 0x01)
  27. fault_code = (mfr_data[12] >> 1) & 0x07
  28. door_open = bool(mfr_data[12] & 0x01)
  29. result = {
  30. "sequence_number": _seq_num,
  31. "isOn": _isOn,
  32. "battery": _battery,
  33. "temperature": local_temp,
  34. "target_temperature": target_temp,
  35. "mode": mode,
  36. "last_mode": last_mode,
  37. "need_update_temp": need_update_temp,
  38. "restarted": restarted,
  39. "fault_code": fault_code,
  40. "door_open": door_open,
  41. }
  42. _LOGGER.debug(
  43. "Smart Thermostat Radiator mfr data: %s, result: %s", mfr_data.hex(), result
  44. )
  45. return result