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.
Files changed (80) hide show
  1. {zwave_js_server_python-0.62.0/zwave_js_server_python.egg-info → zwave_js_server_python-0.64.0}/PKG-INFO +4 -3
  2. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/pyproject.toml +2 -2
  3. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/__init__.py +3 -3
  4. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/firmware.py +8 -11
  5. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/controller/__init__.py +7 -20
  6. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/controller/event_model.py +0 -38
  7. 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
  8. {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
  9. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/node/data_model.py +1 -0
  10. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0/zwave_js_server_python.egg-info}/PKG-INFO +4 -3
  11. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server_python.egg-info/SOURCES.txt +2 -2
  12. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/LICENSE +0 -0
  13. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/MANIFEST.in +0 -0
  14. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/README.md +0 -0
  15. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/setup.cfg +0 -0
  16. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/__init__.py +0 -0
  17. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/__main__.py +0 -0
  18. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/client.py +0 -0
  19. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/__init__.py +0 -0
  20. {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
  21. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/basic.py +0 -0
  22. {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
  23. {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
  24. {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
  25. {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
  26. {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
  27. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/lock.py +0 -0
  28. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/meter.py +0 -0
  29. {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
  30. {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
  31. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/notification.py +0 -0
  32. {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
  33. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/protection.py +0 -0
  34. {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
  35. {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
  36. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/const/command_class/thermostat.py +0 -0
  37. {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
  38. {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
  39. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/dump.py +0 -0
  40. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/event.py +0 -0
  41. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/exceptions.py +0 -0
  42. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/__init__.py +0 -0
  43. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/association.py +0 -0
  44. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/command_class.py +0 -0
  45. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/config_manager/__init__.py +0 -0
  46. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/controller/data_model.py +0 -0
  47. {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
  48. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/controller/rebuild_routes.py +0 -0
  49. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/controller/statistics.py +0 -0
  50. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/device_class.py +0 -0
  51. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/device_config.py +0 -0
  52. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/duration.py +0 -0
  53. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/endpoint.py +0 -0
  54. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/log_config.py +0 -0
  55. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/log_message.py +0 -0
  56. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/node/__init__.py +0 -0
  57. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/node/event_model.py +0 -0
  58. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/node/firmware.py +0 -0
  59. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/node/health_check.py +0 -0
  60. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/node/statistics.py +0 -0
  61. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/notification.py +0 -0
  62. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/statistics.py +0 -0
  63. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/utils.py +0 -0
  64. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/value.py +0 -0
  65. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/model/version.py +0 -0
  66. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/py.typed +0 -0
  67. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/util/__init__.py +0 -0
  68. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/util/command_class/__init__.py +0 -0
  69. {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
  70. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/util/command_class/meter.py +0 -0
  71. {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
  72. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/util/helpers.py +0 -0
  73. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/util/lock.py +0 -0
  74. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/util/multicast.py +0 -0
  75. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/util/node.py +0 -0
  76. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server/version.py +0 -0
  77. {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
  78. {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
  79. {zwave_js_server_python-0.62.0 → zwave_js_server_python-0.64.0}/zwave_js_server_python.egg-info/requires.txt +0 -0
  80. {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.2
1
+ Metadata-Version: 2.4
2
2
  Name: zwave-js-server-python
3
- Version: 0.62.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 = { text = "Apache-2.0" }
11
+ license = "Apache-2.0"
12
12
  keywords = ["home", "automation", "zwave", "zwave-js"]
13
13
  classifiers = [
14
14
  "Development Status :: 4 - Beta",
@@ -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.62.0"
11
+ __version__ = "0.64.0"
12
12
 
13
13
  # minimal server schema version we can handle
14
- MIN_SERVER_SCHEMA_VERSION = 39
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 = 40
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.controller.firmware import (
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 controller_firmware_update_otw(
45
+ async def driver_firmware_update_otw(
49
46
  url: str,
50
- firmware_file: ControllerFirmwareUpdateData,
47
+ firmware_file: DriverFirmwareUpdateData,
51
48
  session: aiohttp.ClientSession,
52
49
  additional_user_agent_components: dict[str, str] | None = None,
53
- ) -> ControllerFirmwareUpdateResult:
50
+ ) -> DriverFirmwareUpdateResult:
54
51
  """
55
- Send firmwareUpdateOTW command to Controller.
52
+ Send firmwareUpdateOTW command to Driver.
56
53
 
57
- Sending the wrong firmware to a controller can brick it and make it unrecoverable.
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": "controller.firmware_update_otw",
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 ControllerFirmwareUpdateResult(data["result"])
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 ..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
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 ..client import Client
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 controller firmware."""
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 ControllerFirmwareUpdateDataDataType(TypedDict, total=False):
13
- """Represent a controller firmware update data dict type."""
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 ControllerFirmwareUpdateData:
22
- """Controller firmware update data."""
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) -> ControllerFirmwareUpdateDataDataType:
28
+ def to_dict(self) -> DriverFirmwareUpdateDataDataType:
29
29
  """Convert firmware update data to dict."""
30
- data: ControllerFirmwareUpdateDataDataType = {
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 ControllerFirmwareUpdateStatus(IntEnum):
40
- """Enum with all controller firmware update status values.
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/controller?id=quotfirmware-update-finishedquot
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 controller does not support firmware updates
50
+ # This driver does not support firmware updates
51
51
  ERROR_NOT_SUPPORTED = 3
52
52
  OK = 255
53
53
 
54
54
 
55
- class ControllerFirmwareUpdateProgressDataType(TypedDict):
56
- """Represent a controller firmware update progress dict type."""
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 ControllerFirmwareUpdateProgress:
65
- """Model for a controller firmware update progress data."""
64
+ class DriverFirmwareUpdateProgress:
65
+ """Model for a driver firmware update progress data."""
66
66
 
67
- data: ControllerFirmwareUpdateProgressDataType = field(repr=False)
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 ControllerFirmwareUpdateResultDataType(TypedDict):
80
- """Represent a controller firmware update result dict type."""
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 ControllerFirmwareUpdateResult:
88
- """Model for controller firmware update result data."""
87
+ class DriverFirmwareUpdateResult:
88
+ """Model for driver firmware update result data."""
89
89
 
90
- data: ControllerFirmwareUpdateResultDataType = field(repr=False)
91
- status: ControllerFirmwareUpdateStatus = field(init=False)
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 = ControllerFirmwareUpdateStatus(self.data["status"])
96
+ self.status = DriverFirmwareUpdateStatus(self.data["status"])
97
97
  self.success = self.data["success"]
@@ -67,3 +67,4 @@ class NodeDataType(TypedDict, total=False):
67
67
  defaultVolume: int | float | None
68
68
  defaultTransitionDuration: int | float | None
69
69
  protocol: int
70
+ sdkVersion: str | None
@@ -1,9 +1,9 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: zwave-js-server-python
3
- Version: 0.62.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