Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion test/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ def version_data_fixture() -> dict[str, Any]:
"serverVersion": "test_server_version",
"homeId": "test_home_id",
"minSchemaVersion": 0,
"maxSchemaVersion": 40,
"maxSchemaVersion": 42,
}


Expand Down
8 changes: 4 additions & 4 deletions test/model/test_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -2233,7 +2233,7 @@ async def test_firmware_events(controller):
event = Event(
type="firmware update progress",
data={
"source": "controller",
"source": "driver",
"event": "firmware update progress",
"progress": {
"sentFragments": 1,
Expand All @@ -2243,7 +2243,7 @@ async def test_firmware_events(controller):
},
)

controller.receive_event(event)
controller.handle_firmware_update_progress(event)
progress = event.data["firmware_update_progress"]
assert progress.sent_fragments == 1
assert progress.total_fragments == 10
Expand All @@ -2256,13 +2256,13 @@ async def test_firmware_events(controller):
event = Event(
type="firmware update finished",
data={
"source": "controller",
"source": "driver",
"event": "firmware update finished",
"result": {"status": 255, "success": True},
},
)

controller.receive_event(event)
controller.handle_firmware_update_finished(event)
result = event.data["firmware_update_finished"]
assert result.status == ControllerFirmwareUpdateStatus.OK
assert result.success
Expand Down
39 changes: 39 additions & 0 deletions test/model/test_driver.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""Test the driver model."""

import json
from unittest.mock import patch

import pytest

Expand Down Expand Up @@ -409,3 +410,41 @@ def test_config_manager(driver):
"""Test the driver has the config manager property."""
assert driver.config_manager is not None
assert driver.config_manager._client is driver.client


async def test_firmware_events(driver):
"""Test firmware events."""
assert driver.controller.firmware_update_progress is None
event = Event(
type="firmware update progress",
data={
"source": "driver",
"event": "firmware update progress",
"progress": {
"sentFragments": 1,
"totalFragments": 10,
"progress": 10.0,
},
},
)

with patch(
"zwave_js_server.model.controller.Controller.handle_firmware_update_progress"
) as mock:
driver.receive_event(event)
assert mock.called

event = Event(
type="firmware update finished",
data={
"source": "driver",
"event": "firmware update finished",
"result": {"status": 255, "success": True},
},
)

with patch(
"zwave_js_server.model.controller.Controller.handle_firmware_update_finished"
) as mock:
driver.receive_event(event)
assert mock.called
2 changes: 1 addition & 1 deletion test/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -463,7 +463,7 @@ async def test_additional_user_agent_components(client_session, url):
{
"command": "initialize",
"messageId": "initialize",
"schemaVersion": 40,
"schemaVersion": 42,
"additionalUserAgentComponents": {
"zwave-js-server-python": __version__,
"foo": "bar",
Expand Down
2 changes: 1 addition & 1 deletion test/test_dump.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ async def test_dump_additional_user_agent_components(
{
"command": "initialize",
"messageId": "initialize",
"schemaVersion": 40,
"schemaVersion": 42,
"additionalUserAgentComponents": {
"zwave-js-server-python": __version__,
"foo": "bar",
Expand Down
2 changes: 1 addition & 1 deletion test/test_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ def test_dump_state(
assert captured.out == (
"{'type': 'version', 'driverVersion': 'test_driver_version', "
"'serverVersion': 'test_server_version', 'homeId': 'test_home_id', "
"'minSchemaVersion': 0, 'maxSchemaVersion': 40}\n"
"'minSchemaVersion': 0, 'maxSchemaVersion': 42}\n"
"{'type': 'result', 'success': True, 'result': {}, 'messageId': 'initialize'}\n"
"test_result\n"
)
Expand Down
4 changes: 2 additions & 2 deletions zwave_js_server/const/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
__version__ = "0.63.0"

# minimal server schema version we can handle
MIN_SERVER_SCHEMA_VERSION = 39
MIN_SERVER_SCHEMA_VERSION = 41
# max server schema version we can handle (and our code is compatible with)
MAX_SERVER_SCHEMA_VERSION = 40
MAX_SERVER_SCHEMA_VERSION = 42

VALUE_UNKNOWN = "unknown"

Expand Down
38 changes: 0 additions & 38 deletions zwave_js_server/model/controller/event_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,6 @@
from ...const import InclusionState, InclusionStrategy, RemoveNodeReason
from ...event import BaseEventModel
from ..node.data_model import FoundNodeDataType, NodeDataType
from .firmware import (
ControllerFirmwareUpdateProgressDataType,
ControllerFirmwareUpdateResultDataType,
)
from .inclusion_and_provisioning import InclusionGrantDataType
from .statistics import ControllerStatisticsDataType

Expand Down Expand Up @@ -46,38 +42,6 @@ class ExclusionStoppedEventModel(BaseControllerEventModel):
event: Literal["exclusion stopped"]


class FirmwareUpdateFinishedEventModel(BaseControllerEventModel):
"""Model for `firmware update finished` event data."""

event: Literal["firmware update finished"]
result: ControllerFirmwareUpdateResultDataType

@classmethod
def from_dict(cls, data: dict) -> FirmwareUpdateFinishedEventModel:
"""Initialize from dict."""
return cls(
source=data["source"],
event=data["event"],
result=data["result"],
)


class FirmwareUpdateProgressEventModel(BaseControllerEventModel):
"""Model for `firmware update progress` event data."""

event: Literal["firmware update progress"]
progress: ControllerFirmwareUpdateProgressDataType

@classmethod
def from_dict(cls, data: dict) -> FirmwareUpdateProgressEventModel:
"""Initialize from dict."""
return cls(
source=data["source"],
event=data["event"],
progress=data["progress"],
)


class GrantSecurityClassesEventModel(BaseControllerEventModel):
"""Model for `grant security classes` event data."""

Expand Down Expand Up @@ -343,8 +307,6 @@ def from_dict(cls, data: dict) -> StatusChangedEventModel:
"exclusion failed": ExclusionFailedEventModel,
"exclusion started": ExclusionStartedEventModel,
"exclusion stopped": ExclusionStoppedEventModel,
"firmware update finished": FirmwareUpdateFinishedEventModel,
"firmware update progress": FirmwareUpdateProgressEventModel,
"grant security classes": GrantSecurityClassesEventModel,
"rebuild routes done": RebuildRoutesDoneEventModel,
"rebuild routes progress": RebuildRoutesProgressEventModel,
Expand Down
46 changes: 46 additions & 0 deletions zwave_js_server/model/driver.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@
from ..event import BaseEventModel, Event, EventBase
from .config_manager import ConfigManager
from .controller import Controller
from .controller.firmware import (
ControllerFirmwareUpdateProgressDataType,
ControllerFirmwareUpdateResultDataType,
)
from .log_config import LogConfig, LogConfigDataType
from .log_message import LogMessage, LogMessageDataType

Expand Down Expand Up @@ -58,11 +62,45 @@ class DriverReadyEventModel(BaseDriverEventModel):
event: Literal["driver ready"]


class FirmwareUpdateFinishedEventModel(BaseDriverEventModel):
"""Model for `firmware update finished` event data."""

event: Literal["firmware update finished"]
result: ControllerFirmwareUpdateResultDataType

@classmethod
def from_dict(cls, data: dict) -> FirmwareUpdateFinishedEventModel:
"""Initialize from dict."""
return cls(
source=data["source"],
event=data["event"],
result=data["result"],
)


class FirmwareUpdateProgressEventModel(BaseDriverEventModel):
"""Model for `firmware update progress` event data."""

event: Literal["firmware update progress"]
progress: ControllerFirmwareUpdateProgressDataType

@classmethod
def from_dict(cls, data: dict) -> FirmwareUpdateProgressEventModel:
"""Initialize from dict."""
return cls(
source=data["source"],
event=data["event"],
progress=data["progress"],
)


DRIVER_EVENT_MODEL_MAP: dict[str, type[BaseDriverEventModel]] = {
"all nodes ready": AllNodesReadyEventModel,
"log config updated": LogConfigUpdatedEventModel,
"logging": LoggingEventModel,
"driver ready": DriverReadyEventModel,
"firmware update finished": FirmwareUpdateFinishedEventModel,
"firmware update progress": FirmwareUpdateProgressEventModel,
}


Expand Down Expand Up @@ -210,3 +248,11 @@ def handle_all_nodes_ready(self, event: Event) -> None:

def handle_driver_ready(self, event: Event) -> None:
"""Process a driver ready event."""

def handle_firmware_update_progress(self, event: Event) -> None:
"""Process a firmware update progress event."""
self.controller.handle_firmware_update_progress(event)

def handle_firmware_update_finished(self, event: Event) -> None:
"""Process a firmware update finished event."""
self.controller.handle_firmware_update_finished(event)
1 change: 1 addition & 0 deletions zwave_js_server/model/node/data_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,3 +67,4 @@ class NodeDataType(TypedDict, total=False):
defaultVolume: int | float | None
defaultTransitionDuration: int | float | None
protocol: int
sdkVersion: str | None