zwave-js-server-python 0.65.0__tar.gz → 0.66.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 (81) hide show
  1. {zwave_js_server_python-0.65.0/zwave_js_server_python.egg-info → zwave_js_server_python-0.66.0}/PKG-INFO +3 -2
  2. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/pyproject.toml +5 -1
  3. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/const/__init__.py +1 -1
  4. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/event.py +1 -4
  5. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/controller/statistics.py +9 -4
  6. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/device_config.py +7 -7
  7. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/driver/__init__.py +11 -6
  8. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/node/event_model.py +4 -7
  9. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/node/statistics.py +2 -2
  10. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/value.py +1 -1
  11. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0/zwave_js_server_python.egg-info}/PKG-INFO +3 -2
  12. zwave_js_server_python-0.66.0/zwave_js_server_python.egg-info/requires.txt +5 -0
  13. zwave_js_server_python-0.65.0/zwave_js_server_python.egg-info/requires.txt +0 -2
  14. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/LICENSE +0 -0
  15. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/MANIFEST.in +0 -0
  16. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/README.md +0 -0
  17. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/setup.cfg +0 -0
  18. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/__init__.py +0 -0
  19. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/__main__.py +0 -0
  20. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/client.py +0 -0
  21. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/const/command_class/__init__.py +0 -0
  22. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/const/command_class/barrier_operator.py +0 -0
  23. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/const/command_class/basic.py +0 -0
  24. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/const/command_class/central_scene.py +0 -0
  25. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/const/command_class/color_switch.py +0 -0
  26. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/const/command_class/energy_production.py +0 -0
  27. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/const/command_class/entry_control.py +0 -0
  28. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/const/command_class/humidity_control.py +0 -0
  29. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/const/command_class/lock.py +0 -0
  30. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/const/command_class/meter.py +0 -0
  31. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/const/command_class/multilevel_sensor.py +0 -0
  32. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/const/command_class/multilevel_switch.py +0 -0
  33. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/const/command_class/notification.py +0 -0
  34. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/const/command_class/power_level.py +0 -0
  35. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/const/command_class/protection.py +0 -0
  36. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/const/command_class/scene_activation.py +0 -0
  37. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/const/command_class/sound_switch.py +0 -0
  38. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/const/command_class/thermostat.py +0 -0
  39. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/const/command_class/wake_up.py +0 -0
  40. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/const/command_class/window_covering.py +0 -0
  41. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/dump.py +0 -0
  42. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/exceptions.py +0 -0
  43. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/firmware.py +0 -0
  44. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/__init__.py +0 -0
  45. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/association.py +0 -0
  46. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/command_class.py +0 -0
  47. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/config_manager/__init__.py +0 -0
  48. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/controller/__init__.py +0 -0
  49. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/controller/data_model.py +0 -0
  50. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/controller/event_model.py +0 -0
  51. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/controller/inclusion_and_provisioning.py +0 -0
  52. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/controller/rebuild_routes.py +0 -0
  53. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/device_class.py +0 -0
  54. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/driver/firmware.py +0 -0
  55. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/duration.py +0 -0
  56. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/endpoint.py +0 -0
  57. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/log_config.py +0 -0
  58. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/log_message.py +0 -0
  59. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/node/__init__.py +0 -0
  60. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/node/data_model.py +0 -0
  61. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/node/firmware.py +0 -0
  62. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/node/health_check.py +0 -0
  63. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/notification.py +0 -0
  64. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/statistics.py +0 -0
  65. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/utils.py +0 -0
  66. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/model/version.py +0 -0
  67. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/py.typed +0 -0
  68. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/util/__init__.py +0 -0
  69. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/util/command_class/__init__.py +0 -0
  70. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/util/command_class/energy_production.py +0 -0
  71. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/util/command_class/meter.py +0 -0
  72. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/util/command_class/multilevel_sensor.py +0 -0
  73. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/util/helpers.py +0 -0
  74. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/util/lock.py +0 -0
  75. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/util/multicast.py +0 -0
  76. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/util/node.py +0 -0
  77. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server/version.py +0 -0
  78. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server_python.egg-info/SOURCES.txt +0 -0
  79. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server_python.egg-info/dependency_links.txt +0 -0
  80. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server_python.egg-info/entry_points.txt +0 -0
  81. {zwave_js_server_python-0.65.0 → zwave_js_server_python-0.66.0}/zwave_js_server_python.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: zwave-js-server-python
3
- Version: 0.65.0
3
+ Version: 0.66.0
4
4
  Summary: Python wrapper for zwave-js-server
5
5
  Author-email: Home Assistant Team <hello@home-assistant.io>
6
6
  License-Expression: Apache-2.0
@@ -18,7 +18,8 @@ Requires-Python: >=3.12
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
20
  Requires-Dist: aiohttp>3
21
- Requires-Dist: pydantic>=1.10.0
21
+ Requires-Dist: pydantic>=2.0.0
22
+ Requires-Dist: typing_extensions>=4.13.0; python_version < "3.14"
22
23
  Dynamic: license-file
