Skip to content

Commit 75d1bbc

Browse files
authored
Support schema 42 (#1237)
* Handle breaking change in schema 41 * support schema 42 * bump schema version * Move the remaing firmware code to the driver * format * format * revert ruff change
1 parent ec34946 commit 75d1bbc

File tree

14 files changed

+162
-165
lines changed

14 files changed

+162
-165
lines changed

test/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ def version_data_fixture() -> dict[str, Any]:
246246
"serverVersion": "test_server_version",
247247
"homeId": "test_home_id",
248248
"minSchemaVersion": 0,
249-
"maxSchemaVersion": 40,
249+
"maxSchemaVersion": 42,
250250
}
251251

252252

test/model/test_controller.py

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
controller as controller_pkg,
2929
)
3030
from zwave_js_server.model.controller import Controller
31-
from zwave_js_server.model.controller.firmware import ControllerFirmwareUpdateStatus
3231
from zwave_js_server.model.controller.rebuild_routes import (
3332
RebuildRoutesOptions,
3433
RebuildRoutesStatus,
@@ -2227,48 +2226,6 @@ async def test_inclusion_aborted(controller):
22272226
assert {k: v for k, v in event.data.items() if k != "controller"} == event_data
22282227

22292228

2230-
async def test_firmware_events(controller):
2231-
"""Test firmware events."""
2232-
assert controller.firmware_update_progress is None
2233-
event = Event(
2234-
type="firmware update progress",
2235-
data={
2236-
"source": "controller",
2237-
"event": "firmware update progress",
2238-
"progress": {
2239-
"sentFragments": 1,
2240-
"totalFragments": 10,
2241-
"progress": 10.0,
2242-
},
2243-
},
2244-
)
2245-
2246-
controller.receive_event(event)
2247-
progress = event.data["firmware_update_progress"]
2248-
assert progress.sent_fragments == 1
2249-
assert progress.total_fragments == 10
2250-
assert progress.progress == 10.0
2251-
assert controller.firmware_update_progress
2252-
assert controller.firmware_update_progress.sent_fragments == 1
2253-
assert controller.firmware_update_progress.total_fragments == 10
2254-
assert controller.firmware_update_progress.progress == 10.0
2255-
2256-
event = Event(
2257-
type="firmware update finished",
2258-
data={
2259-
"source": "controller",
2260-
"event": "firmware update finished",
2261-
"result": {"status": 255, "success": True},
2262-
},
2263-
)
2264-
2265-
controller.receive_event(event)
2266-
result = event.data["firmware_update_finished"]
2267-
assert result.status == ControllerFirmwareUpdateStatus.OK
2268-
assert result.success
2269-
assert controller.firmware_update_progress is None
2270-
2271-
22722229
async def test_unknown_event(controller):
22732230
"""Test that an unknown event type causes an exception."""
22742231
with pytest.raises(KeyError):

test/model/test_driver.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
log_config as log_config_pkg,
1212
log_message as log_message_pkg,
1313
)
14+
from zwave_js_server.model.driver.firmware import DriverFirmwareUpdateStatus
1415

1516
from .. import load_fixture
1617

@@ -409,3 +410,45 @@ def test_config_manager(driver):
409410
"""Test the driver has the config manager property."""
410411
assert driver.config_manager is not None
411412
assert driver.config_manager._client is driver.client
413+
414+
415+
async def test_firmware_events(driver):
416+
"""Test firmware events."""
417+
assert driver.firmware_update_progress is None
418+
event = Event(
419+
type="firmware update progress",
420+
data={
421+
"source": "driver",
422+
"event": "firmware update progress",
423+
"progress": {
424+
"sentFragments": 1,
425+
"totalFragments": 10,
426+
"progress": 10.0,
427+
},
428+
},
429+
)
430+
431+
driver.receive_event(event)
432+
progress = event.data["firmware_update_progress"]
433+
assert progress.sent_fragments == 1
434+
assert progress.total_fragments == 10
435+
assert progress.progress == 10.0
436+
assert driver.firmware_update_progress
437+
assert driver.firmware_update_progress.sent_fragments == 1
438+
assert driver.firmware_update_progress.total_fragments == 10
439+
assert driver.firmware_update_progress.progress == 10.0
440+
441+
event = Event(
442+
type="firmware update finished",
443+
data={
444+
"source": "driver",
445+
"event": "firmware update finished",
446+
"result": {"status": 255, "success": True},
447+
},
448+
)
449+
450+
driver.receive_event(event)
451+
result = event.data["firmware_update_finished"]
452+
assert result.status == DriverFirmwareUpdateStatus.OK
453+
assert result.success
454+
assert driver.firmware_update_progress is None

