plugwise 1.6.3__py3-none-any.whl → 1.6.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- plugwise/__init__.py +89 -63
- plugwise/common.py +20 -13
- plugwise/constants.py +3 -4
- plugwise/data.py +44 -20
- plugwise/helper.py +174 -100
- plugwise/legacy/data.py +13 -0
- plugwise/legacy/helper.py +12 -13
- plugwise/legacy/smile.py +36 -17
- plugwise/smile.py +23 -12
- plugwise/util.py +5 -7
- {plugwise-1.6.3.dist-info → plugwise-1.6.4.dist-info}/METADATA +1 -1
- plugwise-1.6.4.dist-info/RECORD +17 -0
- plugwise-1.6.3.dist-info/RECORD +0 -17
- {plugwise-1.6.3.dist-info → plugwise-1.6.4.dist-info}/LICENSE +0 -0
- {plugwise-1.6.3.dist-info → plugwise-1.6.4.dist-info}/WHEEL +0 -0
- {plugwise-1.6.3.dist-info → plugwise-1.6.4.dist-info}/top_level.txt +0 -0
plugwise/smile.py
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
Plugwise backend module for Home Assistant Core.
|
4
4
|
"""
|
5
|
+
|
5
6
|
from __future__ import annotations
|
6
7
|
|
7
8
|
from collections.abc import Awaitable, Callable
|
@@ -94,7 +95,6 @@ class SmileAPI(SmileData):
|
|
94
95
|
self.smile_version = smile_version
|
95
96
|
SmileData.__init__(self)
|
96
97
|
|
97
|
-
|
98
98
|
async def full_xml_update(self) -> None:
|
99
99
|
"""Perform a first fetch of all XML data, needed for initialization."""
|
100
100
|
self._domain_objects = await self.request(DOMAIN_OBJECTS)
|
@@ -131,26 +131,30 @@ class SmileAPI(SmileData):
|
|
131
131
|
try:
|
132
132
|
await self.full_xml_update()
|
133
133
|
self.get_all_gateway_entities()
|
134
|
-
# Set self._cooling_enabled -required for set_temperature,
|
135
|
-
#also, check for a failed data-retrieval
|
134
|
+
# Set self._cooling_enabled - required for set_temperature,
|
135
|
+
# also, check for a failed data-retrieval
|
136
136
|
if "heater_id" in self.gw_data:
|
137
137
|
heat_cooler = self.gw_entities[self.gw_data["heater_id"]]
|
138
138
|
if (
|
139
139
|
"binary_sensors" in heat_cooler
|
140
140
|
and "cooling_enabled" in heat_cooler["binary_sensors"]
|
141
141
|
):
|
142
|
-
self._cooling_enabled = heat_cooler["binary_sensors"][
|
142
|
+
self._cooling_enabled = heat_cooler["binary_sensors"][
|
143
|
+
"cooling_enabled"
|
144
|
+
]
|
145
|
+
else: # cover failed data-retrieval for P1
|
146
|
+
_ = self.gw_entities[self.gateway_id]["location"]
|
143
147
|
except KeyError as err:
|
144
|
-
raise DataMissingError("No Plugwise data received") from err
|
148
|
+
raise DataMissingError("No Plugwise actual data received") from err
|
145
149
|
|
146
150
|
return PlugwiseData(
|
147
151
|
devices=self.gw_entities,
|
148
152
|
gateway=self.gw_data,
|
149
153
|
)
|
150
154
|
|
151
|
-
########################################################################################################
|
152
|
-
### API Set and HA Service-related Functions ###
|
153
|
-
########################################################################################################
|
155
|
+
########################################################################################################
|
156
|
+
### API Set and HA Service-related Functions ###
|
157
|
+
########################################################################################################
|
154
158
|
|
155
159
|
async def delete_notification(self) -> None:
|
156
160
|
"""Delete the active Plugwise Notification."""
|
@@ -222,7 +226,9 @@ class SmileAPI(SmileData):
|
|
222
226
|
|
223
227
|
await self.call_request(uri, method="put", data=data)
|
224
228
|
|
225
|
-
async def set_select(
|
229
|
+
async def set_select(
|
230
|
+
self, key: str, loc_id: str, option: str, state: str | None
|
231
|
+
) -> None:
|
226
232
|
"""Set a dhw/gateway/regulation mode or the thermostat schedule option."""
|
227
233
|
match key:
|
228
234
|
case "select_dhw_mode":
|
@@ -254,7 +260,12 @@ class SmileAPI(SmileData):
|
|
254
260
|
valid = ""
|
255
261
|
if mode == "away":
|
256
262
|
time_1 = self._domain_objects.find("./gateway/time").text
|
257
|
-
away_time =
|
263
|
+
away_time = (
|
264
|
+
dt.datetime.fromisoformat(time_1)
|
265
|
+
.astimezone(dt.UTC)
|
266
|
+
.isoformat(timespec="milliseconds")
|
267
|
+
.replace("+00:00", "Z")
|
268
|
+
)
|
258
269
|
valid = (
|
259
270
|
f"<valid_from>{away_time}</valid_from><valid_to>{end_time}</valid_to>"
|
260
271
|
)
|
@@ -448,8 +459,8 @@ class SmileAPI(SmileData):
|
|
448
459
|
|
449
460
|
if setpoint is None:
|
450
461
|
raise PlugwiseError(
|
451
|
-
|
452
|
-
|
462
|
+
"Plugwise: failed setting temperature: no valid input provided"
|
463
|
+
) # pragma: no cover"
|
453
464
|
|
454
465
|
temperature = str(setpoint)
|
455
466
|
uri = self._thermostat_uri(loc_id)
|
plugwise/util.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
"""Plugwise protocol helpers."""
|
2
|
+
|
2
3
|
from __future__ import annotations
|
3
4
|
|
4
5
|
import datetime as dt
|
@@ -41,9 +42,7 @@ def check_alternative_location(loc: Munch, legacy: bool) -> Munch:
|
|
41
42
|
loc.found = False
|
42
43
|
return loc
|
43
44
|
|
44
|
-
loc.locator =
|
45
|
-
f'./{loc.log_type}[type="{loc.measurement}"]/period/measurement'
|
46
|
-
)
|
45
|
+
loc.locator = f'./{loc.log_type}[type="{loc.measurement}"]/period/measurement'
|
47
46
|
if legacy:
|
48
47
|
loc.locator = (
|
49
48
|
f"./{loc.meas_list[0]}_{loc.log_type}/"
|
@@ -67,11 +66,11 @@ def in_alternative_location(loc: Munch, legacy: bool) -> bool:
|
|
67
66
|
"""
|
68
67
|
present = "log" in loc.log_type and (
|
69
68
|
"gas" in loc.measurement or "phase" in loc.measurement
|
70
|
-
|
69
|
+
)
|
71
70
|
if legacy:
|
72
71
|
present = "meter" in loc.log_type and (
|
73
72
|
"point" in loc.log_type or "gas" in loc.measurement
|
74
|
-
|
73
|
+
)
|
75
74
|
|
76
75
|
return present
|
77
76
|
|
@@ -222,8 +221,7 @@ def skip_obsolete_measurements(xml: etree, measurement: str) -> bool:
|
|
222
221
|
locator = f".//logs/point_log[type='{measurement}']/updated_date"
|
223
222
|
if (
|
224
223
|
measurement in OBSOLETE_MEASUREMENTS
|
225
|
-
and (updated_date_key := xml.find(locator))
|
226
|
-
is not None
|
224
|
+
and (updated_date_key := xml.find(locator)) is not None
|
227
225
|
):
|
228
226
|
updated_date = updated_date_key.text.split("T")[0]
|
229
227
|
date_1 = dt.datetime.strptime(updated_date, "%Y-%m-%d")
|
@@ -0,0 +1,17 @@
|
|
1
|
+
plugwise/__init__.py,sha256=-c0b3nN7qFxCzr1VPmRHIJVuueRzOhGlQYFJfwzxmlM,17756
|
2
|
+
plugwise/common.py,sha256=0A4o5ae3HfUKC3NO6NYiXbEWJgGZgGtc0VvDoVRiqtY,13075
|
3
|
+
plugwise/constants.py,sha256=kDMrVqHnwfVmW3P-Qe16WJxzFvHadAUW2teCWTHAEEU,17245
|
4
|
+
plugwise/data.py,sha256=mrNnY5gvsBB3MVuQUEqq24i9XUTPthHM6f9FW4dFxlY,12907
|
5
|
+
plugwise/exceptions.py,sha256=Ce-tO9uNsMB-8FP6VAxBvsHNJ-NIM9F0onUZOdZI4Ys,1110
|
6
|
+
plugwise/helper.py,sha256=YUOBHUdQbIkUa4mK5IMf6YY5QYu0AhF2corW6fCv-Hs,47111
|
7
|
+
plugwise/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
8
|
+
plugwise/smile.py,sha256=ksyjj2VNEKFxIfK7Tr_NEb-fnyXIwMfz7wFdEosBXgI,19335
|
9
|
+
plugwise/util.py,sha256=YR_dLM1E1KZ6m0eVeQ7ZevrbfPvGzF6EOeC6rjTFktA,8015
|
10
|
+
plugwise/legacy/data.py,sha256=YzVhMYTGQJTUzTVMt8TugL2f3Q6YMCjW7-dF7rjb5n4,3612
|
11
|
+
plugwise/legacy/helper.py,sha256=KHbjcnptzeFMqUcQwg4_R24l6XgDKje6VRzUsWJIdSc,18168
|
12
|
+
plugwise/legacy/smile.py,sha256=5rDlDXltYkHMI3SiRbugSY5fwCfyw1ElBCc7YSyQt6A,11996
|
13
|
+
plugwise-1.6.4.dist-info/LICENSE,sha256=mL22BjmXtg_wnoDnnaqps5_Bg_VGj_yHueX5lsKwbCc,1144
|
14
|
+
plugwise-1.6.4.dist-info/METADATA,sha256=DBAkkLJvhgzpDQwwUmu-lfv91x0g9nLqKjCJMxYMCM0,9148
|
15
|
+
plugwise-1.6.4.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
16
|
+
plugwise-1.6.4.dist-info/top_level.txt,sha256=MYOmktMFf8ZmX6_OE1y9MoCZFfY-L8DA0F2tA2IvE4s,9
|
17
|
+
plugwise-1.6.4.dist-info/RECORD,,
|
plugwise-1.6.3.dist-info/RECORD
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
plugwise/__init__.py,sha256=GzkiJTPI0vFUIjGcIlvL_KS1lIHad_cOIKzCXwY3Eaw,17183
|
2
|
-
plugwise/common.py,sha256=vyiAbn5SJgcL5A9DYIj2ixHBbPO_6EFa16bK1VJ3In4,13040
|
3
|
-
plugwise/constants.py,sha256=yTR9uxFyWi0S5-KDtUGbtMI3eb2dGC3ekMxvL8X0qEY,17203
|
4
|
-
plugwise/data.py,sha256=kFdmCW9UEX7mqdBoGWH6TCiwb7vzdm-es5ZMwJsdBQA,12095
|
5
|
-
plugwise/exceptions.py,sha256=Ce-tO9uNsMB-8FP6VAxBvsHNJ-NIM9F0onUZOdZI4Ys,1110
|
6
|
-
plugwise/helper.py,sha256=v0sli2AE1s3ax0aAZoZw3Gmu7N9gImAol7S4l8FcuRY,45790
|
7
|
-
plugwise/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
8
|
-
plugwise/smile.py,sha256=fyKo60PtOnW8bK3WpIu26R0mnXmHmsdjokTjVNS0j4A,19057
|
9
|
-
plugwise/util.py,sha256=kt7JNcrTQaLT3eW_fzO4YmGsZzRull2Ge_OmHKl-rHk,8054
|
10
|
-
plugwise/legacy/data.py,sha256=wHNcRQ_qF4A1rUdxn-1MoW1Z1gUwLqOvYvIkN6tJ_sk,3088
|
11
|
-
plugwise/legacy/helper.py,sha256=ARIJytJNFiIR5G7Bp75DIULqgt56m0pxUXy6Ze8Te-4,18173
|
12
|
-
plugwise/legacy/smile.py,sha256=RCQ0kHQwmPjq_G3r6aCe75RIvJt339jilzqEKydNopo,11286
|
13
|
-
plugwise-1.6.3.dist-info/LICENSE,sha256=mL22BjmXtg_wnoDnnaqps5_Bg_VGj_yHueX5lsKwbCc,1144
|
14
|
-
plugwise-1.6.3.dist-info/METADATA,sha256=OHR2k69qRTnfT8bl5jFpVRMiDDsnY7VCUgARvRKemCc,9148
|
15
|
-
plugwise-1.6.3.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
16
|
-
plugwise-1.6.3.dist-info/top_level.txt,sha256=MYOmktMFf8ZmX6_OE1y9MoCZFfY-L8DA0F2tA2IvE4s,9
|
17
|
-
plugwise-1.6.3.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|