diff --git a/homeassistant/components/ozw/services.py b/homeassistant/components/ozw/services.py index f950e68d2b4..b9281953ac9 100644 --- a/homeassistant/components/ozw/services.py +++ b/homeassistant/components/ozw/services.py @@ -68,73 +68,60 @@ class ZWaveServices: selection = service.data[const.ATTR_CONFIG_VALUE] payload = None - node = self._manager.get_instance(instance_id).get_node(node_id).values() + value = ( + self._manager.get_instance(instance_id) + .get_node(node_id) + .get_value(CommandClass.CONFIGURATION, param) + ) - for value in node: - if ( - value.command_class != CommandClass.CONFIGURATION - or value.index != param - ): - continue + if value.type == ValueType.BOOL: + payload = selection == "True" - if value.type == ValueType.BOOL: - payload = selection == "True" + if value.type == ValueType.LIST: + # accept either string from the list value OR the int value + for selected in value.value["List"]: + if selection not in (selected["Label"], selected["Value"]): + continue + payload = int(selected["Value"]) - if value.type == ValueType.LIST: - # accept either string from the list value OR the int value - if isinstance(selection, int): - if selection > value.max or selection < value.min: - _LOGGER.error( - "Value %s out of range for parameter %s (Min: %s Max: %s)", - selection, - param, - value.min, - value.max, - ) - return - payload = int(selection) - - # iterate list labels to get value - for selected in value.value["List"]: - if selected["Label"] != selection: - continue - payload = int(selected["Value"]) - - if payload is None: - _LOGGER.error( - "Invalid value %s for parameter %s", selection, param, - ) - return - - if value.type == ValueType.BUTTON: - # Unsupported at this time - _LOGGER.info("Button type not supported yet") + if payload is None: + _LOGGER.error( + "Invalid value %s for parameter %s", selection, param, + ) return - if value.type == ValueType.STRING: - payload = selection - - if value.type == ValueType.INT or value.type == ValueType.BYTE: - if selection > value.max or selection < value.min: - _LOGGER.error( - "Value %s out of range for parameter %s (Min: %s Max: %s)", - selection, - param, - value.min, - value.max, - ) - return - payload = int(selection) - - value.send_value(payload) # send the payload - _LOGGER.info( - "Setting configuration parameter %s on Node %s with value %s", - param, - node_id, - payload, - ) + if value.type == ValueType.BUTTON: + # Unsupported at this time + _LOGGER.info("Button type not supported yet") return + if value.type == ValueType.STRING: + payload = selection + + if ( + value.type == ValueType.INT + or value.type == ValueType.BYTE + or value.type == ValueType.SHORT + ): + if selection > value.max or selection < value.min: + _LOGGER.error( + "Value %s out of range for parameter %s (Min: %s Max: %s)", + selection, + param, + value.min, + value.max, + ) + return + payload = int(selection) + + value.send_value(payload) # send the payload + _LOGGER.info( + "Setting configuration parameter %s on Node %s with value %s", + param, + node_id, + payload, + ) + @callback def async_add_node(self, service): """Enter inclusion mode on the controller.""" diff --git a/tests/components/ozw/test_services.py b/tests/components/ozw/test_services.py index 9ea4e4f496b..1460e69b9c9 100644 --- a/tests/components/ozw/test_services.py +++ b/tests/components/ozw/test_services.py @@ -2,61 +2,61 @@ from .common import setup_ozw -async def test_services(hass, lock_data, sent_messages, lock_msg, caplog): +async def test_services(hass, light_data, sent_messages, light_msg, caplog): """Test services on lock.""" - await setup_ozw(hass, fixture=lock_data) + await setup_ozw(hass, fixture=light_data) # Test set_config_parameter list by label await hass.services.async_call( "ozw", "set_config_parameter", - {"node_id": 10, "parameter": 1, "value": "Disabled"}, + {"node_id": 39, "parameter": 1, "value": "Disable"}, blocking=True, ) assert len(sent_messages) == 1 msg = sent_messages[0] assert msg["topic"] == "OpenZWave/1/command/setvalue/" - assert msg["payload"] == {"Value": 0, "ValueIDKey": 281475154706452} + assert msg["payload"] == {"Value": 0, "ValueIDKey": 281475641245716} # Test set_config_parameter list by index int await hass.services.async_call( "ozw", "set_config_parameter", - {"node_id": 10, "parameter": 1, "value": 0}, + {"node_id": 39, "parameter": 1, "value": 1}, blocking=True, ) assert len(sent_messages) == 2 msg = sent_messages[1] assert msg["topic"] == "OpenZWave/1/command/setvalue/" - assert msg["payload"] == {"Value": 0, "ValueIDKey": 281475154706452} + assert msg["payload"] == {"Value": 1, "ValueIDKey": 281475641245716} # Test set_config_parameter int await hass.services.async_call( "ozw", "set_config_parameter", - {"node_id": 10, "parameter": 6, "value": 0}, + {"node_id": 39, "parameter": 3, "value": 55}, blocking=True, ) assert len(sent_messages) == 3 msg = sent_messages[2] assert msg["topic"] == "OpenZWave/1/command/setvalue/" - assert msg["payload"] == {"Value": 0, "ValueIDKey": 1688850038259731} + assert msg["payload"] == {"Value": 55, "ValueIDKey": 844425594667027} # Test set_config_parameter invalid list int await hass.services.async_call( "ozw", "set_config_parameter", - {"node_id": 10, "parameter": 1, "value": 12}, + {"node_id": 39, "parameter": 1, "value": 12}, blocking=True, ) assert len(sent_messages) == 3 - assert "Value 12 out of range for parameter 1" in caplog.text + assert "Invalid value 12 for parameter 1" in caplog.text # Test set_config_parameter invalid list string await hass.services.async_call( "ozw", "set_config_parameter", - {"node_id": 10, "parameter": 1, "value": "Blah"}, + {"node_id": 39, "parameter": 1, "value": "Blah"}, blocking=True, ) assert len(sent_messages) == 3 @@ -66,8 +66,32 @@ async def test_services(hass, lock_data, sent_messages, lock_msg, caplog): await hass.services.async_call( "ozw", "set_config_parameter", - {"node_id": 10, "parameter": 6, "value": 2147483657}, + {"node_id": 39, "parameter": 3, "value": 2147483657}, blocking=True, ) assert len(sent_messages) == 3 - assert "Value 12 out of range for parameter 1" in caplog.text + assert "Value 2147483657 out of range for parameter 3" in caplog.text + + # Test set_config_parameter short + await hass.services.async_call( + "ozw", + "set_config_parameter", + {"node_id": 39, "parameter": 81, "value": 3000}, + blocking=True, + ) + assert len(sent_messages) == 4 + msg = sent_messages[3] + assert msg["topic"] == "OpenZWave/1/command/setvalue/" + assert msg["payload"] == {"Value": 3000, "ValueIDKey": 22799473778098198} + + # Test set_config_parameter byte + await hass.services.async_call( + "ozw", + "set_config_parameter", + {"node_id": 39, "parameter": 16, "value": 20}, + blocking=True, + ) + assert len(sent_messages) == 5 + msg = sent_messages[4] + assert msg["topic"] == "OpenZWave/1/command/setvalue/" + assert msg["payload"] == {"Value": 20, "ValueIDKey": 4503600291905553}