23
24
 
24
25
  # zwave-js-server-python
@@ -19,7 +19,11 @@ classifiers = [
19
19
  "Programming Language :: Python :: 3.13",
20
20
  "Topic :: Home Automation",
21
21
  ]
22
- dependencies = ["aiohttp>3", "pydantic>=1.10.0"]
22
+ dependencies = [
23
+ "aiohttp>3",
24
+ "pydantic>=2.0.0",
25
+ "typing_extensions>=4.13.0;python_version<'3.14'",
26
+ ]
23
27
  dynamic = ["version"]
24
28
 
25
29
  [project.urls]
@@ -8,7 +8,7 @@ import logging
8
8
  from typing import TypedDict
9
9
 
10
10
  PACKAGE_NAME = "zwave-js-server-python"
11
- __version__ = "0.65.0"
11
+ __version__ = "0.66.0"
12
12
 
13
13
  # minimal server schema version we can handle
14
14
  MIN_SERVER_SCHEMA_VERSION = 41
@@ -7,10 +7,7 @@ from dataclasses import dataclass, field
7
7
  import logging
8
8
  from typing import Literal
9
9
 
10
- try:
11
- from pydantic.v1 import BaseModel
12
- except ImportError:
13
- from pydantic import BaseModel
10
+ from pydantic import BaseModel
14
11
 
15
12
  LOGGER = logging.getLogger(__package__)
16
13
 
@@ -53,6 +53,7 @@ class BackgroundRSSIDataType(TypedDict, total=False):
53
53
  channel0: ChannelRSSIDataType # required
54
54
  channel1: ChannelRSSIDataType # required
55
55
  channel2: ChannelRSSIDataType
56
+ channel3: ChannelRSSIDataType
56
57
 
57
58
 
58
59
  class ControllerStatisticsDataType(TypedDict, total=False):
@@ -94,16 +95,20 @@ class BackgroundRSSI:
94
95
  channel_0: ChannelRSSI = field(init=False)
95
96
  channel_1: ChannelRSSI = field(init=False)
96
97
  channel_2: ChannelRSSI | None = field(init=False)
98
+ channel_3: ChannelRSSI | None = field(init=False)
97
99
 
98
100
  def __post_init__(self) -> None:
99
101
  """Post initialize."""
100
102
  self.timestamp = self.data["timestamp"]
101
103
  self.channel_0 = ChannelRSSI(self.data["channel0"])
102
104
  self.channel_1 = ChannelRSSI(self.data["channel1"])
103
- if not (channel_2 := self.data.get("channel2")):
104
- self.channel_2 = None
105
- return
106
- self.channel_2 = ChannelRSSI(channel_2)
105
+ # Channels 2 and 3 may not be present, but 3 requires 2 to be present
106
+ self.channel_2 = None
107
+ self.channel_3 = None
108
+ if channel_2 := self.data.get("channel2"):
109
+ self.channel_2 = ChannelRSSI(channel_2)
110
+ if channel_3 := self.data.get("channel3"):
111
+ self.channel_3 = ChannelRSSI(channel_3)
107
112
 
108
113
 
109
114
  @dataclass
@@ -12,8 +12,8 @@ from typing import Any, Literal, TypedDict
12
12
  class DeviceDeviceDataType(TypedDict, total=False):
13
13
  """Represent a device device data dict type."""
14
14
 
15
- productType: str
16
- productId: str
15
+ productType: str | int
16
+ productId: str | int
17
17
 
18
18
 
19
19
  class DeviceDevice:
@@ -24,12 +24,12 @@ class DeviceDevice:
24
24
  self.data = data
25
25
 
26
26
  @property
27
- def product_type(self) -> str | None:
27
+ def product_type(self) -> str | int | None:
28
28
  """Return product type."""
29
29
  return self.data.get("productType")
30
30
 
31
31
  @property
32
- def product_id(self) -> str | None:
32
+ def product_id(self) -> str | int | None:
33
33
  """Return product id."""
34
34
  return self.data.get("productId")
35
35
 
@@ -125,7 +125,7 @@ class DeviceConfigDataType(TypedDict, total=False):
125
125
 
126
126
  filename: str
127
127
  manufacturer: str
128
- manufacturerId: str
128
+ manufacturerId: int
129
129
  label: str
130
130
  description: str
131
131
  devices: list[DeviceDeviceDataType]
@@ -164,8 +164,8 @@ class DeviceConfig:
164
164
  return self.data.get("manufacturer")
165
165
 
166
166
  @property
167
- def manufacturer_id(self) -> str | None: # TODO: In the dump this is an int.
168
- """Return manufacturer id (as defined in specs) as a 4-digit hex string."""
167
+ def manufacturer_id(self) -> int | None:
168
+ """Return manufacturer id (as defined in specs)."""
169
169
  return self.data.get("manufacturerId")
170
170
 
171
171
  @property
