Skip to content

Commit 211b22a

Browse files
authored
Merge pull request #91 from erwindouna/dev
Adding AC & water heater
2 parents b37989e + c314e5c commit 211b22a

File tree

12 files changed

+859
-168
lines changed

12 files changed

+859
-168
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "tadoasync"
3-
version = "0.1.18"
3+
version = "0.1.19"
44
authors = ["Erwin Douna <[email protected]>"]
55
classifiers = [
66
"Development Status :: 5 - Production/Stable",

src/tadoasync/models.py

Lines changed: 89 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -171,13 +171,24 @@ class Zone(DataClassORJSONMixin): # pylint: disable=too-many-instance-attribute
171171
date_created: str = field(metadata=field_options(alias="dateCreated"))
172172
device_types: list[str] = field(metadata=field_options(alias="deviceTypes"))
173173
devices: list[Device]
174-
report_available: bool = field(metadata=field_options(alias="reportAvailable"))
175-
show_schedule_detup: bool = field(metadata=field_options(alias="showScheduleSetup"))
176-
supports_dazzle: bool = field(metadata=field_options(alias="supportsDazzle"))
177-
dazzle_enabled: bool = field(metadata=field_options(alias="dazzleEnabled"))
178-
dazzle_mode: DazzleMode = field(metadata=field_options(alias="dazzleMode"))
179-
open_window_detection: OpenWindowDetection = field(
180-
metadata=field_options(alias="openWindowDetection")
174+
dazzle_mode: DazzleMode | None = field(
175+
metadata=field_options(alias="dazzleMode"),
176+
default=None,
177+
)
178+
open_window_detection: OpenWindowDetection | None = field(
179+
metadata=field_options(alias="openWindowDetection"), default=None
180+
)
181+
report_available: bool = field(
182+
metadata=field_options(alias="reportAvailable"), default=False
183+
)
184+
show_schedule_setup: bool = field(
185+
metadata=field_options(alias="showScheduleSetup"), default=False
186+
)
187+
supports_dazzle: bool = field(
188+
metadata=field_options(alias="supportsDazzle"), default=False
189+
)
190+
dazzle_enabled: bool = field(
191+
metadata=field_options(alias="dazzleEnabled"), default=False
181192
)
182193

183194

@@ -277,7 +288,77 @@ class Capabilities(DataClassORJSONMixin):
277288
"""Capabilities model represents the capabilities of a zone."""
278289

279290
type: str
280-
temperatures: Temperatures
291+
temperatures: Temperatures | None = None
292+
can_set_temperature: bool | None = field(
293+
metadata=field_options(alias="canSetTemperature"), default=None
294+
)
295+
296+
# Air conditioning specifics
297+
auto: AutoAC | None = field(metadata=field_options(alias="AUTO"), default=None)
298+
cool: CoolAC | None = field(metadata=field_options(alias="COOL"), default=None)
299+
dry: DryAC | None = field(metadata=field_options(alias="DRY"), default=None)
300+
fan: FanAC | None = field(metadata=field_options(alias="FAN"), default=None)
301+
heat: HeatAC | None = field(metadata=field_options(alias="HEAT"), default=None)
302+
303+
304+
@dataclass
305+
class AutoAC(DataClassORJSONMixin):
306+
"""AutoAC model represents the auto AC capabilities of a zone."""
307+
308+
fan_speeds: list[str] | None = field(
309+
default=None, metadata=field_options(alias="fanSpeeds")
310+
)
311+
swing_modes: list[str] | None = field(
312+
default=None, metadata=field_options(alias="swings")
313+
)
314+
light: str | None = None
315+
316+
317+
@dataclass
318+
class CoolAC(DataClassORJSONMixin):
319+
"""CoolAC model represents the cool AC capabilities of a zone."""
320+
321+
fan_speeds: list[str] | None = field(
322+
default=None, metadata=field_options(alias="fanSpeeds")
323+
)
324+
swing_modes: list[str] | None = field(
325+
default=None, metadata=field_options(alias="swings")
326+
)
327+
temperatures: Temperatures | None = None
328+
329+
330+
@dataclass
331+
class DryAC(DataClassORJSONMixin):
332+
"""DryAC model represents the dry AC capabilities of a zone."""
333+
334+
swing_modes: list[str] | None = field(
335+
default=None, metadata=field_options(alias="swings")
336+
)
337+
338+
339+
@dataclass
340+
class FanAC(DataClassORJSONMixin):
341+
"""FanAC model represents the fan AC capabilities of a zone."""
342+
343+
fan_speeds: list[str] | None = field(
344+
default=None, metadata=field_options(alias="fanSpeeds")
345+
)
346+
swing_modes: list[str] | None = field(
347+
default=None, metadata=field_options(alias="swings")
348+
)
349+
350+
351+
@dataclass
352+
class HeatAC(DataClassORJSONMixin):
353+
"""HeatAC model represents the heat AC capabilities of a zone."""
354+
355+
fan_speeds: list[str] | None = field(
356+
default=None, metadata=field_options(alias="fanSpeeds")
357+
)
358+
swing_modes: list[str] | None = field(
359+
default=None, metadata=field_options(alias="swings")
360+
)
361+
temperatures: Temperatures | None = None
281362

282363

283364
@dataclass

src/tadoasync/tadoasync.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -250,12 +250,17 @@ async def get_zone_states(self) -> list[ZoneStates]:
250250
zone_id: ZoneState.from_dict(zone_state_dict)
251251
for zone_id, zone_state_dict in obj["zoneStates"].items()
252252
}
253+
254+
for zone_state in zone_states.values():
255+
await self.update_zone_data(zone_state)
256+
253257
return [ZoneStates(zone_states=zone_states)]
254258

255259
async def get_zone_state(self, zone_id: int) -> ZoneState:
256260
"""Get the zone state."""
257261
response = await self._request(f"homes/{self._home_id}/zones/{zone_id}/state")
258262
zone_state = ZoneState.from_json(response)
263+
259264
await self.update_zone_data(zone_state)
260265
return zone_state
261266

@@ -362,11 +367,15 @@ async def set_zone_overlay(
362367
)
363368

364369
async def get_device_info(
365-
self, serial_no: str, attribute: str
366-
) -> TemperatureOffset:
370+
self, serial_no: str, attribute: str | None = None
371+
) -> TemperatureOffset | Device:
367372
"""Get the device info."""
368-
response = await self._request(f"devices/{serial_no}/{attribute}")
369-
return TemperatureOffset.from_json(response)
373+
if attribute == "temperatureOffset":
374+
response = await self._request(f"devices/{serial_no}/{attribute}")
375+
return TemperatureOffset.from_json(response)
376+
377+
response = await self._request(f"devices/{serial_no}/")
378+
return Device.from_json(response)
370379

