| 123456789101112131415161718192021222324252627282930313233343536 |
- """Shared temperature/humidity decoding helpers for T/H sensors."""
- from __future__ import annotations
- from typing import Any
- from ..helpers import celsius_to_fahrenheit
- def decode_temp_humidity(temp_data: bytes, battery: int | None) -> dict[str, Any]:
- """
- Decode temperature/humidity/fahrenheit-flag from a 3-byte payload.
- Layout (bytes after company ID, for SwitchBot T/H sensors):
- byte 0: bits[3:0] = temperature decimal (0.1 °C units)
- byte 1: bit[7] = temperature sign (1 = positive), bits[6:0] = integer °C
- byte 2: bit[7] = fahrenheit-display flag, bits[6:0] = humidity %
- """
- _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 = celsius_to_fahrenheit(_temp_c)
- _temp_f = (_temp_f * 10) / 10
- humidity = temp_data[2] & 0b01111111
- if _temp_c == 0 and humidity == 0 and battery == 0:
- return {}
- return {
- "temp": {"c": _temp_c, "f": _temp_f},
- "temperature": _temp_c,
- "fahrenheit": bool(temp_data[2] & 0b10000000),
- "humidity": humidity,
- "battery": battery,
- }
|