test/test_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ async def test_additional_user_agent_components(client_session, url):
463463
{
464464
"command": "initialize",
465465
"messageId": "initialize",
466-
"schemaVersion": 40,
466+
"schemaVersion": 42,
467467
"additionalUserAgentComponents": {
468468
"zwave-js-server-python": __version__,
469469
"foo": "bar",

test/test_dump.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ async def test_dump_additional_user_agent_components(
106106
{
107107
"command": "initialize",
108108
"messageId": "initialize",
109-
"schemaVersion": 40,
109+
"schemaVersion": 42,
110110
"additionalUserAgentComponents": {
111111
"zwave-js-server-python": __version__,
112112
"foo": "bar",

test/test_firmware.py

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
from unittest.mock import patch
44

5-
from zwave_js_server.firmware import controller_firmware_update_otw, update_firmware
6-
from zwave_js_server.model.controller.firmware import (
7-
ControllerFirmwareUpdateData,
8-
ControllerFirmwareUpdateStatus,
5+
from zwave_js_server.firmware import driver_firmware_update_otw, update_firmware
6+
from zwave_js_server.model.driver.firmware import (
7+
DriverFirmwareUpdateData,
8+
DriverFirmwareUpdateStatus,
99
)
1010
from zwave_js_server.model.node.firmware import (
1111
NodeFirmwareUpdateData,
@@ -94,26 +94,26 @@ async def test_update_firmware_known_format_and_target(
9494
disconnect_mock.assert_called_once()
9595

9696

97-
async def test_controller_firmware_update_otw_guess_format(url, client_session):
98-
"""Test controller_firmware_update_otw with guessed format."""
97+
async def test_driver_firmware_update_otw_guess_format(url, client_session):
98+
"""Test driver_firmware_update_otw with guessed format."""
9999
with (
100100
patch("zwave_js_server.firmware.Client.connect") as connect_mock,
101101
patch("zwave_js_server.firmware.Client.initialize") as initialize_mock,
102102
patch("zwave_js_server.firmware.Client.async_send_command") as cmd_mock,
103103
patch("zwave_js_server.firmware.Client.disconnect") as disconnect_mock,
104104
):
105105
cmd_mock.return_value = {"result": {"status": 255, "success": True}}
106-
result = await controller_firmware_update_otw(
107-
url, ControllerFirmwareUpdateData("test", bytes(10)), client_session
106+
result = await driver_firmware_update_otw(
107+
url, DriverFirmwareUpdateData("test", bytes(10)), client_session
108108
)
109-
assert result.status == ControllerFirmwareUpdateStatus.OK
109+
assert result.status == DriverFirmwareUpdateStatus.OK
110110
assert result.success
111111

112112
connect_mock.assert_called_once()
113113
initialize_mock.assert_called_once()
114114
cmd_mock.assert_called_once_with(
115115
{
116-
"command": "controller.firmware_update_otw",
116+
"command": "driver.firmware_update_otw",
117117
"filename": "test",
118118
"file": "AAAAAAAAAAAAAA==",
119119
},
@@ -122,30 +122,28 @@ async def test_controller_firmware_update_otw_guess_format(url, client_session):
122122
disconnect_mock.assert_called_once()
123123

124124

125-
async def test_controller_firmware_update_otw_known_format_and_target(
126-
url, client_session
127-
):
128-
"""Test controller_firmware_update_otw with known format."""
125+
async def test_driver_firmware_update_otw_known_format_and_target(url, client_session):
126+
"""Test driver_firmware_update_otw with known format."""
129127
with (
130128
patch("zwave_js_server.firmware.Client.connect") as connect_mock,
131129
patch("zwave_js_server.firmware.Client.initialize") as initialize_mock,
132130
patch("zwave_js_server.firmware.Client.async_send_command") as cmd_mock,
133131
patch("zwave_js_server.firmware.Client.disconnect") as disconnect_mock,
134132
):
135133
cmd_mock.return_value = {"result": {"status": 255, "success": True}}
136-
result = await controller_firmware_update_otw(
134+
result = await driver_firmware_update_otw(
137135
url=url,
138-
firmware_file=ControllerFirmwareUpdateData("test", bytes(10), "test"),
136+
firmware_file=DriverFirmwareUpdateData("test", bytes(10), "test"),
139137
session=client_session,
140138
)
141-
assert result.status == ControllerFirmwareUpdateStatus.OK
139+
assert result.status == DriverFirmwareUpdateStatus.OK
142140
assert result.success
143141

144142
connect_mock.assert_called_once()
145143
initialize_mock.assert_called_once()
146144
cmd_mock.assert_called_once_with(
147145
{
148-
"command": "controller.firmware_update_otw",
146+
"command": "driver.firmware_update_otw",
149147
"filename": "test",
150148
"file": "AAAAAAAAAAAAAA==",
151149
"fileFormat": "test",

test/test_main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def test_dump_state(
5858
assert captured.out == (
5959
"{'type': 'version', 'driverVersion': 'test_driver_version', "
6060
"'serverVersion': 'test_server_version', 'homeId': 'test_home_id', "
61-
"'minSchemaVersion': 0, 'maxSchemaVersion': 40}\n"
61+
"'minSchemaVersion': 0, 'maxSchemaVersion': 42}\n"
6262
"{'type': 'result', 'success': True, 'result': {}, 'messageId': 'initialize'}\n"
6363
"test_result\n"
6464
)

zwave_js_server/const/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
__version__ = "0.63.0"
1212

1313
# minimal server schema version we can handle
14-
MIN_SERVER_SCHEMA_VERSION = 39
14+
MIN_SERVER_SCHEMA_VERSION = 41
1515
# max server schema version we can handle (and our code is compatible with)
16-
MAX_SERVER_SCHEMA_VERSION = 40
16+
MAX_SERVER_SCHEMA_VERSION = 42
1717

1818
VALUE_UNKNOWN = "unknown"
1919

zwave_js_server/firmware.py

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@
77
import aiohttp
88

99
from .client import Client
10-
from .model.controller.firmware import (
11-
ControllerFirmwareUpdateData,
12-
ControllerFirmwareUpdateResult,
13-
)
10+
from .model.driver.firmware import DriverFirmwareUpdateData, DriverFirmwareUpdateResult
1411
from .model.node import Node
1512
from .model.node.firmware import NodeFirmwareUpdateData, NodeFirmwareUpdateResult
1613

@@ -45,16 +42,16 @@ async def update_firmware(
4542
return NodeFirmwareUpdateResult(node, data["result"])
4643

4744

48-
async def controller_firmware_update_otw(
45+
async def driver_firmware_update_otw(
4946
url: str,
50-
firmware_file: ControllerFirmwareUpdateData,
47+
firmware_file: DriverFirmwareUpdateData,
5148
session: aiohttp.ClientSession,
5249
additional_user_agent_components: dict[str, str] | None = None,
53-
) -> ControllerFirmwareUpdateResult:
50+
) -> DriverFirmwareUpdateResult:
5451
"""
55-
Send firmwareUpdateOTW command to Controller.
52+
Send firmwareUpdateOTW command to Driver.
5653
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.
5855
Consumers of this library should build mechanisms to ensure that users understand
5956
the risks.
6057
"""
@@ -68,7 +65,7 @@ async def controller_firmware_update_otw(
6865

6966
data = await client.async_send_command(
7067
{
71-
"command": "controller.firmware_update_otw",
68+
"command": "driver.firmware_update_otw",
7269
**firmware_file.to_dict(),
7370
},
7471
require_schema=29,
@@ -77,4 +74,4 @@ async def controller_firmware_update_otw(
7774
if not receive_task.done():
7875
receive_task.cancel()
7976

80-
return ControllerFirmwareUpdateResult(data["result"])
77+
return DriverFirmwareUpdateResult(data["result"])

zwave_js_server/model/controller/__init__.py

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
from ..node.firmware import NodeFirmwareUpdateResult
2828
from .data_model import ControllerDataType
2929
from .event_model import CONTROLLER_EVENT_MODEL_MAP
30-
from .firmware import ControllerFirmwareUpdateProgress, ControllerFirmwareUpdateResult
3130
from .inclusion_and_provisioning import (
3231
InclusionGrant,
3332
ProvisioningEntry,
@@ -80,7 +79,6 @@ def __init__(self, client: Client, state: dict) -> None:
8079
self._rebuild_routes_progress: dict[Node, RebuildRoutesStatus] | None = None
8180
self._last_rebuild_routes_result: dict[Node, RebuildRoutesStatus] | None = None
8281
self._statistics = ControllerStatistics(DEFAULT_CONTROLLER_STATISTICS)
83-
self._firmware_update_progress: ControllerFirmwareUpdateProgress | None = None
8482
for node_state in state["nodes"]:
8583
node = Node(client, node_state)
8684
self.nodes[node.node_id] = node
@@ -235,11 +233,6 @@ def rf_region(self) -> RFRegion | None:
235233
return None
236234
return RFRegion(rf_region)
237235

238-
@property
239-
def firmware_update_progress(self) -> ControllerFirmwareUpdateProgress | None:
240-
"""Return firmware update progress."""
241-
return self._firmware_update_progress
242-
243236
@property
244237
def status(self) -> ControllerStatus:
245238
"""Return status."""
@@ -902,19 +895,6 @@ def receive_event(self, event: Event) -> None:
902895
event.data["controller"] = self
903896
self.emit(event.type, event.data)
904897

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-
918898
def handle_inclusion_failed(self, event: Event) -> None:
919899
"""Process an inclusion failed event."""
920900

0 commit comments

Comments
 (0)