371380
async def set_child_lock(self, serial_no: str, child_lock: bool | None) -> None:
372381
"""Set the child lock."""
@@ -468,8 +477,7 @@ async def update_zone_data(self, data: ZoneState) -> None: # pylint: disable=to
468477

469478
data.current_fan_speed = None
470479
data.current_fan_level = None
471-
# If there is no overlay, the mode will always be
472-
# "SMART_SCHEDULE"
480+
# If there is no overlay, the mode will always be "SMART_SCHEDULE"
473481
data.current_hvac_mode = CONST_MODE_OFF
474482
data.current_swing_mode = CONST_MODE_OFF
475483
data.current_vertical_swing_mode = CONST_VERTICAL_SWING_OFF
@@ -518,6 +526,8 @@ async def update_zone_data(self, data: ZoneState) -> None: # pylint: disable=to
518526
else CONST_FAN_SPEED_OFF
519527
)
520528

529+
data.preparation = hasattr(data, "preparation") and data.preparation is not None
530+
521531
data.open_window_detected = (
522532
hasattr(data, "open_window_detected")
523533
and data.open_window_detected is not None
@@ -537,6 +547,9 @@ async def update_zone_data(self, data: ZoneState) -> None: # pylint: disable=to
537547
data.current_hvac_mode, CONST_HVAC_COOL
538548
)
539549

550+
# The overlay is active if the current mode is not smart schedule
551+
data.overlay_active = data.current_hvac_mode != CONST_MODE_SMART_SCHEDULE
552+
540553
if data.activity_data_points.heating_power is not None:
541554
# This needs to be validated if this is actually in!
542555
data.heating_power = data.heating_power = (

0 commit comments

Comments
 (0)