Skip to content

Commit

Permalink
Bump zwave-js-server-python to 0.50.0
Browse files Browse the repository at this point in the history
  • Loading branch information
raman325 committed Jul 20, 2023
1 parent 9da1559 commit eeec138
Show file tree
Hide file tree
Showing 24 changed files with 301 additions and 71 deletions.
6 changes: 3 additions & 3 deletions homeassistant/components/zwave_js/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

from async_timeout import timeout
from zwave_js_server.client import Client as ZwaveClient
from zwave_js_server.const import CommandClass
from zwave_js_server.const import CommandClass, RemoveNodeReason
from zwave_js_server.exceptions import BaseZwaveJSServerError, InvalidServerVersion
from zwave_js_server.model.driver import Driver
from zwave_js_server.model.node import Node as ZwaveNode
Expand Down Expand Up @@ -398,13 +398,13 @@ async def async_on_node_added(self, node: ZwaveNode) -> None:
def async_on_node_removed(self, event: dict) -> None:
"""Handle node removed event."""
node: ZwaveNode = event["node"]
replaced: bool = event.get("replaced", False)
reason: RemoveNodeReason = event["reason"]
# grab device in device registry attached to this node
dev_id = get_device_id(self.driver_events.driver, node)
device = self.dev_reg.async_get_device(identifiers={dev_id})
# We assert because we know the device exists
assert device
if replaced:
if reason in (RemoveNodeReason.REPLACED, RemoveNodeReason.PROXY_REPLACED):
self.discovered_value_ids.pop(device.id, None)

