Skip to content

Commit 154a100

Browse files
committed
Introduce Smile properties
1 parent d88c179 commit 154a100

File tree

7 files changed

+49
-48
lines changed

7 files changed

+49
-48
lines changed

plugwise/__init__.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
SMILES,
1818
STATUS,
1919
SYSTEM,
20+
GatewayData,
2021
PlugwiseData,
2122
ThermoLoc,
2223
)
@@ -73,7 +74,7 @@ def __init__(
7374
self._smile_api: SmileAPI | SmileLegacyAPI
7475
self._stretch_v2 = False
7576
self._target_smile: str = NONE
76-
self.gateway_id: str = NONE
77+
self.gw_data: GatewayData = {}
7778
self.smile_fw_version: Version | None = None
7879
self.smile_hostname: str = NONE
7980
self.smile_hw_version: str | None = None
@@ -86,6 +87,16 @@ def __init__(
8687
self.smile_version: Version | None = None
8788
self.smile_zigbee_mac_address: str | None = None
8889

90+
@property
91+
def gateway_id(self) -> str:
92+
"""Return the Smile gateway-id."""
93+
return self.gw_data["gateway_id"]
94+
95+
@property
96+
def heater_id(self) -> str:
97+
"""Return the Smile heater-id."""
98+
return self.gw_data["heater_id"]
99+
89100
async def connect(self) -> Version | None:
90101
"""Connect to the Plugwise Gateway and determine its name, type, version, and other data."""
91102
result = await self._request(DOMAIN_OBJECTS)
@@ -133,7 +144,7 @@ async def connect(self) -> Version | None:
133144
self._on_off_device,
134145
self._opentherm_device,
135146
self._schedule_old_states,
136-
self.gateway_id,
147+
self.gw_data,
137148
self.smile_fw_version,
138149
self.smile_hostname,
139150
self.smile_hw_version,
@@ -153,6 +164,7 @@ async def connect(self) -> Version | None:
153164
self._opentherm_device,
154165
self._stretch_v2,
155166
self._target_smile,
167+
self.gw_data,
156168
self.smile_fw_version,
157169
self.smile_hostname,
158170
self.smile_hw_version,
@@ -306,7 +318,6 @@ async def async_update(self) -> PlugwiseData:
306318
data = PlugwiseData(devices={}, gateway={})
307319
try:
308320
data = await self._smile_api.async_update()
309-
self.gateway_id = data.gateway["gateway_id"]
310321
except (DataMissingError, KeyError) as err:
311322
raise PlugwiseError("No Plugwise data received") from err
312323

plugwise/data.py

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
NONE,
1616
OFF,
1717
ActuatorData,
18+
GatewayData,
1819
GwEntityData,
1920
)
2021
from plugwise.helper import SmileHelper
@@ -26,6 +27,7 @@ class SmileData(SmileHelper):
2627

2728
def __init__(self) -> None:
2829
"""Init."""
30+
self.gw_data: GatewayData
2931
SmileHelper.__init__(self)
3032

3133
def _all_entity_data(self) -> None:
@@ -38,19 +40,14 @@ def _all_entity_data(self) -> None:
3840
self._update_zones()
3941
self.gw_entities.update(self._zones)
4042

41-
self.gw_data.update(
42-
{
43-
"gateway_id": self.gateway_id,
44-
"item_count": self._count,
45-
"notifications": self._notifications,
46-
"reboot": True,
47-
"smile_name": self.smile_name,
48-
}
49-
)
43+
self.gw_data["gateway_id"] = self._gateway_id
44+
self.gw_data["item_count"] = self._count
45+
self.gw_data["notifications"] = self._notifications
46+
self.gw_data["reboot"] = True
47+
self.gw_data["smile_name"] = self.smile_name
5048
if self._is_thermostat:
51-
self.gw_data.update(
52-
{"heater_id": self._heater_id, "cooling_present": self._cooling_present}
53-
)
49+
self.gw_data["heater_id"] = self._heater_id
50+
self.gw_data["cooling_present"] = self._cooling_present
5451

5552
def _update_zones(self) -> None:
5653
"""Helper-function for _all_entity_data() and async_update().
@@ -69,7 +66,7 @@ def _update_gw_entities(self) -> None:
6966
mac_list: list[str] = []
7067
for entity_id, entity in self.gw_entities.items():
7168
data = self._get_entity_data(entity_id)
72-
if entity_id == self.gateway_id:
69+
if entity_id == self._gateway_id:
7370
mac_list = self._detect_low_batteries()
7471
self._add_or_update_notifications(entity_id, entity, data)
7572

@@ -123,7 +120,7 @@ def _add_or_update_notifications(
123120
) -> None:
124121
"""Helper-function adding or updating the Plugwise notifications."""
125122
if (
126-
entity_id == self.gateway_id
123+
entity_id == self._gateway_id
127124
and (self._is_thermostat or self.smile_type == "power")
128125
) or (
129126
"binary_sensors" in entity
@@ -305,7 +302,7 @@ def _climate_data(
305302

306303
def check_reg_mode(self, mode: str) -> bool:
307304
"""Helper-function for device_data_climate()."""
308-
gateway = self.gw_entities[self.gateway_id]
305+
gateway = self.gw_entities[self._gateway_id]
309306
return (
310307
"regulation_modes" in gateway and gateway["select_regulation_mode"] == mode
311308
)

plugwise/helper.py

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
ActuatorData,
3838
ActuatorDataType,
3939
ActuatorType,
40-
GatewayData,
4140
GwEntityData,
4241
SensorType,
4342
ThermoLoc,
@@ -78,8 +77,8 @@ def __init__(self) -> None:
7877
self._domain_objects: etree
7978
self._endpoint: str
8079
self._elga: bool
80+
self._gateway_id: str
8181
self._gw_allowed_modes: list[str] = []
82-
self._heater_id: str
8382
self._home_loc_id: str
8483
self._home_location: etree
8584
self._is_thermostat: bool
@@ -110,8 +109,6 @@ def __init__(self) -> None:
110109
self._cooling_active = False
111110
self._cooling_enabled = False
112111

113-
self.gateway_id: str
114-
self.gw_data: GatewayData = {}
115112
self.gw_entities: dict[str, GwEntityData] = {}
116113
self.smile_fw_version: version.Version | None
117114
self.smile_hw_version: str | None
@@ -203,7 +200,7 @@ def _get_p1_smartmeter_info(self) -> None:
203200
LOGGER.error("No module data found for SmartMeter") # pragma: no cover
204201
return # pragma: no cover
205202
appl.available = None
206-
appl.entity_id = self.gateway_id
203+
appl.entity_id = self._gateway_id
207204
appl.firmware = module_data["firmware_version"]
208205
appl.hardware = module_data["hardware_version"]
209206
appl.location = self._home_loc_id
@@ -216,8 +213,8 @@ def _get_p1_smartmeter_info(self) -> None:
216213
appl.zigbee_mac = None
217214

218215
# Replace the entity_id of the gateway by the smartmeter location_id
219-
self.gw_entities[self._home_loc_id] = self.gw_entities.pop(self.gateway_id)
220-
self.gateway_id = self._home_loc_id
216+
self.gw_entities[self._home_loc_id] = self.gw_entities.pop(self._gateway_id)
217+
self._gateway_id = self._home_loc_id
221218

222219
self._create_gw_entities(appl)
223220

@@ -290,7 +287,7 @@ def _appliance_info_finder(self, appl: Munch, appliance: etree) -> Munch:
290287

291288
def _appl_gateway_info(self, appl: Munch, appliance: etree) -> Munch:
292289
"""Helper-function for _appliance_info_finder()."""
293-
self.gateway_id = appliance.attrib["id"]
290+
self._gateway_id = appliance.attrib["id"]
294291
appl.firmware = str(self.smile_fw_version)
295292
appl.hardware = self.smile_hw_version
296293
appl.mac = self.smile_mac_address
@@ -568,7 +565,7 @@ def _get_actuator_mode(
568565
569566
Collect the requested gateway mode.
570567
"""
571-
if not (self.smile(ADAM) and entity_id == self.gateway_id):
568+
if not (self.smile(ADAM) and entity_id == self._gateway_id):
572569
return None
573570

574571
if (search := search_actuator_functionalities(appliance, key)) is not None:
@@ -609,7 +606,7 @@ def _get_gateway_mode(
609606

610607
def _get_gateway_outdoor_temp(self, entity_id: str, data: GwEntityData) -> None:
611608
"""Adam & Anna: the Smile outdoor_temperature is present in the Home location."""
612-
if self._is_thermostat and entity_id == self.gateway_id:
609+
if self._is_thermostat and entity_id == self._gateway_id:
613610
locator = "./logs/point_log[type='outdoor_temperature']/period/measurement"
614611
if (found := self._home_location.find(locator)) is not None:
615612
value = format_measure(found.text, NONE)

plugwise/legacy/data.py

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
# Dict as class
99
# Version detection
10-
from plugwise.constants import NONE, OFF, GwEntityData
10+
from plugwise.constants import NONE, OFF, GatewayData, GwEntityData
1111
from plugwise.legacy.helper import SmileLegacyHelper
1212
from plugwise.util import remove_empty_platform_dicts
1313

@@ -17,6 +17,7 @@ class SmileLegacyData(SmileLegacyHelper):
1717

1818
def __init__(self) -> None:
1919
"""Init."""
20+
self.gw_data: GatewayData
2021
SmileLegacyHelper.__init__(self)
2122

2223
def _all_entity_data(self) -> None:
@@ -25,17 +26,12 @@ def _all_entity_data(self) -> None:
2526
Collect data for each entity and add to self.gw_data and self.gw_entities.
2627
"""
2728
self._update_gw_entities()
28-
self.gw_data.update(
29-
{
30-
"gateway_id": self.gateway_id,
31-
"item_count": self._count,
32-
"smile_name": self.smile_name,
33-
}
34-
)
29+
self.gw_data["gateway_id"] = self.gateway_id
30+
self.gw_data["item_count"] = self._count
31+
self.gw_data["smile_name"] = self.smile_name
3532
if self._is_thermostat:
36-
self.gw_data.update(
37-
{"heater_id": self._heater_id, "cooling_present": False}
38-
)
33+
self.gw_data["heater_id"] = self._heater_id
34+
self.gw_data["cooling_present"] = False
3935

4036
def _update_gw_entities(self) -> None:
4137
"""Helper-function for _all_entity_data() and async_update().

plugwise/legacy/helper.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
ActuatorDataType,
3131
ActuatorType,
3232
ApplianceType,
33-
GatewayData,
3433
GwEntityData,
3534
SensorType,
3635
ThermoLoc,
@@ -81,7 +80,6 @@ def __init__(self) -> None:
8180
self._system: etree
8281

8382
self.gateway_id: str
84-
self.gw_data: GatewayData = {}
8583
self.gw_entities: dict[str, GwEntityData] = {}
8684
self.smile_fw_version: Version | None
8785
self.smile_hw_version: str | None

plugwise/legacy/smile.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ def __init__(
4444
_opentherm_device: bool,
4545
_stretch_v2: bool,
4646
_target_smile: str,
47+
gw_data: GatewayData,
4748
smile_fw_version: Version | None,
4849
smile_hostname: str,
4950
smile_hw_version: str | None,
@@ -61,6 +62,7 @@ def __init__(
6162
self._opentherm_device = _opentherm_device
6263
self._stretch_v2 = _stretch_v2
6364
self._target_smile = _target_smile
65+
self.gw_data = gw_data
6466
self.request = request
6567
self.smile_fw_version = smile_fw_version
6668
self.smile_hostname = smile_hostname
@@ -109,7 +111,6 @@ async def async_update(self) -> PlugwiseData:
109111
LOGGER.info(
110112
"Performing daily full-update, reload the Plugwise integration when a single entity becomes unavailable."
111113
)
112-
self.gw_data: GatewayData = {}
113114
self.gw_entities: dict[str, GwEntityData] = {}
114115
try:
115116
await self.full_xml_update()

plugwise/smile.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
LOCATIONS,
1919
MAX_SETPOINT,
2020
MIN_SETPOINT,
21+
NONE,
2122
NOTIFICATIONS,
2223
OFF,
2324
RULES,
@@ -52,7 +53,7 @@ def __init__(
5253
_on_off_device: bool,
5354
_opentherm_device: bool,
5455
_schedule_old_states: dict[str, dict[str, str]],
55-
gateway_id: str,
56+
gw_data: GatewayData,
5657
smile_fw_version: Version | None,
5758
smile_hostname: str | None,
5859
smile_hw_version: str | None,
@@ -67,14 +68,15 @@ def __init__(
6768
self._cooling_enabled = False
6869
self._cooling_present = _cooling_present
6970
self._elga = _elga
70-
self._heater_id: str
71+
self._gateway_id: str = NONE
72+
self._heater_id: str = NONE
7173
self._is_thermostat = _is_thermostat
7274
self._last_active = _last_active
7375
self._loc_data = _loc_data
7476
self._on_off_device = _on_off_device
7577
self._opentherm_device = _opentherm_device
7678
self._schedule_old_states = _schedule_old_states
77-
self.gateway_id = gateway_id
79+
self.gw_data = gw_data
7880
self.request = request
7981
self.smile_fw_version = smile_fw_version
8082
self.smile_hostname = smile_hostname
@@ -119,7 +121,6 @@ async def async_update(self) -> PlugwiseData:
119121
120122
Any change in the connected entities will be detected immediately.
121123
"""
122-
self.gw_data: GatewayData = {}
123124
self.gw_entities: dict[str, GwEntityData] = {}
124125
self._zones: dict[str, GwEntityData] = {}
125126
try:
@@ -137,7 +138,7 @@ async def async_update(self) -> PlugwiseData:
137138
"cooling_enabled"
138139
]
139140
else: # cover failed data-retrieval for P1
140-
_ = self.gw_entities[self.gateway_id]["location"]
141+
_ = self.gw_entities[self._gateway_id]["location"]
141142
except KeyError as err:
142143
raise DataMissingError("No Plugwise actual data received") from err
143144

@@ -268,7 +269,7 @@ async def set_gateway_mode(self, mode: str) -> None:
268269
vacation_time = time_2 + "T23:00:00.000Z"
269270
valid = f"<valid_from>{vacation_time}</valid_from><valid_to>{end_time}</valid_to>"
270271

271-
uri = f"{APPLIANCES};id={self.gateway_id}/gateway_mode_control"
272+
uri = f"{APPLIANCES};id={self._gateway_id}/gateway_mode_control"
272273
data = f"<gateway_mode_control_functionality><mode>{mode}</mode>{valid}</gateway_mode_control_functionality>"
273274

274275
await self.call_request(uri, method="put", data=data)

0 commit comments

Comments
 (0)