@@ -2,8 +2,11 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import sys
5
6
  from typing import TYPE_CHECKING, Any, Literal, cast
6
7
 
8
+ from pydantic import create_model
9
+
7
10
  from ...event import BaseEventModel, Event, EventBase
8
11
  from ..config_manager import ConfigManager
9
12
  from ..controller import Controller
@@ -16,10 +19,10 @@ from .firmware import (
16
19
  DriverFirmwareUpdateResultDataType,
17
20
  )
18
21
 
19
- try:
20
- from pydantic.v1 import create_model_from_typeddict
21
- except ImportError:
22
- from pydantic import create_model_from_typeddict
22
+ if sys.version_info >= (3, 14):
23
+ from annotationlib import get_annotations
24
+ else:
25
+ from typing_extensions import get_annotations
23
26
 
24
27
  if TYPE_CHECKING:
25
28
  from ...client import Client
@@ -53,8 +56,10 @@ class AllNodesReadyEventModel(BaseDriverEventModel):
53
56
  event: Literal["all nodes ready"]
54
57
 
55
58
 
56
- LoggingEventModel = create_model_from_typeddict(
57
- LogMessageDataType, __base__=BaseDriverEventModel
59
+ LoggingEventModel = create_model(
60
+ "LoggingEventModel",
61
+ **{k: (v, None) for k, v in get_annotations(LogMessageDataType).items()},
62
+ __base__=BaseDriverEventModel,
58
63
  )
59
64
 
60
65
 
@@ -4,6 +4,8 @@ from __future__ import annotations
4
4
 
5
5
  from typing import Literal
6
6
 
7
+ from pydantic import BaseModel
8
+
7
9
  from ...const import CommandClass
8
10
  from ...event import BaseEventModel
9
11
  from ..notification import (
@@ -20,11 +22,6 @@ from .firmware import (
20
22
  )
21
23
  from .statistics import NodeStatisticsDataType
22
24
 
23
- try:
24
- from pydantic.v1 import BaseModel
25
- except ImportError:
26
- from pydantic import BaseModel
27
-
28
25
 
29
26
  class BaseNodeEventModel(BaseEventModel):
30
27
  """Base model for a node event."""
@@ -101,8 +98,8 @@ class InterviewFailedEventArgsModel(BaseModel):
101
98
 
102
99
  errorMessage: str
103
100
  isFinal: bool
104
- attempt: int | None
105
- maxAttempts: int | None
101
+ attempt: int | None = None
102
+ maxAttempts: int | None = None
106
103
 
107
104
  @classmethod
108
105
  def from_dict(cls, data: dict) -> InterviewFailedEventArgsModel:
@@ -25,7 +25,7 @@ class NodeStatisticsDataType(TypedDict, total=False):
25
25
  commandsDroppedTX: int # required
26
26
  commandsDroppedRX: int # required
27
27
  timeoutResponse: int # required
28
- rtt: int
28
+ rtt: float
29
29
  rssi: int
30
30
  lwr: RouteStatisticsDataType
31
31
  nlwr: RouteStatisticsDataType
@@ -43,7 +43,7 @@ class NodeStatistics:
43
43
  commands_dropped_rx: int = field(init=False)
44
44
  commands_dropped_tx: int = field(init=False)
45
45
  timeout_response: int = field(init=False)
46
- rtt: int | None = field(init=False)
46
+ rtt: float | None = field(init=False)
47
47
  lwr: RouteStatistics | None = field(init=False, default=None)
48
48
  nlwr: RouteStatistics | None = field(init=False, default=None)
49
49
  last_seen: datetime | None = field(init=False, default=None)
@@ -40,7 +40,7 @@ class MetaDataType(TypedDict, total=False):
40
40
  label: str
41
41
  min: int | None
42
42
  max: int | None
43
- unit: str
43
+ unit: str | None
44
44
  states: dict[str, str]
45
45
  ccSpecific: dict[str, Any]
46
46
  valueChangeOptions: list[str]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: zwave-js-server-python
3
- Version: 0.65.0
3
+ Version: 0.66.0
4
4
  Summary: Python wrapper for zwave-js-server
5
5
  Author-email: Home Assistant Team <hello@home-assistant.io>
6
6
  License-Expression: Apache-2.0
@@ -18,7 +18,8 @@ Requires-Python: >=3.12
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
20
  Requires-Dist: aiohttp>3
21
- Requires-Dist: pydantic>=1.10.0
21
+ Requires-Dist: pydantic>=2.0.0
22
+ Requires-Dist: typing_extensions>=4.13.0; python_version < "3.14"
22
23
  Dynamic: license-file
23
24
 
24
25
  # zwave-js-server-python
@@ -0,0 +1,5 @@
1
+ aiohttp>3
2
+ pydantic>=2.0.0
3
+
4
+ [:python_version < "3.14"]
5
+ typing_extensions>=4.13.0
@@ -1,2 +0,0 @@
1
- aiohttp>3
2
- pydantic>=1.10.0