async_dispatcher_send(
Expand Down
1 change: 1 addition & 0 deletions homeassistant/components/zwave_js/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -1138,6 +1138,7 @@ def node_removed(event: dict) -> None:
node = event["node"]
node_details = {
"node_id": node.node_id,
"reason": event["reason"],
}

connection.send_message(
Expand Down
51 changes: 22 additions & 29 deletions homeassistant/components/zwave_js/discovery.py
Original file line number Diff line number Diff line change
Expand Up @@ -1125,36 +1125,29 @@ def async_discover_single_configuration_value(
ConfigurationValueType.RANGE,
ConfigurationValueType.MANUAL_ENTRY,
):
if value.metadata.type == ValueType.BOOLEAN or (
value.metadata.min == 0 and value.metadata.max == 1
):
yield ZwaveDiscoveryInfo(
node=value.node,
primary_value=value,
assumed_state=False,
platform=Platform.SWITCH,
platform_hint="config_parameter",
platform_data=None,
additional_value_ids_to_watch=set(),
entity_registry_enabled_default=False,
)
else:
yield ZwaveDiscoveryInfo(
node=value.node,
primary_value=value,
assumed_state=False,
platform=Platform.NUMBER,
platform_hint="config_parameter",
platform_data=None,
additional_value_ids_to_watch=set(),
entity_registry_enabled_default=False,
)
yield ZwaveDiscoveryInfo(
node=value.node,
primary_value=value,
assumed_state=False,
platform=Platform.NUMBER,
platform_hint="config_parameter",
platform_data=None,
additional_value_ids_to_watch=set(),
entity_registry_enabled_default=False,
)
elif value.configuration_value_type == ConfigurationValueType.BOOLEAN:
yield ZwaveDiscoveryInfo(
node=value.node,
primary_value=value,
assumed_state=False,
platform=Platform.SWITCH,
platform_hint="config_parameter",
platform_data=None,
additional_value_ids_to_watch=set(),
entity_registry_enabled_default=False,
)
elif not value.metadata.writeable and value.metadata.readable:
if value.metadata.type == ValueType.BOOLEAN or (
value.metadata.min == 0
and value.metadata.max == 1
and not value.metadata.states
):
if value.configuration_value_type == ConfigurationValueType.BOOLEAN:
yield ZwaveDiscoveryInfo(
node=value.node,
primary_value=value,
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/zwave_js/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"iot_class": "local_push",
"loggers": ["zwave_js_server"],
"quality_scale": "platinum",
"requirements": ["pyserial==3.5", "zwave-js-server-python==0.49.0"],
"requirements": ["pyserial==3.5", "zwave-js-server-python==0.50.0"],
"usb": [
{
"vid": "0658",
Expand Down
30 changes: 14 additions & 16 deletions homeassistant/components/zwave_js/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

import voluptuous as vol
from zwave_js_server.client import Client as ZwaveClient
from zwave_js_server.const import CommandClass, CommandStatus
from zwave_js_server.const import SET_VALUE_SUCCESS, CommandClass, CommandStatus
from zwave_js_server.exceptions import FailedZWaveCommand, SetValueFailed
from zwave_js_server.model.endpoint import Endpoint
from zwave_js_server.model.node import Node as ZwaveNode
Expand Down Expand Up @@ -39,12 +39,6 @@

_LOGGER = logging.getLogger(__name__)

SET_VALUE_FAILED_EXC = SetValueFailed(
"Unable to set value, refer to "
"https://zwave-js.github.io/node-zwave-js/#/api/node?id=setvalue for "
"possible reasons"
)


def parameter_name_does_not_need_bitmask(
val: dict[str, int | str | list[str]]
Expand Down Expand Up @@ -538,16 +532,20 @@ async def async_set_value(self, service: ServiceCall) -> None:
nodes_list = list(nodes)
# multiple set_values my fail so we will track the entire list
set_value_failed_nodes_list: list[ZwaveNode | Endpoint] = []
for node_, success in get_valid_responses_from_results(nodes_list, results):
if success is False:
# If we failed to set a value, add node to SetValueFailed exception list
set_value_failed_error_list: list[SetValueFailed] = []
for node_, result in get_valid_responses_from_results(nodes_list, results):
if result and result.status not in SET_VALUE_SUCCESS:
# If we failed to set a value, add node to exception list
set_value_failed_nodes_list.append(node_)
set_value_failed_error_list.append(
SetValueFailed(f"{result.status} {result.message}")
)

# Add the SetValueFailed exception to the results and the nodes to the node
# list. No-op if there are no SetValueFailed exceptions
# Add the exception to the results and the nodes to the node list. No-op if
# no set value commands failed
raise_exceptions_from_results(
(*nodes_list, *set_value_failed_nodes_list),
(*results, *([SET_VALUE_FAILED_EXC] * len(set_value_failed_nodes_list))),
(*results, *set_value_failed_error_list),
)

async def async_multicast_set_value(self, service: ServiceCall) -> None:
Expand Down Expand Up @@ -611,7 +609,7 @@ async def async_multicast_set_value(self, service: ServiceCall) -> None:
new_value = str(new_value)

try:
success = await async_multicast_set_value(
result = await async_multicast_set_value(
client=client,
new_value=new_value,
value_data=value,
Expand All @@ -621,10 +619,10 @@ async def async_multicast_set_value(self, service: ServiceCall) -> None:
except FailedZWaveCommand as err:
raise HomeAssistantError("Unable to set value via multicast") from err

if success is False:
if result.status not in SET_VALUE_SUCCESS:
raise HomeAssistantError(
"Unable to set value via multicast"
) from SetValueFailed
) from SetValueFailed(f"{result.status} {result.message}")

async def async_ping(self, service: ServiceCall) -> None:
"""Ping node(s)."""
Expand Down
2 changes: 1 addition & 1 deletion requirements_all.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2768,7 +2768,7 @@ zigpy==0.56.2
zm-py==0.5.2

# homeassistant.components.zwave_js
zwave-js-server-python==0.49.0
zwave-js-server-python==0.50.0

# homeassistant.components.zwave_me
zwave-me-ws==0.4.3
2 changes: 1 addition & 1 deletion requirements_test_all.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2029,7 +2029,7 @@ zigpy-znp==0.11.3
zigpy==0.56.2

# homeassistant.components.zwave_js
zwave-js-server-python==0.49.0
zwave-js-server-python==0.50.0

# homeassistant.components.zwave_me
zwave-me-ws==0.4.3
10 changes: 10 additions & 0 deletions tests/components/zwave_js/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,16 @@

PROPERTY_ULTRAVIOLET = "Ultraviolet"

SET_VALUE_RESULT_MAP = {
True: {"result": {"success": True, "status": 255}},
False: {"result": {"status": 2, "message": "test"}},
}


def set_value_response(client, success):
"""Set response for set_value command."""
client.async_send_command.return_value = SET_VALUE_RESULT_MAP[success]


def replace_value_of_zwave_value(
node_data: NodeDataType, matchers: list[ZwaveValueMatcher], new_value: Any
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -270,5 +270,5 @@
}
]
},
"replaced": false
"reason": 0
}
2 changes: 1 addition & 1 deletion tests/components/zwave_js/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -1715,7 +1715,7 @@ async def test_remove_node(
assert len(client.async_send_command.call_args_list) == 1
assert client.async_send_command.call_args[0][0] == {
"command": "controller.begin_exclusion",
"strategy": 0,
"options": {"strategy": 0},
}

# Test FailedZWaveCommand is caught
Expand Down
12 changes: 12 additions & 0 deletions tests/components/zwave_js/test_climate.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
CLIMATE_MAIN_HEAT_ACTIONNER,
CLIMATE_RADIO_THERMOSTAT_ENTITY,
replace_value_of_zwave_value,
set_value_response,
)


Expand Down Expand Up @@ -87,6 +88,7 @@ async def test_thermostat_v2(
)

client.async_send_command.reset_mock()
set_value_response(client, True)

# Test setting hvac mode
await hass.services.async_call(
Expand All @@ -111,6 +113,7 @@ async def test_thermostat_v2(
assert args["value"] == 2

client.async_send_command.reset_mock()
set_value_response(client, True)

# Test setting temperature
await hass.services.async_call(
Expand Down Expand Up @@ -146,6 +149,7 @@ async def test_thermostat_v2(
assert args["value"] == 77

client.async_send_command.reset_mock()
set_value_response(client, True)

# Test cool mode update from value updated event
event = Event(
Expand Down Expand Up @@ -200,6 +204,7 @@ async def test_thermostat_v2(
assert state.attributes[ATTR_TARGET_TEMP_LOW] == 22.2

client.async_send_command.reset_mock()
set_value_response(client, True)

# Test setting temperature with heat_cool
await hass.services.async_call(
Expand Down Expand Up @@ -237,6 +242,7 @@ async def test_thermostat_v2(
assert args["value"] == 86

client.async_send_command.reset_mock()
set_value_response(client, True)

# Test setting invalid hvac mode
with pytest.raises(ValueError):
Expand All @@ -251,6 +257,7 @@ async def test_thermostat_v2(
)

client.async_send_command.reset_mock()
set_value_response(client, True)

# Test setting fan mode
await hass.services.async_call(
Expand All @@ -275,6 +282,7 @@ async def test_thermostat_v2(
assert args["value"] == 1

client.async_send_command.reset_mock()
set_value_response(client, True)

# Test setting invalid fan mode
with pytest.raises(ValueError):
Expand Down Expand Up @@ -571,6 +579,8 @@ async def test_preset_and_no_setpoint(
assert state.state == HVACMode.HEAT
assert state.attributes[ATTR_TEMPERATURE] == 22

set_value_response(client, True)

# Test setting preset mode Full power
await hass.services.async_call(
CLIMATE_DOMAIN,
Expand All @@ -594,6 +604,7 @@ async def test_preset_and_no_setpoint(
assert args["value"] == 15

client.async_send_command.reset_mock()
set_value_response(client, True)

# Test Full power preset update from value updated event
event = Event(
Expand Down Expand Up @@ -635,6 +646,7 @@ async def test_preset_and_no_setpoint(
assert len(client.async_send_command.call_args_list) == 0

client.async_send_command.reset_mock()
set_value_response(client, True)

# Restore hvac mode by setting preset None
await hass.services.async_call(
Expand Down
Loading

0 comments on commit eeec138

Please sign in to comment.