56 lines
1.3 KiB
Python
56 lines
1.3 KiB
Python
from dataclasses import asdict, dataclass
|
|
from typing import Any, Mapping
|
|
|
|
|
|
def _is_on(value: Any) -> bool:
|
|
return value == "on"
|
|
|
|
|
|
@dataclass(frozen=True, slots=True)
|
|
class TionState:
|
|
power: bool
|
|
heater: bool
|
|
heating: bool
|
|
sound: bool
|
|
mode: str
|
|
|
|
out_temp: int
|
|
in_temp: int
|
|
target_temp: int
|
|
|
|
fan_speed: int
|
|
filter_remain: float
|
|
|
|
device_time: str
|
|
request_error_code: int
|
|
model: str
|
|
|
|
light: bool | None = None
|
|
|
|
@classmethod
|
|
def from_raw(cls, data: Mapping[str, Any]) -> "TionState":
|
|
light_raw = data.get("light")
|
|
|
|
return cls(
|
|
power=_is_on(data["state"]),
|
|
heater=_is_on(data["heater"]),
|
|
heating=_is_on(data["heating"]),
|
|
sound=_is_on(data["sound"]),
|
|
mode=str(data["mode"]),
|
|
|
|
out_temp=int(data["out_temp"]),
|
|
in_temp=int(data["in_temp"]),
|
|
target_temp=int(data["heater_temp"]),
|
|
|
|
fan_speed=int(data["fan_speed"]),
|
|
filter_remain=float(data["filter_remain"]),
|
|
|
|
device_time=str(data["time"]),
|
|
request_error_code=int(data["request_error_code"]),
|
|
model=str(data["model"]),
|
|
|
|
light=None if light_raw is None else _is_on(light_raw),
|
|
)
|
|
|
|
def to_dict(self) -> dict:
|
|
return asdict(self) |