99class BaseClass :
1010 """Plugwise Base Gateway data class."""
1111
12- available : bool | None
12+ available : bool | None # not for gateway, should always be available
1313 dev_class : str
1414 firmware : str
1515 hardware : str | None
1616 location : str
17- mac_address : str
17+ mac_address : str
1818 model : str
1919 model_id : str | None
2020 name : str
2121 vendor : str
2222
2323
2424@dataclass
25- class SmileP1Gateway (BaseClass ):
26- """Plugwise Smile P1 Gateway data class."""
27-
28- binary_sensors : GatewayBinarySensors # Not for legacy?
29-
30-
31- @dataclass
32- class StretchGateway (BaseClass ):
33- """Plugwise Stretch Gateway data class."""
25+ class AdamGateway (BaseClass ):
26+ """Plugwise Adam HA Gateway data class."""
3427
28+ binary_sensors : GatewayBinarySensors
29+ gateway_modes : list [str ]
30+ regulation_modes : list [str ]
31+ select_gateway_mode : str
32+ select_regulation_mode : str
33+ sensors : Weather
3534 zigbee_mac_address : str
3635
3736
3837@dataclass
3938class SmileTGateway (BaseClass ):
4039 """Plugwise Anna Smile-T Gateway data class."""
4140
42- binary_sensors : GatewayBinarySensors | HeaterCentralBinarySensors # Not for legacy?
43- sensors : GatewaySensors
41+ binary_sensors : GatewayBinarySensors
42+ sensors : Weather
4443
4544
4645@dataclass
47- class GatewayBinarySensors :
48- """Gateway binary_sensors class."""
46+ class SmileTLegacyGateway ( BaseClass ) :
47+ """Plugwise legacy Anna Smile-T Gateway data class."""
4948
50- plugwise_notification : bool # None for some?
49+ sensors : Weather
5150
5251
5352@dataclass
54- class GatewaySensors :
55- """Gateway sensors class."""
53+ class SmileP1Gateway ( BaseClass ) :
54+ """Plugwise Smile P1 Gateway data class."""
5655
57- outdoor_temperature : float | None # None when not enabled?
56+ binary_sensors : GatewayBinarySensors
5857
5958
6059@dataclass
61- class AdamGateway (BaseClass ):
62- """Plugwise Adam HA Gateway data class."""
60+ class SmileP1LegacyGateway (BaseClass ):
61+ """Plugwise legacy Smile P1 Gateway data class."""
62+
63+
64+ @dataclass
65+ class StretchGateway (BaseClass ):
66+ """Plugwise Stretch Gateway data class."""
6367
64- binary_sensors : GatewayBinarySensors | HeaterCentralBinarySensors # Not for legacy?
65- gateway_modes : list [str ]
66- regulation_modes : list [str ]
67- select_gateway_mode : str
68- select_regulation_mode : str
69- sensors : GatewaySensors
7068 zigbee_mac_address : str
7169
7270
71+ @dataclass
72+ class GatewayBinarySensors :
73+ """Gateway binary_sensors class."""
74+
75+ plugwise_notification : bool
76+
77+
78+ @dataclass
79+ class Weather :
80+ """Gateway weather sensor class."""
81+
82+ outdoor_temperature : float | None # None when not available
83+
84+
7385@dataclass
7486class SmartEnergyMeter (BaseClass ):
7587 """DSMR Energy Meter data class."""
7688
7789 sensors : SmartEnergySensors
78-
90+ SmartEnergyMeterSmartEnergyMeter
7991
8092@dataclass
8193class SmartEnergySensors :
@@ -255,26 +267,43 @@ class ThermostatsDict:
255267
256268
257269@dataclass
258- class OnOffTherm (BaseClass ):
259- """On-off heater/cooler device class."""
270+ class OnOff (BaseClass ):
271+ """On-off climate device class."""
260272
261- binary_sensors : GatewayBinarySensors | HeaterCentralBinarySensors
273+ binary_sensors : OnOffBinarySensors
274+ sensors : OnOffSensors
275+
276+
277+ @dataclass
278+ class OpOffBinarySensors :
279+ """OpenTherm binary_sensors class."""
280+
281+ heating_state : bool
282+
283+
284+ @dataclass
285+ class OnOffSensors :
286+ """Heater-central sensors class."""
287+
288+ intended_boiler_temperature : float | None
289+ modulation_level : float | None
290+ water_temperature : float
262291
263292
264293@dataclass
265294class OpenTherm (BaseClass ):
266- """OpenTherm heater/cooler device class."""
295+ """OpenTherm climate device class."""
267296
268- binary_sensors : GatewayBinarySensors | HeaterCentralBinarySensors
297+ binary_sensors : OpenThermBinarySensors
269298 maximum_boiler_temperature : SetpointDict | None
270299 max_dhw_temperature : SetpointDict | None
271- sensors : HeaterCentralSensors
272- switches : HeaterCentralSwitches | PlugSwitches
300+ sensors : OpenThermSensors
301+ switches : OpenThermSwitches
273302
274303
275304@dataclass
276- class HeaterCentralBinarySensors :
277- """Heater-central binary_sensors class."""
305+ class OpenThermBinarySensors :
306+ """OpenTherm binary_sensors class."""
278307
279308 compressor_state : bool | None
280309 cooling_enabled : bool | None
@@ -286,8 +315,8 @@ class HeaterCentralBinarySensors:
286315
287316
288317@dataclass
289- class HeaterCentralSensors :
290- """Heater-central sensors class."""
318+ class OpenThermSensors :
319+ """OpenTherm sensors class."""
291320
292321 dhw_temperature : float | None
293322 domestic_hot_water_setpoint : float | None
@@ -300,8 +329,8 @@ class HeaterCentralSensors:
300329
301330
302331@dataclass
303- class HeaterCentralSwitches :
304- """Heater-central switches class."""
332+ class OpenThermSwitches :
333+ """OpenTherm switches class."""
305334
306335 cooling_ena_switch : bool | None
307336 dhw_cm_switch : bool
@@ -335,50 +364,109 @@ class PlugSwitches:
335364
336365##################################################
337366class PlugwiseData
338- """
339- Overview of existing options:
340-
341- - Gateway Adam
342- - Climate device
343- - OnOff
344- - Opentherm
345- - Zones (1 to many) with thermostatic and energy sensors summary, with thermostat setpoint- and mode-, preset- & schedule-setter
346- - Location (Home) with weather data - only outdoor_temp used
347- - Single devices (appliances) assigned to a Zone, or not
348- - Anna (wired thermostat)
349- - Lisa (ZigBee thermostat)
350- - Jip (ZigBee thermostat)
351- - Tom/Floor (ZigBee valve/thermostat)
352- - Plug (energy switch/meter)
353- - Aqara Plug (energy switch/meter)
354- - Noname switch (energy switch)
355-
356- - Gateway SmileT
357- - Climate device
358- - OnOff
359- - OpenTherm
360- - Zone (Living room) with with thermostatic and energy sensors summary, with thermostat setpoint- and mode-, preset- & schedule-setter
361- - Location (Home) with weather data - only outdoor_temp used
362- - Single devices (appliances)
367+ """
368+ Overview of existing options:
369+
370+ - Gateway Adam
371+ - Climate device
372+ - OnOff
373+ - Opentherm
374+ - Zones (1 to many) with thermostatic and energy sensors summary, with thermostat setpoint- and mode-, preset- & schedule-setter
375+ - Location (Home) with weather data - only outdoor_temp used
376+ - Single devices (appliances) assigned to a Zone, or not
377+ - Anna (wired thermostat)
378+ - Lisa (ZigBee thermostat)
379+ - Jip (ZigBee thermostat)
380+ - Tom/Floor (ZigBee valve/thermostat)
381+ - Plug (energy switch/meter)
382+ - Aqara Plug (energy switch/meter)
383+ - Noname switch (energy switch)
384+
385+ - Gateway SmileT
386+ - Climate device
387+ - OnOff
388+ - OpenTherm
389+ - Zone (Living room) with with thermostatic and energy sensors summary, with thermostat setpoint- and mode-, preset- & schedule-setter
390+ - Location (Home) with weather data - only outdoor_temp used
391+ - Single devices (appliances)
392+ - Anna (wired thermostat)
393+ - P1-DSMR device (new Anna P1) (?)
394+
395+ - Gateway SmileT legacy
396+ - OnOff/OpenTherm device
363397 - Anna (wired thermostat)
364- - P1-DSMR device (new Anna P1) (?)
365-
366- - Gateway SmileT legacy
367- - OnOff/OpenTherm device
368- - Anna (wired thermostat)
369- - Location (Home) with weather data (optional?) - only outdoor_temp used
398+ - Location (Home) with weather data (optional?) - only outdoor_temp used
370399
371- - Gateway P1
372- - P1-DSMR device (in Home location)
400+ - Gateway P1
401+ - P1-DSMR device (in Home location)
373402
374- - Gateway P1 legacy
375- - P1-DSMR device (in modules)
403+ - Gateway P1 legacy
404+ - P1-DSMR device (in modules)
376405
377- - Gateway Stretch (legacy)
378- - Single devices (Zigbee)
379- - ??
406+ - Gateway Stretch (legacy)
407+ - Single devices (Zigbee)
408+ - ??
409+ """
380410
381- """
411+ adam : AdamGateway ()
412+ smile_t : SmileTGateway ()
413+ smile_t_legacy : SmileTLegacyGateway ()
414+ # smile_t_p1: AnnaP1Gateway() # double?
415+ smile_p1 : SmileP1Gateway ()
416+ smile_p1_legacy : SmileP1LegacyGateway ()
417+ stretch : StretchGateway
418+ onoff : OnOff ()
419+ opentherm : OpenTherm ()
420+ zones : list [Zone ()]
421+ weather : Weather ()
422+ anna : Anna ()
423+ anna_legacy : AnnaLegacy ()
424+ anna_adam : AnnaAdam ()
425+ lisa : Lisa ()
426+ jip : Jip ()
427+ tom_floor : TomFloor ()
428+ plug : Plug ()
429+ plug_legacy : PlugLegacy ()
430+ aqara_plug : AqaraPlug ()
431+ misc_plug : MiscPlug ()
432+ p1_dsmr : P1_DSMR ()
433+
434+ def update_from_dict (self , data : dict [str , Any ]) -> PlugwiseData :
435+ """Update the status object with data received from the Plugwise API."""
436+ if "adam" in data :
437+ self .adam .update_from_dict (data ["adam" ])
438+ if "smile_t" in data :
439+ self .smile_t .update_from_dict (data ["smile_t" ])
440+ # if "smile_t_p1" in data:
441+ # self.smile_t_p1.update_from_dict(data["smile_t_p1"])
442+ if "smile_p1" in data :
443+ self .smile_p1 .update_from_dict (data ["smile_p1" ])
444+ if "stretch" in data :
445+ self .stretch .update_from_dict (data ["stretch" ])
446+ if "onoff" in data :
447+ self .onoff .update_from_dict (data ["onoff" ])
448+ if "opentherm" in data :
449+ self .opentherm .update_from_dict (data ["opentherm" ])
450+ if "zones" in data :
451+ self .zones .update_from_dict (data ["zones" ])
452+ if "anna" in data :
453+ self .anna .update_from_dict (data ["anna" ])
454+ if "anna_adam" in data :
455+ self .anna_adam .update_from_dict (data ["anna_adam" ])
456+ if "lisa" in data :
457+ self .lisa .update_from_dict (data ["lisa" ])
458+ if "jip" in data :
459+ self .zones .update_from_dict (data ["jip" ])
460+ if "tom_floor" in data :
461+ self .tom_floor .update_from_dict (data ["tom_floor" ])
462+ if "plug" in data :
463+ self .plug .update_from_dict (data ["plug" ])
464+ if "aqara_plug" in data :
465+ self .opentherm .update_from_dict (data ["aqara_plug" ])
466+ if "misc_plug" in data :
467+ self .misc_plug .update_from_dict (data ["misc_plug" ])
468+ if "p1_dsmr" in data :
469+ self .p1_dsmr .update_from_dict (data ["p1_dsmr" ])
382470##################################################
383471
384472# class PlugwiseP1:
0 commit comments