zwave-js-server-python 0.62.0__tar.gz → 0.64.0__tar.gz
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.
- {zwave_js_server_python-0.62.0/zwave_js_server_python.egg-info → zwave_js_server_python-0.64.0}/PKG-INFO +4 -3
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/pyproject.toml +2 -2
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/__init__.py +3 -3
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/firmware.py +8 -11
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/controller/__init__.py +7 -20
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/controller/event_model.py +0 -38
- zwave_js_server_python-0.62.0/zwave_js_server/model/driver.py → zwave_js_server_python-0.64.0/zwave_js_server/model/driver/__init__.py +75 -6
- {zwave_js_server_python-0.62.0/zwave_js_server/model/controller → zwave_js_server_python-0.64.0/zwave_js_server/model/driver}/firmware.py +23 -23
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/node/data_model.py +1 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0/zwave_js_server_python.egg-info}/PKG-INFO +4 -3
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server_python.egg-info/SOURCES.txt +2 -2
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/LICENSE +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/MANIFEST.in +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/README.md +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/setup.cfg +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/__init__.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/__main__.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/client.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/__init__.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/barrier_operator.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/basic.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/central_scene.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/color_switch.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/energy_production.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/entry_control.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/humidity_control.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/lock.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/meter.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/multilevel_sensor.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/multilevel_switch.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/notification.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/power_level.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/protection.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/scene_activation.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/sound_switch.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/thermostat.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/wake_up.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/window_covering.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/dump.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/event.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/exceptions.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/__init__.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/association.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/command_class.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/config_manager/__init__.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/controller/data_model.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/controller/inclusion_and_provisioning.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/controller/rebuild_routes.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/controller/statistics.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/device_class.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/device_config.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/duration.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/endpoint.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/log_config.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/log_message.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/node/__init__.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/node/event_model.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/node/firmware.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/node/health_check.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/node/statistics.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/notification.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/statistics.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/utils.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/value.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/version.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/py.typed +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/util/__init__.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/util/command_class/__init__.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/util/command_class/energy_production.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/util/command_class/meter.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/util/command_class/multilevel_sensor.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/util/helpers.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/util/lock.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/util/multicast.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/util/node.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/version.py +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server_python.egg-info/dependency_links.txt +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server_python.egg-info/entry_points.txt +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server_python.egg-info/requires.txt +0 -0
- {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server_python.egg-info/top_level.txt +0 -0
@@ -1,9 +1,9 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: zwave-js-server-python
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.64.0
|
4
4
|
Summary: Python wrapper for zwave-js-server
|
5
5
|
Author-email: Home Assistant Team <hello@home-assistant.io>
|
6
|
-
License: Apache-2.0
|
6
|
+
License-Expression: Apache-2.0
|
7
7
|
Project-URL: Source Code, https://github.com/home-assistant-libs/zwave-js-server-python
|
8
8
|
Project-URL: Bug Reports, https://github.com/home-assistant-libs/zwave-js-server-python/issues
|
9
9
|
Keywords: home,automation,zwave,zwave-js
|
@@ -19,6 +19,7 @@ Description-Content-Type: text/markdown
|
|
19
19
|
License-File: LICENSE
|
20
20
|
Requires-Dist: aiohttp>3
|
21
21
|
Requires-Dist: pydantic>=1.10.0
|
22
|
+
Dynamic: license-file
|
22
23
|
|
23
24
|
# zwave-js-server-python
|
24
25
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
[build-system]
|
2
|
-
requires = ["setuptools"]
|
2
|
+
requires = ["setuptools>=77.0"]
|
3
3
|
build-backend = "setuptools.build_meta"
|
4
4
|
|
5
5
|
[project]
|
@@ -8,7 +8,7 @@ authors = [{ name = "Home Assistant Team", email = "hello@home-assistant.io" }]
|
|
8
8
|
description = "Python wrapper for zwave-js-server"
|
9
9
|
readme = "README.md"
|
10
10
|
requires-python = ">=3.12"
|
11
|
-
license =
|
11
|
+
license = "Apache-2.0"
|
12
12
|
keywords = ["home", "automation", "zwave", "zwave-js"]
|
13
13
|
classifiers = [
|
14
14
|
"Development Status :: 4 - Beta",
|
{zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/__init__.py
RENAMED
@@ -8,12 +8,12 @@ import logging
|
|
8
8
|
from typing import TypedDict
|
9
9
|
|
10
10
|
PACKAGE_NAME = "zwave-js-server-python"
|
11
|
-
__version__ = "0.
|
11
|
+
__version__ = "0.64.0"
|
12
12
|
|
13
13
|
# minimal server schema version we can handle
|
14
|
-
MIN_SERVER_SCHEMA_VERSION =
|
14
|
+
MIN_SERVER_SCHEMA_VERSION = 41
|
15
15
|
# max server schema version we can handle (and our code is compatible with)
|
16
|
-
MAX_SERVER_SCHEMA_VERSION =
|
16
|
+
MAX_SERVER_SCHEMA_VERSION = 43
|
17
17
|
|
18
18
|
VALUE_UNKNOWN = "unknown"
|
19
19
|
|
@@ -7,10 +7,7 @@ import asyncio
|
|
7
7
|
import aiohttp
|
8
8
|
|
9
9
|
from .client import Client
|
10
|
-
from .model.
|
11
|
-
ControllerFirmwareUpdateData,
|
12
|
-
ControllerFirmwareUpdateResult,
|
13
|
-
)
|
10
|
+
from .model.driver.firmware import DriverFirmwareUpdateData, DriverFirmwareUpdateResult
|
14
11
|
from .model.node import Node
|
15
12
|
from .model.node.firmware import NodeFirmwareUpdateData, NodeFirmwareUpdateResult
|
16
13
|
|
@@ -45,16 +42,16 @@ async def update_firmware(
|
|
45
42
|
return NodeFirmwareUpdateResult(node, data["result"])
|
46
43
|
|
47
44
|
|
48
|
-
async def
|
45
|
+
async def driver_firmware_update_otw(
|
49
46
|
url: str,
|
50
|
-
firmware_file:
|
47
|
+
firmware_file: DriverFirmwareUpdateData,
|
51
48
|
session: aiohttp.ClientSession,
|
52
49
|
additional_user_agent_components: dict[str, str] | None = None,
|
53
|
-
) ->
|
50
|
+
) -> DriverFirmwareUpdateResult:
|
54
51
|
"""
|
55
|
-
Send firmwareUpdateOTW command to
|
52
|
+
Send firmwareUpdateOTW command to Driver.
|
56
53
|
|
57
|
-
Sending the wrong firmware to a
|
54
|
+
Sending the wrong firmware to a driver can brick it and make it unrecoverable.
|
58
55
|
Consumers of this library should build mechanisms to ensure that users understand
|
59
56
|
the risks.
|
60
57
|
"""
|
@@ -68,7 +65,7 @@ async def controller_firmware_update_otw(
|
|
68
65
|
|
69
66
|
data = await client.async_send_command(
|
70
67
|
{
|
71
|
-
"command": "
|
68
|
+
"command": "driver.firmware_update_otw",
|
72
69
|
**firmware_file.to_dict(),
|
73
70
|
},
|
74
71
|
require_schema=29,
|
@@ -77,4 +74,4 @@ async def controller_firmware_update_otw(
|
|
77
74
|
if not receive_task.done():
|
78
75
|
receive_task.cancel()
|
79
76
|
|
80
|
-
return
|
77
|
+
return DriverFirmwareUpdateResult(data["result"])
|
@@ -27,7 +27,6 @@ from ..node import Node
|
|
27
27
|
from ..node.firmware import NodeFirmwareUpdateResult
|
28
28
|
from .data_model import ControllerDataType
|
29
29
|
from .event_model import CONTROLLER_EVENT_MODEL_MAP
|
30
|
-
from .firmware import ControllerFirmwareUpdateProgress, ControllerFirmwareUpdateResult
|
31
30
|
from .inclusion_and_provisioning import (
|
32
31
|
InclusionGrant,
|
33
32
|
ProvisioningEntry,
|
@@ -80,7 +79,6 @@ class Controller(EventBase):
|
|
80
79
|
self._rebuild_routes_progress: dict[Node, RebuildRoutesStatus] | None = None
|
81
80
|
self._last_rebuild_routes_result: dict[Node, RebuildRoutesStatus] | None = None
|
82
81
|
self._statistics = ControllerStatistics(DEFAULT_CONTROLLER_STATISTICS)
|
83
|
-
self._firmware_update_progress: ControllerFirmwareUpdateProgress | None = None
|
84
82
|
for node_state in state["nodes"]:
|
85
83
|
node = Node(client, node_state)
|
86
84
|
self.nodes[node.node_id] = node
|
@@ -235,11 +233,6 @@ class Controller(EventBase):
|
|
235
233
|
return None
|
236
234
|
return RFRegion(rf_region)
|
237
235
|
|
238
|
-
@property
|
239
|
-
def firmware_update_progress(self) -> ControllerFirmwareUpdateProgress | None:
|
240
|
-
"""Return firmware update progress."""
|
241
|
-
return self._firmware_update_progress
|
242
|
-
|
243
236
|
@property
|
244
237
|
def status(self) -> ControllerStatus:
|
245
238
|
"""Return status."""
|
@@ -812,6 +805,13 @@ class Controller(EventBase):
|
|
812
805
|
)
|
813
806
|
return cast(bool, data["success"])
|
814
807
|
|
808
|
+
async def async_toggle_rf(self, enable: bool) -> bool:
|
809
|
+
"""Send toggleRF command to Controller."""
|
810
|
+
data = await self.client.async_send_command(
|
811
|
+
{"command": "controller.toggle_rf", "enable": enable}, require_schema=43
|
812
|
+
)
|
813
|
+
return cast(bool, data["success"])
|
814
|
+
|
815
815
|
async def async_get_known_lifeline_routes(
|
816
816
|
self,
|
817
817
|
) -> dict[Node, ControllerLifelineRoutes]:
|
@@ -902,19 +902,6 @@ class Controller(EventBase):
|
|
902
902
|
event.data["controller"] = self
|
903
903
|
self.emit(event.type, event.data)
|
904
904
|
|
905
|
-
def handle_firmware_update_progress(self, event: Event) -> None:
|
906
|
-
"""Process a firmware update progress event."""
|
907
|
-
self._firmware_update_progress = event.data["firmware_update_progress"] = (
|
908
|
-
ControllerFirmwareUpdateProgress(event.data["progress"])
|
909
|
-
)
|
910
|
-
|
911
|
-
def handle_firmware_update_finished(self, event: Event) -> None:
|
912
|
-
"""Process a firmware update finished event."""
|
913
|
-
self._firmware_update_progress = None
|
914
|
-
event.data["firmware_update_finished"] = ControllerFirmwareUpdateResult(
|
915
|
-
event.data["result"]
|
916
|
-
)
|
917
|
-
|
918
905
|
def handle_inclusion_failed(self, event: Event) -> None:
|
919
906
|
"""Process an inclusion failed event."""
|
920
907
|
|
@@ -7,10 +7,6 @@ from typing import Literal, TypedDict
|
|
7
7
|
from ...const import InclusionState, InclusionStrategy, RemoveNodeReason
|
8
8
|
from ...event import BaseEventModel
|
9
9
|
from ..node.data_model import FoundNodeDataType, NodeDataType
|
10
|
-
from .firmware import (
|
11
|
-
ControllerFirmwareUpdateProgressDataType,
|
12
|
-
ControllerFirmwareUpdateResultDataType,
|
13
|
-
)
|
14
10
|
from .inclusion_and_provisioning import InclusionGrantDataType
|
15
11
|
from .statistics import ControllerStatisticsDataType
|
16
12
|
|
@@ -46,38 +42,6 @@ class ExclusionStoppedEventModel(BaseControllerEventModel):
|
|
46
42
|
event: Literal["exclusion stopped"]
|
47
43
|
|
48
44
|
|
49
|
-
class FirmwareUpdateFinishedEventModel(BaseControllerEventModel):
|
50
|
-
"""Model for `firmware update finished` event data."""
|
51
|
-
|
52
|
-
event: Literal["firmware update finished"]
|
53
|
-
result: ControllerFirmwareUpdateResultDataType
|
54
|
-
|
55
|
-
@classmethod
|
56
|
-
def from_dict(cls, data: dict) -> FirmwareUpdateFinishedEventModel:
|
57
|
-
"""Initialize from dict."""
|
58
|
-
return cls(
|
59
|
-
source=data["source"],
|
60
|
-
event=data["event"],
|
61
|
-
result=data["result"],
|
62
|
-
)
|
63
|
-
|
64
|
-
|
65
|
-
class FirmwareUpdateProgressEventModel(BaseControllerEventModel):
|
66
|
-
"""Model for `firmware update progress` event data."""
|
67
|
-
|
68
|
-
event: Literal["firmware update progress"]
|
69
|
-
progress: ControllerFirmwareUpdateProgressDataType
|
70
|
-
|
71
|
-
@classmethod
|
72
|
-
def from_dict(cls, data: dict) -> FirmwareUpdateProgressEventModel:
|
73
|
-
"""Initialize from dict."""
|
74
|
-
return cls(
|
75
|
-
source=data["source"],
|
76
|
-
event=data["event"],
|
77
|
-
progress=data["progress"],
|
78
|
-
)
|
79
|
-
|
80
|
-
|
81
45
|
class GrantSecurityClassesEventModel(BaseControllerEventModel):
|
82
46
|
"""Model for `grant security classes` event data."""
|
83
47
|
|
@@ -343,8 +307,6 @@ CONTROLLER_EVENT_MODEL_MAP: dict[str, type[BaseControllerEventModel]] = {
|
|
343
307
|
"exclusion failed": ExclusionFailedEventModel,
|
344
308
|
"exclusion started": ExclusionStartedEventModel,
|
345
309
|
"exclusion stopped": ExclusionStoppedEventModel,
|
346
|
-
"firmware update finished": FirmwareUpdateFinishedEventModel,
|
347
|
-
"firmware update progress": FirmwareUpdateProgressEventModel,
|
348
310
|
"grant security classes": GrantSecurityClassesEventModel,
|
349
311
|
"rebuild routes done": RebuildRoutesDoneEventModel,
|
350
312
|
"rebuild routes progress": RebuildRoutesProgressEventModel,
|
@@ -4,11 +4,17 @@ from __future__ import annotations
|
|
4
4
|
|
5
5
|
from typing import TYPE_CHECKING, Any, Literal, cast
|
6
6
|
|
7
|
-
from
|
8
|
-
from
|
9
|
-
from
|
10
|
-
from
|
11
|
-
from
|
7
|
+
from ...event import BaseEventModel, Event, EventBase
|
8
|
+
from ..config_manager import ConfigManager
|
9
|
+
from ..controller import Controller
|
10
|
+
from ..log_config import LogConfig, LogConfigDataType
|
11
|
+
from ..log_message import LogMessage, LogMessageDataType
|
12
|
+
from .firmware import (
|
13
|
+
DriverFirmwareUpdateProgress,
|
14
|
+
DriverFirmwareUpdateProgressDataType,
|
15
|
+
DriverFirmwareUpdateResult,
|
16
|
+
DriverFirmwareUpdateResultDataType,
|
17
|
+
)
|
12
18
|
|
13
19
|
try:
|
14
20
|
from pydantic.v1 import create_model_from_typeddict
|
@@ -16,7 +22,7 @@ except ImportError:
|
|
16
22
|
from pydantic import create_model_from_typeddict
|
17
23
|
|
18
24
|
if TYPE_CHECKING:
|
19
|
-
from
|
25
|
+
from ...client import Client
|
20
26
|
|
21
27
|
|
22
28
|
class BaseDriverEventModel(BaseEventModel):
|
@@ -52,10 +58,51 @@ LoggingEventModel = create_model_from_typeddict(
|
|
52
58
|
)
|
53
59
|
|
54
60
|
|
61
|
+
class DriverReadyEventModel(BaseDriverEventModel):
|
62
|
+
"""Model for `driver ready` event data."""
|
63
|
+
|
64
|
+
event: Literal["driver ready"]
|
65
|
+
|
66
|
+
|
67
|
+
class FirmwareUpdateFinishedEventModel(BaseDriverEventModel):
|
68
|
+
"""Model for `firmware update finished` event data."""
|
69
|
+
|
70
|
+
event: Literal["firmware update finished"]
|
71
|
+
result: DriverFirmwareUpdateResultDataType
|
72
|
+
|
73
|
+
@classmethod
|
74
|
+
def from_dict(cls, data: dict) -> FirmwareUpdateFinishedEventModel:
|
75
|
+
"""Initialize from dict."""
|
76
|
+
return cls(
|
77
|
+
source=data["source"],
|
78
|
+
event=data["event"],
|
79
|
+
result=data["result"],
|
80
|
+
)
|
81
|
+
|
82
|
+
|
83
|
+
class FirmwareUpdateProgressEventModel(BaseDriverEventModel):
|
84
|
+
"""Model for `firmware update progress` event data."""
|
85
|
+
|
86
|
+
event: Literal["firmware update progress"]
|
87
|
+
progress: DriverFirmwareUpdateProgressDataType
|
88
|
+
|
89
|
+
@classmethod
|
90
|
+
def from_dict(cls, data: dict) -> FirmwareUpdateProgressEventModel:
|
91
|
+
"""Initialize from dict."""
|
92
|
+
return cls(
|
93
|
+
source=data["source"],
|
94
|
+
event=data["event"],
|
95
|
+
progress=data["progress"],
|
96
|
+
)
|
97
|
+
|
98
|
+
|
55
99
|
DRIVER_EVENT_MODEL_MAP: dict[str, type[BaseDriverEventModel]] = {
|
56
100
|
"all nodes ready": AllNodesReadyEventModel,
|
57
101
|
"log config updated": LogConfigUpdatedEventModel,
|
58
102
|
"logging": LoggingEventModel,
|
103
|
+
"driver ready": DriverReadyEventModel,
|
104
|
+
"firmware update finished": FirmwareUpdateFinishedEventModel,
|
105
|
+
"firmware update progress": FirmwareUpdateProgressEventModel,
|
59
106
|
}
|
60
107
|
|
61
108
|
|
@@ -81,6 +128,7 @@ class Driver(EventBase):
|
|
81
128
|
self.controller = Controller(client, state)
|
82
129
|
self.log_config = LogConfig.from_dict(log_config)
|
83
130
|
self.config_manager = ConfigManager(client)
|
131
|
+
self._firmware_update_progress: DriverFirmwareUpdateProgress | None = None
|
84
132
|
|
85
133
|
def __hash__(self) -> int:
|
86
134
|
"""Return the hash."""
|
@@ -92,6 +140,11 @@ class Driver(EventBase):
|
|
92
140
|
return False
|
93
141
|
return self.controller == other.controller
|
94
142
|
|
143
|
+
@property
|
144
|
+
def firmware_update_progress(self) -> DriverFirmwareUpdateProgress | None:
|
145
|
+
"""Return firmware update progress."""
|
146
|
+
return self._firmware_update_progress
|
147
|
+
|
95
148
|
def receive_event(self, event: Event) -> None:
|
96
149
|
"""Receive an event."""
|
97
150
|
if event.data["source"] != "driver":
|
@@ -200,3 +253,19 @@ class Driver(EventBase):
|
|
200
253
|
|
201
254
|
def handle_all_nodes_ready(self, event: Event) -> None:
|
202
255
|
"""Process a driver all nodes ready event."""
|
256
|
+
|
257
|
+
def handle_driver_ready(self, event: Event) -> None:
|
258
|
+
"""Process a driver ready event."""
|
259
|
+
|
260
|
+
def handle_firmware_update_progress(self, event: Event) -> None:
|
261
|
+
"""Process a firmware update progress event."""
|
262
|
+
self._firmware_update_progress = event.data["firmware_update_progress"] = (
|
263
|
+
DriverFirmwareUpdateProgress(event.data["progress"])
|
264
|
+
)
|
265
|
+
|
266
|
+
def handle_firmware_update_finished(self, event: Event) -> None:
|
267
|
+
"""Process a firmware update finished event."""
|
268
|
+
self._firmware_update_progress = None
|
269
|
+
event.data["firmware_update_finished"] = DriverFirmwareUpdateResult(
|
270
|
+
event.data["result"]
|
271
|
+
)
|
@@ -1,4 +1,4 @@
|
|
1
|
-
"""Provide a model for Z-Wave
|
1
|
+
"""Provide a model for Z-Wave driver firmware."""
|
2
2
|
|
3
3
|
from __future__ import annotations
|
4
4
|
|
@@ -9,8 +9,8 @@ from typing import TypedDict
|
|
9
9
|
from ...util.helpers import convert_bytes_to_base64
|
10
10
|
|
11
11
|
|
12
|
-
class
|
13
|
-
"""Represent a
|
12
|
+
class DriverFirmwareUpdateDataDataType(TypedDict, total=False):
|
13
|
+
"""Represent a driver firmware update data dict type."""
|
14
14
|
|
15
15
|
filename: str # required
|
16
16
|
file: str # required
|
@@ -18,16 +18,16 @@ class ControllerFirmwareUpdateDataDataType(TypedDict, total=False):
|
|
18
18
|
|
19
19
|
|
20
20
|
@dataclass
|
21
|
-
class
|
22
|
-
"""
|
21
|
+
class DriverFirmwareUpdateData:
|
22
|
+
"""Driver firmware update data."""
|
23
23
|
|
24
24
|
filename: str
|
25
25
|
file: bytes
|
26
26
|
file_format: str | None = None
|
27
27
|
|
28
|
-
def to_dict(self) ->
|
28
|
+
def to_dict(self) -> DriverFirmwareUpdateDataDataType:
|
29
29
|
"""Convert firmware update data to dict."""
|
30
|
-
data:
|
30
|
+
data: DriverFirmwareUpdateDataDataType = {
|
31
31
|
"filename": self.filename,
|
32
32
|
"file": convert_bytes_to_base64(self.file),
|
33
33
|
}
|
@@ -36,10 +36,10 @@ class ControllerFirmwareUpdateData:
|
|
36
36
|
return data
|
37
37
|
|
38
38
|
|
39
|
-
class
|
40
|
-
"""Enum with all
|
39
|
+
class DriverFirmwareUpdateStatus(IntEnum):
|
40
|
+
"""Enum with all driver firmware update status values.
|
41
41
|
|
42
|
-
https://zwave-js.github.io/node-zwave-js/#/api/
|
42
|
+
https://zwave-js.github.io/node-zwave-js/#/api/driver?id=quotfirmware-update-finishedquot
|
43
43
|
"""
|
44
44
|
|
45
45
|
ERROR_TIMEOUT = 0
|
@@ -47,13 +47,13 @@ class ControllerFirmwareUpdateStatus(IntEnum):
|
|
47
47
|
ERROR_RETRY_LIMIT_REACHED = 1
|
48
48
|
# The update was aborted by the bootloader
|
49
49
|
ERROR_ABORTED = 2
|
50
|
-
# This
|
50
|
+
# This driver does not support firmware updates
|
51
51
|
ERROR_NOT_SUPPORTED = 3
|
52
52
|
OK = 255
|
53
53
|
|
54
54
|
|
55
|
-
class
|
56
|
-
"""Represent a
|
55
|
+
class DriverFirmwareUpdateProgressDataType(TypedDict):
|
56
|
+
"""Represent a driver firmware update progress dict type."""
|
57
57
|
|
58
58
|
sentFragments: int
|
59
59
|
totalFragments: int
|
@@ -61,10 +61,10 @@ class ControllerFirmwareUpdateProgressDataType(TypedDict):
|
|
61
61
|
|
62
62
|
|
63
63
|
@dataclass
|
64
|
-
class
|
65
|
-
"""Model for a
|
64
|
+
class DriverFirmwareUpdateProgress:
|
65
|
+
"""Model for a driver firmware update progress data."""
|
66
66
|
|
67
|
-
data:
|
67
|
+
data: DriverFirmwareUpdateProgressDataType = field(repr=False)
|
68
68
|
sent_fragments: int = field(init=False)
|
69
69
|
total_fragments: int = field(init=False)
|
70
70
|
progress: float = field(init=False)
|
@@ -76,22 +76,22 @@ class ControllerFirmwareUpdateProgress:
|
|
76
76
|
self.progress = float(self.data["progress"])
|
77
77
|
|
78
78
|
|
79
|
-
class
|
80
|
-
"""Represent a
|
79
|
+
class DriverFirmwareUpdateResultDataType(TypedDict):
|
80
|
+
"""Represent a driver firmware update result dict type."""
|
81
81
|
|
82
82
|
status: int
|
83
83
|
success: bool
|
84
84
|
|
85
85
|
|
86
86
|
@dataclass
|
87
|
-
class
|
88
|
-
"""Model for
|
87
|
+
class DriverFirmwareUpdateResult:
|
88
|
+
"""Model for driver firmware update result data."""
|
89
89
|
|
90
|
-
data:
|
91
|
-
status:
|
90
|
+
data: DriverFirmwareUpdateResultDataType = field(repr=False)
|
91
|
+
status: DriverFirmwareUpdateStatus = field(init=False)
|
92
92
|
success: bool = field(init=False)
|
93
93
|
|
94
94
|
def __post_init__(self) -> None:
|
95
95
|
"""Post initialize."""
|
96
|
-
self.status =
|
96
|
+
self.status = DriverFirmwareUpdateStatus(self.data["status"])
|
97
97
|
self.success = self.data["success"]
|
@@ -1,9 +1,9 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: zwave-js-server-python
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.64.0
|
4
4
|
Summary: Python wrapper for zwave-js-server
|
5
5
|
Author-email: Home Assistant Team <hello@home-assistant.io>
|
6
|
-
License: Apache-2.0
|
6
|
+
License-Expression: Apache-2.0
|
7
7
|
Project-URL: Source Code, https://github.com/home-assistant-libs/zwave-js-server-python
|
8
8
|
Project-URL: Bug Reports, https://github.com/home-assistant-libs/zwave-js-server-python/issues
|
9
9
|
Keywords: home,automation,zwave,zwave-js
|
@@ -19,6 +19,7 @@ Description-Content-Type: text/markdown
|
|
19
19
|
License-File: LICENSE
|
20
20
|
Requires-Dist: aiohttp>3
|
21
21
|
Requires-Dist: pydantic>=1.10.0
|
22
|
+
Dynamic: license-file
|
22
23
|
|
23
24
|
# zwave-js-server-python
|
24
25
|
|
@@ -37,7 +37,6 @@ zwave_js_server/model/association.py
|
|
37
37
|
zwave_js_server/model/command_class.py
|
38
38
|
zwave_js_server/model/device_class.py
|
39
39
|
zwave_js_server/model/device_config.py
|
40
|
-
zwave_js_server/model/driver.py
|
41
40
|
zwave_js_server/model/duration.py
|
42
41
|
zwave_js_server/model/endpoint.py
|
43
42
|
zwave_js_server/model/log_config.py
|
@@ -51,10 +50,11 @@ zwave_js_server/model/config_manager/__init__.py
|
|
51
50
|
zwave_js_server/model/controller/__init__.py
|
52
51
|
zwave_js_server/model/controller/data_model.py
|
53
52
|
zwave_js_server/model/controller/event_model.py
|
54
|
-
zwave_js_server/model/controller/firmware.py
|
55
53
|
zwave_js_server/model/controller/inclusion_and_provisioning.py
|
56
54
|
zwave_js_server/model/controller/rebuild_routes.py
|
57
55
|
zwave_js_server/model/controller/statistics.py
|
56
|
+
zwave_js_server/model/driver/__init__.py
|
57
|
+
zwave_js_server/model/driver/firmware.py
|
58
58
|
zwave_js_server/model/node/__init__.py
|
59
59
|
zwave_js_server/model/node/data_model.py
|
60
60
|
zwave_js_server/model/node/event_model.py
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/exceptions.py
RENAMED
File without changes
|
{zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/__init__.py
RENAMED
File without changes
|
{zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/association.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/duration.py
RENAMED
File without changes
|
{zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/endpoint.py
RENAMED
File without changes
|
{zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/log_config.py
RENAMED
File without changes
|
{zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/log_message.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/statistics.py
RENAMED
File without changes
|
{zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/utils.py
RENAMED
File without changes
|
{zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/value.py
RENAMED
File without changes
|
{zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/version.py
RENAMED
File without changes
|
File without changes
|
{zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/util/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/util/helpers.py
RENAMED
File without changes
|
{zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/util/lock.py
RENAMED
File without changes
|
{zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/util/multicast.py
RENAMED
File without changes
|
{zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/util/node.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|