Change Z-Wave JS discovery logic to adopt changes to DeviceClass (#46983)

Co-authored-by: raman325 <7243222+raman325@users.noreply.github.com>
This commit is contained in:
Marcel van der Veldt 2021-02-24 21:59:06 +01:00 committed by GitHub
parent afae253432
commit 23cbd2dda3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
37 changed files with 261 additions and 339 deletions

View file

@ -429,10 +429,9 @@ async def websocket_update_log_config(
"""Update the driver log config.""" """Update the driver log config."""
entry_id = msg[ENTRY_ID] entry_id = msg[ENTRY_ID]
client = hass.data[DOMAIN][entry_id][DATA_CLIENT] client = hass.data[DOMAIN][entry_id][DATA_CLIENT]
result = await client.driver.async_update_log_config(LogConfig(**msg[CONFIG])) await client.driver.async_update_log_config(LogConfig(**msg[CONFIG]))
connection.send_result( connection.send_result(
msg[ID], msg[ID],
result,
) )

View file

@ -287,7 +287,7 @@ class ZWaveBooleanBinarySensor(ZWaveBaseEntity, BinarySensorEntity):
if self.info.primary_value.command_class == CommandClass.SENSOR_BINARY: if self.info.primary_value.command_class == CommandClass.SENSOR_BINARY:
# Legacy binary sensors are phased out (replaced by notification sensors) # Legacy binary sensors are phased out (replaced by notification sensors)
# Disable by default to not confuse users # Disable by default to not confuse users
if self.info.node.device_class.generic != "Binary Sensor": if self.info.node.device_class.generic.key != 0x20:
return False return False
return True return True

View file

@ -4,6 +4,7 @@ from dataclasses import dataclass
from typing import Generator, List, Optional, Set, Union from typing import Generator, List, Optional, Set, Union
from zwave_js_server.const import CommandClass from zwave_js_server.const import CommandClass
from zwave_js_server.model.device_class import DeviceClassItem
from zwave_js_server.model.node import Node as ZwaveNode from zwave_js_server.model.node import Node as ZwaveNode
from zwave_js_server.model.value import Value as ZwaveValue from zwave_js_server.model.value import Value as ZwaveValue
@ -72,11 +73,11 @@ class ZWaveDiscoverySchema:
# [optional] the node's firmware_version must match ANY of these values # [optional] the node's firmware_version must match ANY of these values
firmware_version: Optional[Set[str]] = None firmware_version: Optional[Set[str]] = None
# [optional] the node's basic device class must match ANY of these values # [optional] the node's basic device class must match ANY of these values
device_class_basic: Optional[Set[str]] = None device_class_basic: Optional[Set[Union[str, int]]] = None
# [optional] the node's generic device class must match ANY of these values # [optional] the node's generic device class must match ANY of these values
device_class_generic: Optional[Set[str]] = None device_class_generic: Optional[Set[Union[str, int]]] = None
# [optional] the node's specific device class must match ANY of these values # [optional] the node's specific device class must match ANY of these values
device_class_specific: Optional[Set[str]] = None device_class_specific: Optional[Set[Union[str, int]]] = None
# [optional] additional values that ALL need to be present on the node for this scheme to pass # [optional] additional values that ALL need to be present on the node for this scheme to pass
required_values: Optional[List[ZWaveValueDiscoverySchema]] = None required_values: Optional[List[ZWaveValueDiscoverySchema]] = None
# [optional] bool to specify if this primary value may be discovered by multiple platforms # [optional] bool to specify if this primary value may be discovered by multiple platforms
@ -416,21 +417,18 @@ def async_discover_values(node: ZwaveNode) -> Generator[ZwaveDiscoveryInfo, None
): ):
continue continue
# check device_class_basic # check device_class_basic
if ( if not check_device_class(
schema.device_class_basic is not None value.node.device_class.basic, schema.device_class_basic
and value.node.device_class.basic not in schema.device_class_basic
): ):
continue continue
# check device_class_generic # check device_class_generic
if ( if not check_device_class(
schema.device_class_generic is not None value.node.device_class.generic, schema.device_class_generic
and value.node.device_class.generic not in schema.device_class_generic
): ):
continue continue
# check device_class_specific # check device_class_specific
if ( if not check_device_class(
schema.device_class_specific is not None value.node.device_class.specific, schema.device_class_specific
and value.node.device_class.specific not in schema.device_class_specific
): ):
continue continue
# check primary value # check primary value
@ -474,3 +472,18 @@ def check_value(value: ZwaveValue, schema: ZWaveValueDiscoverySchema) -> bool:
if schema.type is not None and value.metadata.type not in schema.type: if schema.type is not None and value.metadata.type not in schema.type:
return False return False
return True return True
@callback
def check_device_class(
device_class: DeviceClassItem, required_value: Optional[Set[Union[str, int]]]
) -> bool:
"""Check if device class id or label matches."""
if required_value is None:
return True
for val in required_value:
if isinstance(val, str) and device_class.label == val:
return True
if isinstance(val, int) and device_class.key == val:
return True
return False

View file

@ -3,7 +3,7 @@
"name": "Z-Wave JS", "name": "Z-Wave JS",
"config_flow": true, "config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/zwave_js", "documentation": "https://www.home-assistant.io/integrations/zwave_js",
"requirements": ["zwave-js-server-python==0.18.0"], "requirements": ["zwave-js-server-python==0.19.0"],
"codeowners": ["@home-assistant/z-wave"], "codeowners": ["@home-assistant/z-wave"],
"dependencies": ["http", "websocket_api"] "dependencies": ["http", "websocket_api"]
} }

View file

@ -2406,4 +2406,4 @@ zigpy==0.32.0
zm-py==0.5.2 zm-py==0.5.2
# homeassistant.components.zwave_js # homeassistant.components.zwave_js
zwave-js-server-python==0.18.0 zwave-js-server-python==0.19.0

View file

@ -1243,4 +1243,4 @@ zigpy-znp==0.4.0
zigpy==0.32.0 zigpy==0.32.0
# homeassistant.components.zwave_js # homeassistant.components.zwave_js
zwave-js-server-python==0.18.0 zwave-js-server-python==0.19.0

View file

@ -345,7 +345,6 @@ async def test_update_log_config(hass, client, integration, hass_ws_client):
} }
) )
msg = await ws_client.receive_json() msg = await ws_client.receive_json()
assert msg["result"]
assert msg["success"] assert msg["success"]
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command.call_args_list) == 1
@ -366,7 +365,6 @@ async def test_update_log_config(hass, client, integration, hass_ws_client):
} }
) )
msg = await ws_client.receive_json() msg = await ws_client.receive_json()
assert msg["result"]
assert msg["success"] assert msg["success"]
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command.call_args_list) == 1
@ -393,7 +391,6 @@ async def test_update_log_config(hass, client, integration, hass_ws_client):
} }
) )
msg = await ws_client.receive_json() msg = await ws_client.receive_json()
assert msg["result"]
assert msg["success"] assert msg["success"]
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command.call_args_list) == 1

View file

@ -69,8 +69,8 @@ async def test_thermostat_v2(
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 13 assert args["nodeId"] == 13
assert args["valueId"] == { assert args["valueId"] == {
@ -92,7 +92,7 @@ async def test_thermostat_v2(
} }
assert args["value"] == 1 assert args["value"] == 1
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test setting hvac mode # Test setting hvac mode
await hass.services.async_call( await hass.services.async_call(
@ -105,8 +105,8 @@ async def test_thermostat_v2(
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 13 assert args["nodeId"] == 13
assert args["valueId"] == { assert args["valueId"] == {
@ -128,7 +128,7 @@ async def test_thermostat_v2(
} }
assert args["value"] == 2 assert args["value"] == 2
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test setting temperature # Test setting temperature
await hass.services.async_call( await hass.services.async_call(
@ -142,8 +142,8 @@ async def test_thermostat_v2(
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 2 assert len(client.async_send_command_no_wait.call_args_list) == 2
args = client.async_send_command.call_args_list[0][0][0] args = client.async_send_command_no_wait.call_args_list[0][0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 13 assert args["nodeId"] == 13
assert args["valueId"] == { assert args["valueId"] == {
@ -164,7 +164,7 @@ async def test_thermostat_v2(
"value": 1, "value": 1,
} }
assert args["value"] == 2 assert args["value"] == 2
args = client.async_send_command.call_args_list[1][0][0] args = client.async_send_command_no_wait.call_args_list[1][0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 13 assert args["nodeId"] == 13
assert args["valueId"] == { assert args["valueId"] == {
@ -186,7 +186,7 @@ async def test_thermostat_v2(
} }
assert args["value"] == 77 assert args["value"] == 77
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test cool mode update from value updated event # Test cool mode update from value updated event
event = Event( event = Event(
@ -237,7 +237,7 @@ async def test_thermostat_v2(
assert state.attributes[ATTR_TARGET_TEMP_HIGH] == 22.8 assert state.attributes[ATTR_TARGET_TEMP_HIGH] == 22.8
assert state.attributes[ATTR_TARGET_TEMP_LOW] == 22.2 assert state.attributes[ATTR_TARGET_TEMP_LOW] == 22.2
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test setting temperature with heat_cool # Test setting temperature with heat_cool
await hass.services.async_call( await hass.services.async_call(
@ -251,8 +251,8 @@ async def test_thermostat_v2(
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 2 assert len(client.async_send_command_no_wait.call_args_list) == 2
args = client.async_send_command.call_args_list[0][0][0] args = client.async_send_command_no_wait.call_args_list[0][0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 13 assert args["nodeId"] == 13
assert args["valueId"] == { assert args["valueId"] == {
@ -274,7 +274,7 @@ async def test_thermostat_v2(
} }
assert args["value"] == 77 assert args["value"] == 77
args = client.async_send_command.call_args_list[1][0][0] args = client.async_send_command_no_wait.call_args_list[1][0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 13 assert args["nodeId"] == 13
assert args["valueId"] == { assert args["valueId"] == {
@ -296,7 +296,7 @@ async def test_thermostat_v2(
} }
assert args["value"] == 86 assert args["value"] == 86
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
with pytest.raises(ValueError): with pytest.raises(ValueError):
# Test setting unknown preset mode # Test setting unknown preset mode
@ -310,7 +310,7 @@ async def test_thermostat_v2(
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 0 assert len(client.async_send_command_no_wait.call_args_list) == 0
# Test setting invalid hvac mode # Test setting invalid hvac mode
with pytest.raises(ValueError): with pytest.raises(ValueError):
@ -336,7 +336,7 @@ async def test_thermostat_v2(
blocking=True, blocking=True,
) )
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test setting fan mode # Test setting fan mode
await hass.services.async_call( await hass.services.async_call(
@ -349,8 +349,8 @@ async def test_thermostat_v2(
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 13 assert args["nodeId"] == 13
assert args["valueId"] == { assert args["valueId"] == {
@ -373,7 +373,7 @@ async def test_thermostat_v2(
} }
assert args["value"] == 1 assert args["value"] == 1
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test setting invalid fan mode # Test setting invalid fan mode
with pytest.raises(ValueError): with pytest.raises(ValueError):
@ -408,7 +408,7 @@ async def test_setpoint_thermostat(hass, client, climate_danfoss_lc_13, integrat
assert state.attributes[ATTR_HVAC_MODES] == [HVAC_MODE_HEAT] assert state.attributes[ATTR_HVAC_MODES] == [HVAC_MODE_HEAT]
assert state.attributes[ATTR_PRESET_MODE] == PRESET_NONE assert state.attributes[ATTR_PRESET_MODE] == PRESET_NONE
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test setting temperature # Test setting temperature
await hass.services.async_call( await hass.services.async_call(
@ -421,8 +421,8 @@ async def test_setpoint_thermostat(hass, client, climate_danfoss_lc_13, integrat
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args_list[0][0][0] args = client.async_send_command_no_wait.call_args_list[0][0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 5 assert args["nodeId"] == 5
assert args["valueId"] == { assert args["valueId"] == {
@ -444,7 +444,7 @@ async def test_setpoint_thermostat(hass, client, climate_danfoss_lc_13, integrat
} }
assert args["value"] == 21.5 assert args["value"] == 21.5
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test setpoint mode update from value updated event # Test setpoint mode update from value updated event
event = Event( event = Event(
@ -471,7 +471,7 @@ async def test_setpoint_thermostat(hass, client, climate_danfoss_lc_13, integrat
assert state.state == HVAC_MODE_HEAT assert state.state == HVAC_MODE_HEAT
assert state.attributes[ATTR_TEMPERATURE] == 23 assert state.attributes[ATTR_TEMPERATURE] == 23
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
async def test_thermostat_heatit(hass, client, climate_heatit_z_trm3, integration): async def test_thermostat_heatit(hass, client, climate_heatit_z_trm3, integration):

View file

@ -38,8 +38,8 @@ async def test_window_cover(hass, client, chain_actuator_zws12, integration):
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 6 assert args["nodeId"] == 6
assert args["valueId"] == { assert args["valueId"] == {
@ -60,7 +60,7 @@ async def test_window_cover(hass, client, chain_actuator_zws12, integration):
} }
assert args["value"] == 50 assert args["value"] == 50
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test setting position # Test setting position
await hass.services.async_call( await hass.services.async_call(
@ -70,8 +70,8 @@ async def test_window_cover(hass, client, chain_actuator_zws12, integration):
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 6 assert args["nodeId"] == 6
assert args["valueId"] == { assert args["valueId"] == {
@ -92,7 +92,7 @@ async def test_window_cover(hass, client, chain_actuator_zws12, integration):
} }
assert args["value"] == 0 assert args["value"] == 0
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test opening # Test opening
await hass.services.async_call( await hass.services.async_call(
@ -102,8 +102,8 @@ async def test_window_cover(hass, client, chain_actuator_zws12, integration):
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 6 assert args["nodeId"] == 6
assert args["valueId"] == { assert args["valueId"] == {
@ -124,7 +124,7 @@ async def test_window_cover(hass, client, chain_actuator_zws12, integration):
} }
assert args["value"] assert args["value"]
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test stop after opening # Test stop after opening
await hass.services.async_call( await hass.services.async_call(
"cover", "cover",
@ -133,8 +133,8 @@ async def test_window_cover(hass, client, chain_actuator_zws12, integration):
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 2 assert len(client.async_send_command_no_wait.call_args_list) == 2
open_args = client.async_send_command.call_args_list[0][0][0] open_args = client.async_send_command_no_wait.call_args_list[0][0][0]
assert open_args["command"] == "node.set_value" assert open_args["command"] == "node.set_value"
assert open_args["nodeId"] == 6 assert open_args["nodeId"] == 6
assert open_args["valueId"] == { assert open_args["valueId"] == {
@ -153,7 +153,7 @@ async def test_window_cover(hass, client, chain_actuator_zws12, integration):
} }
assert not open_args["value"] assert not open_args["value"]
close_args = client.async_send_command.call_args_list[1][0][0] close_args = client.async_send_command_no_wait.call_args_list[1][0][0]
assert close_args["command"] == "node.set_value" assert close_args["command"] == "node.set_value"
assert close_args["nodeId"] == 6 assert close_args["nodeId"] == 6
assert close_args["valueId"] == { assert close_args["valueId"] == {
@ -191,7 +191,7 @@ async def test_window_cover(hass, client, chain_actuator_zws12, integration):
}, },
) )
node.receive_event(event) node.receive_event(event)
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
state = hass.states.get(WINDOW_COVER_ENTITY) state = hass.states.get(WINDOW_COVER_ENTITY)
assert state.state == "open" assert state.state == "open"
@ -203,8 +203,8 @@ async def test_window_cover(hass, client, chain_actuator_zws12, integration):
{"entity_id": WINDOW_COVER_ENTITY}, {"entity_id": WINDOW_COVER_ENTITY},
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 6 assert args["nodeId"] == 6
assert args["valueId"] == { assert args["valueId"] == {
@ -225,7 +225,7 @@ async def test_window_cover(hass, client, chain_actuator_zws12, integration):
} }
assert args["value"] == 0 assert args["value"] == 0
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test stop after closing # Test stop after closing
await hass.services.async_call( await hass.services.async_call(
@ -235,8 +235,8 @@ async def test_window_cover(hass, client, chain_actuator_zws12, integration):
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 2 assert len(client.async_send_command_no_wait.call_args_list) == 2
open_args = client.async_send_command.call_args_list[0][0][0] open_args = client.async_send_command_no_wait.call_args_list[0][0][0]
assert open_args["command"] == "node.set_value" assert open_args["command"] == "node.set_value"
assert open_args["nodeId"] == 6 assert open_args["nodeId"] == 6
assert open_args["valueId"] == { assert open_args["valueId"] == {
@ -255,7 +255,7 @@ async def test_window_cover(hass, client, chain_actuator_zws12, integration):
} }
assert not open_args["value"] assert not open_args["value"]
close_args = client.async_send_command.call_args_list[1][0][0] close_args = client.async_send_command_no_wait.call_args_list[1][0][0]
assert close_args["command"] == "node.set_value" assert close_args["command"] == "node.set_value"
assert close_args["nodeId"] == 6 assert close_args["nodeId"] == 6
assert close_args["valueId"] == { assert close_args["valueId"] == {
@ -274,7 +274,7 @@ async def test_window_cover(hass, client, chain_actuator_zws12, integration):
} }
assert not close_args["value"] assert not close_args["value"]
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
event = Event( event = Event(
type="value updated", type="value updated",
@ -314,8 +314,8 @@ async def test_motor_barrier_cover(hass, client, gdc_zw062, integration):
DOMAIN, SERVICE_OPEN_COVER, {"entity_id": GDC_COVER_ENTITY}, blocking=True DOMAIN, SERVICE_OPEN_COVER, {"entity_id": GDC_COVER_ENTITY}, blocking=True
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 12 assert args["nodeId"] == 12
assert args["value"] == 255 assert args["value"] == 255
@ -341,15 +341,15 @@ async def test_motor_barrier_cover(hass, client, gdc_zw062, integration):
state = hass.states.get(GDC_COVER_ENTITY) state = hass.states.get(GDC_COVER_ENTITY)
assert state.state == STATE_CLOSED assert state.state == STATE_CLOSED
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test close # Test close
await hass.services.async_call( await hass.services.async_call(
DOMAIN, SERVICE_CLOSE_COVER, {"entity_id": GDC_COVER_ENTITY}, blocking=True DOMAIN, SERVICE_CLOSE_COVER, {"entity_id": GDC_COVER_ENTITY}, blocking=True
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 12 assert args["nodeId"] == 12
assert args["value"] == 0 assert args["value"] == 0
@ -375,7 +375,7 @@ async def test_motor_barrier_cover(hass, client, gdc_zw062, integration):
state = hass.states.get(GDC_COVER_ENTITY) state = hass.states.get(GDC_COVER_ENTITY)
assert state.state == STATE_CLOSED assert state.state == STATE_CLOSED
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Barrier sends an opening state # Barrier sends an opening state
event = Event( event = Event(

View file

@ -4,7 +4,7 @@
async def test_iblinds_v2(hass, client, iblinds_v2, integration): async def test_iblinds_v2(hass, client, iblinds_v2, integration):
"""Test that an iBlinds v2.0 multilevel switch value is discovered as a cover.""" """Test that an iBlinds v2.0 multilevel switch value is discovered as a cover."""
node = iblinds_v2 node = iblinds_v2
assert node.device_class.specific == "Unused" assert node.device_class.specific.label == "Unused"
state = hass.states.get("light.window_blind_controller") state = hass.states.get("light.window_blind_controller")
assert not state assert not state
@ -16,7 +16,7 @@ async def test_iblinds_v2(hass, client, iblinds_v2, integration):
async def test_ge_12730(hass, client, ge_12730, integration): async def test_ge_12730(hass, client, ge_12730, integration):
"""Test GE 12730 Fan Controller v2.0 multilevel switch is discovered as a fan.""" """Test GE 12730 Fan Controller v2.0 multilevel switch is discovered as a fan."""
node = ge_12730 node = ge_12730
assert node.device_class.specific == "Multilevel Power Switch" assert node.device_class.specific.label == "Multilevel Power Switch"
state = hass.states.get("light.in_wall_smart_fan_control") state = hass.states.get("light.in_wall_smart_fan_control")
assert not state assert not state

View file

@ -23,8 +23,8 @@ async def test_fan(hass, client, in_wall_smart_fan_control, integration):
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 17 assert args["nodeId"] == 17
assert args["valueId"] == { assert args["valueId"] == {
@ -45,7 +45,7 @@ async def test_fan(hass, client, in_wall_smart_fan_control, integration):
} }
assert args["value"] == 66 assert args["value"] == 66
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test setting unknown speed # Test setting unknown speed
with pytest.raises(ValueError): with pytest.raises(ValueError):
@ -56,7 +56,7 @@ async def test_fan(hass, client, in_wall_smart_fan_control, integration):
blocking=True, blocking=True,
) )
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test turn on no speed # Test turn on no speed
await hass.services.async_call( await hass.services.async_call(
@ -66,8 +66,8 @@ async def test_fan(hass, client, in_wall_smart_fan_control, integration):
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 17 assert args["nodeId"] == 17
assert args["valueId"] == { assert args["valueId"] == {
@ -88,7 +88,7 @@ async def test_fan(hass, client, in_wall_smart_fan_control, integration):
} }
assert args["value"] == 255 assert args["value"] == 255
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test turning off # Test turning off
await hass.services.async_call( await hass.services.async_call(
@ -98,8 +98,8 @@ async def test_fan(hass, client, in_wall_smart_fan_control, integration):
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 17 assert args["nodeId"] == 17
assert args["valueId"] == { assert args["valueId"] == {
@ -120,7 +120,7 @@ async def test_fan(hass, client, in_wall_smart_fan_control, integration):
} }
assert args["value"] == 0 assert args["value"] == 0
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test speed update from value updated event # Test speed update from value updated event
event = Event( event = Event(
@ -146,7 +146,7 @@ async def test_fan(hass, client, in_wall_smart_fan_control, integration):
assert state.state == "on" assert state.state == "on"
assert state.attributes[ATTR_SPEED] == "high" assert state.attributes[ATTR_SPEED] == "high"
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
event = Event( event = Event(
type="value updated", type="value updated",

View file

@ -36,8 +36,8 @@ async def test_light(hass, client, bulb_6_multi_color, integration):
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 39 assert args["nodeId"] == 39
assert args["valueId"] == { assert args["valueId"] == {
@ -58,7 +58,7 @@ async def test_light(hass, client, bulb_6_multi_color, integration):
} }
assert args["value"] == 255 assert args["value"] == 255
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test brightness update from value updated event # Test brightness update from value updated event
event = Event( event = Event(
@ -93,9 +93,9 @@ async def test_light(hass, client, bulb_6_multi_color, integration):
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test turning on with brightness # Test turning on with brightness
await hass.services.async_call( await hass.services.async_call(
@ -105,8 +105,8 @@ async def test_light(hass, client, bulb_6_multi_color, integration):
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 39 assert args["nodeId"] == 39
assert args["valueId"] == { assert args["valueId"] == {
@ -127,7 +127,7 @@ async def test_light(hass, client, bulb_6_multi_color, integration):
} }
assert args["value"] == 50 assert args["value"] == 50
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test turning on with rgb color # Test turning on with rgb color
await hass.services.async_call( await hass.services.async_call(
@ -137,8 +137,10 @@ async def test_light(hass, client, bulb_6_multi_color, integration):
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 5 assert len(client.async_send_command_no_wait.call_args_list) == 5
warm_args = client.async_send_command.call_args_list[0][0][0] # warm white 0 warm_args = client.async_send_command_no_wait.call_args_list[0][0][
0
] # warm white 0
assert warm_args["command"] == "node.set_value" assert warm_args["command"] == "node.set_value"
assert warm_args["nodeId"] == 39 assert warm_args["nodeId"] == 39
assert warm_args["valueId"]["commandClassName"] == "Color Switch" assert warm_args["valueId"]["commandClassName"] == "Color Switch"
@ -149,7 +151,9 @@ async def test_light(hass, client, bulb_6_multi_color, integration):
assert warm_args["valueId"]["propertyName"] == "targetColor" assert warm_args["valueId"]["propertyName"] == "targetColor"
assert warm_args["value"] == 0 assert warm_args["value"] == 0
cold_args = client.async_send_command.call_args_list[1][0][0] # cold white 0 cold_args = client.async_send_command_no_wait.call_args_list[1][0][
0
] # cold white 0
assert cold_args["command"] == "node.set_value" assert cold_args["command"] == "node.set_value"
assert cold_args["nodeId"] == 39 assert cold_args["nodeId"] == 39
assert cold_args["valueId"]["commandClassName"] == "Color Switch" assert cold_args["valueId"]["commandClassName"] == "Color Switch"
@ -159,7 +163,7 @@ async def test_light(hass, client, bulb_6_multi_color, integration):
assert cold_args["valueId"]["property"] == "targetColor" assert cold_args["valueId"]["property"] == "targetColor"
assert cold_args["valueId"]["propertyName"] == "targetColor" assert cold_args["valueId"]["propertyName"] == "targetColor"
assert cold_args["value"] == 0 assert cold_args["value"] == 0
red_args = client.async_send_command.call_args_list[2][0][0] # red 255 red_args = client.async_send_command_no_wait.call_args_list[2][0][0] # red 255
assert red_args["command"] == "node.set_value" assert red_args["command"] == "node.set_value"
assert red_args["nodeId"] == 39 assert red_args["nodeId"] == 39
assert red_args["valueId"]["commandClassName"] == "Color Switch" assert red_args["valueId"]["commandClassName"] == "Color Switch"
@ -169,7 +173,7 @@ async def test_light(hass, client, bulb_6_multi_color, integration):
assert red_args["valueId"]["property"] == "targetColor" assert red_args["valueId"]["property"] == "targetColor"
assert red_args["valueId"]["propertyName"] == "targetColor" assert red_args["valueId"]["propertyName"] == "targetColor"
assert red_args["value"] == 255 assert red_args["value"] == 255
green_args = client.async_send_command.call_args_list[3][0][0] # green 76 green_args = client.async_send_command_no_wait.call_args_list[3][0][0] # green 76
assert green_args["command"] == "node.set_value" assert green_args["command"] == "node.set_value"
assert green_args["nodeId"] == 39 assert green_args["nodeId"] == 39
assert green_args["valueId"]["commandClassName"] == "Color Switch" assert green_args["valueId"]["commandClassName"] == "Color Switch"
@ -179,7 +183,7 @@ async def test_light(hass, client, bulb_6_multi_color, integration):
assert green_args["valueId"]["property"] == "targetColor" assert green_args["valueId"]["property"] == "targetColor"
assert green_args["valueId"]["propertyName"] == "targetColor" assert green_args["valueId"]["propertyName"] == "targetColor"
assert green_args["value"] == 76 assert green_args["value"] == 76
blue_args = client.async_send_command.call_args_list[4][0][0] # blue 255 blue_args = client.async_send_command_no_wait.call_args_list[4][0][0] # blue 255
assert blue_args["command"] == "node.set_value" assert blue_args["command"] == "node.set_value"
assert blue_args["nodeId"] == 39 assert blue_args["nodeId"] == 39
assert blue_args["valueId"]["commandClassName"] == "Color Switch" assert blue_args["valueId"]["commandClassName"] == "Color Switch"
@ -231,7 +235,7 @@ async def test_light(hass, client, bulb_6_multi_color, integration):
assert state.attributes[ATTR_COLOR_TEMP] == 370 assert state.attributes[ATTR_COLOR_TEMP] == 370
assert state.attributes[ATTR_RGB_COLOR] == (255, 76, 255) assert state.attributes[ATTR_RGB_COLOR] == (255, 76, 255)
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test turning on with same rgb color # Test turning on with same rgb color
await hass.services.async_call( await hass.services.async_call(
@ -241,9 +245,9 @@ async def test_light(hass, client, bulb_6_multi_color, integration):
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 5 assert len(client.async_send_command_no_wait.call_args_list) == 5
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test turning on with color temp # Test turning on with color temp
await hass.services.async_call( await hass.services.async_call(
@ -253,8 +257,8 @@ async def test_light(hass, client, bulb_6_multi_color, integration):
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 5 assert len(client.async_send_command_no_wait.call_args_list) == 5
red_args = client.async_send_command.call_args_list[0][0][0] # red 0 red_args = client.async_send_command_no_wait.call_args_list[0][0][0] # red 0
assert red_args["command"] == "node.set_value" assert red_args["command"] == "node.set_value"
assert red_args["nodeId"] == 39 assert red_args["nodeId"] == 39
assert red_args["valueId"]["commandClassName"] == "Color Switch" assert red_args["valueId"]["commandClassName"] == "Color Switch"
@ -264,7 +268,7 @@ async def test_light(hass, client, bulb_6_multi_color, integration):
assert red_args["valueId"]["property"] == "targetColor" assert red_args["valueId"]["property"] == "targetColor"
assert red_args["valueId"]["propertyName"] == "targetColor" assert red_args["valueId"]["propertyName"] == "targetColor"
assert red_args["value"] == 0 assert red_args["value"] == 0
red_args = client.async_send_command.call_args_list[1][0][0] # green 0 red_args = client.async_send_command_no_wait.call_args_list[1][0][0] # green 0
assert red_args["command"] == "node.set_value" assert red_args["command"] == "node.set_value"
assert red_args["nodeId"] == 39 assert red_args["nodeId"] == 39
assert red_args["valueId"]["commandClassName"] == "Color Switch" assert red_args["valueId"]["commandClassName"] == "Color Switch"
@ -274,7 +278,7 @@ async def test_light(hass, client, bulb_6_multi_color, integration):
assert red_args["valueId"]["property"] == "targetColor" assert red_args["valueId"]["property"] == "targetColor"
assert red_args["valueId"]["propertyName"] == "targetColor" assert red_args["valueId"]["propertyName"] == "targetColor"
assert red_args["value"] == 0 assert red_args["value"] == 0
red_args = client.async_send_command.call_args_list[2][0][0] # blue 0 red_args = client.async_send_command_no_wait.call_args_list[2][0][0] # blue 0
assert red_args["command"] == "node.set_value" assert red_args["command"] == "node.set_value"
assert red_args["nodeId"] == 39 assert red_args["nodeId"] == 39
assert red_args["valueId"]["commandClassName"] == "Color Switch" assert red_args["valueId"]["commandClassName"] == "Color Switch"
@ -284,7 +288,9 @@ async def test_light(hass, client, bulb_6_multi_color, integration):
assert red_args["valueId"]["property"] == "targetColor" assert red_args["valueId"]["property"] == "targetColor"
assert red_args["valueId"]["propertyName"] == "targetColor" assert red_args["valueId"]["propertyName"] == "targetColor"
assert red_args["value"] == 0 assert red_args["value"] == 0
warm_args = client.async_send_command.call_args_list[3][0][0] # warm white 0 warm_args = client.async_send_command_no_wait.call_args_list[3][0][
0
] # warm white 0
assert warm_args["command"] == "node.set_value" assert warm_args["command"] == "node.set_value"
assert warm_args["nodeId"] == 39 assert warm_args["nodeId"] == 39
assert warm_args["valueId"]["commandClassName"] == "Color Switch" assert warm_args["valueId"]["commandClassName"] == "Color Switch"
@ -294,7 +300,7 @@ async def test_light(hass, client, bulb_6_multi_color, integration):
assert warm_args["valueId"]["property"] == "targetColor" assert warm_args["valueId"]["property"] == "targetColor"
assert warm_args["valueId"]["propertyName"] == "targetColor" assert warm_args["valueId"]["propertyName"] == "targetColor"
assert warm_args["value"] == 20 assert warm_args["value"] == 20
red_args = client.async_send_command.call_args_list[4][0][0] # cold white red_args = client.async_send_command_no_wait.call_args_list[4][0][0] # cold white
assert red_args["command"] == "node.set_value" assert red_args["command"] == "node.set_value"
assert red_args["nodeId"] == 39 assert red_args["nodeId"] == 39
assert red_args["valueId"]["commandClassName"] == "Color Switch" assert red_args["valueId"]["commandClassName"] == "Color Switch"
@ -305,7 +311,7 @@ async def test_light(hass, client, bulb_6_multi_color, integration):
assert red_args["valueId"]["propertyName"] == "targetColor" assert red_args["valueId"]["propertyName"] == "targetColor"
assert red_args["value"] == 235 assert red_args["value"] == 235
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test color temp update from value updated event # Test color temp update from value updated event
red_event = Event( red_event = Event(
@ -361,9 +367,9 @@ async def test_light(hass, client, bulb_6_multi_color, integration):
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 5 assert len(client.async_send_command_no_wait.call_args_list) == 5
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test turning off # Test turning off
await hass.services.async_call( await hass.services.async_call(
@ -373,8 +379,8 @@ async def test_light(hass, client, bulb_6_multi_color, integration):
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 39 assert args["nodeId"] == 39
assert args["valueId"] == { assert args["valueId"] == {

View file

@ -33,8 +33,8 @@ async def test_door_lock(hass, client, lock_schlage_be469, integration):
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 20 assert args["nodeId"] == 20
assert args["valueId"] == { assert args["valueId"] == {
@ -64,7 +64,7 @@ async def test_door_lock(hass, client, lock_schlage_be469, integration):
} }
assert args["value"] == 255 assert args["value"] == 255
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test locked update from value updated event # Test locked update from value updated event
event = Event( event = Event(
@ -88,7 +88,7 @@ async def test_door_lock(hass, client, lock_schlage_be469, integration):
assert hass.states.get(SCHLAGE_BE469_LOCK_ENTITY).state == STATE_LOCKED assert hass.states.get(SCHLAGE_BE469_LOCK_ENTITY).state == STATE_LOCKED
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test unlocking # Test unlocking
await hass.services.async_call( await hass.services.async_call(
@ -98,8 +98,8 @@ async def test_door_lock(hass, client, lock_schlage_be469, integration):
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 20 assert args["nodeId"] == 20
assert args["valueId"] == { assert args["valueId"] == {
@ -129,7 +129,7 @@ async def test_door_lock(hass, client, lock_schlage_be469, integration):
} }
assert args["value"] == 0 assert args["value"] == 0
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test set usercode service # Test set usercode service
await hass.services.async_call( await hass.services.async_call(
@ -143,8 +143,8 @@ async def test_door_lock(hass, client, lock_schlage_be469, integration):
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 20 assert args["nodeId"] == 20
assert args["valueId"] == { assert args["valueId"] == {
@ -167,7 +167,7 @@ async def test_door_lock(hass, client, lock_schlage_be469, integration):
} }
assert args["value"] == "1234" assert args["value"] == "1234"
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test clear usercode # Test clear usercode
await hass.services.async_call( await hass.services.async_call(
@ -177,8 +177,8 @@ async def test_door_lock(hass, client, lock_schlage_be469, integration):
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 20 assert args["nodeId"] == 20
assert args["valueId"] == { assert args["valueId"] == {

View file

@ -20,8 +20,8 @@ async def test_number(hass, client, aeotec_radiator_thermostat, integration):
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 4 assert args["nodeId"] == 4
assert args["valueId"] == { assert args["valueId"] == {
@ -43,7 +43,7 @@ async def test_number(hass, client, aeotec_radiator_thermostat, integration):
} }
assert args["value"] == 30.0 assert args["value"] == 30.0
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test value update from value updated event # Test value update from value updated event
event = Event( event = Event(

View file

@ -302,15 +302,15 @@ async def test_poll_value(
): ):
"""Test the poll_value service.""" """Test the poll_value service."""
# Test polling the primary value # Test polling the primary value
client.async_send_command.return_value = {"result": 2} client.async_send_command_no_wait.return_value = {"result": 2}
await hass.services.async_call( await hass.services.async_call(
DOMAIN, DOMAIN,
SERVICE_REFRESH_VALUE, SERVICE_REFRESH_VALUE,
{ATTR_ENTITY_ID: CLIMATE_RADIO_THERMOSTAT_ENTITY}, {ATTR_ENTITY_ID: CLIMATE_RADIO_THERMOSTAT_ENTITY},
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.poll_value" assert args["command"] == "node.poll_value"
assert args["nodeId"] == 26 assert args["nodeId"] == 26
assert args["valueId"] == { assert args["valueId"] == {
@ -339,10 +339,10 @@ async def test_poll_value(
"ccVersion": 2, "ccVersion": 2,
} }
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test polling all watched values # Test polling all watched values
client.async_send_command.return_value = {"result": 2} client.async_send_command_no_wait.return_value = {"result": 2}
await hass.services.async_call( await hass.services.async_call(
DOMAIN, DOMAIN,
SERVICE_REFRESH_VALUE, SERVICE_REFRESH_VALUE,
@ -352,7 +352,7 @@ async def test_poll_value(
}, },
blocking=True, blocking=True,
) )
assert len(client.async_send_command.call_args_list) == 8 assert len(client.async_send_command_no_wait.call_args_list) == 8
# Test polling against an invalid entity raises ValueError # Test polling against an invalid entity raises ValueError
with pytest.raises(ValueError): with pytest.raises(ValueError):

View file

@ -21,7 +21,7 @@ async def test_switch(hass, hank_binary_switch, integration, client):
"switch", "turn_on", {"entity_id": SWITCH_ENTITY}, blocking=True "switch", "turn_on", {"entity_id": SWITCH_ENTITY}, blocking=True
) )
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 32 assert args["nodeId"] == 32
assert args["valueId"] == { assert args["valueId"] == {
@ -68,7 +68,7 @@ async def test_switch(hass, hank_binary_switch, integration, client):
"switch", "turn_off", {"entity_id": SWITCH_ENTITY}, blocking=True "switch", "turn_off", {"entity_id": SWITCH_ENTITY}, blocking=True
) )
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 32 assert args["nodeId"] == 32
assert args["valueId"] == { assert args["valueId"] == {
@ -102,8 +102,8 @@ async def test_barrier_signaling_switch(hass, gdc_zw062, integration, client):
DOMAIN, SERVICE_TURN_OFF, {"entity_id": entity}, blocking=True DOMAIN, SERVICE_TURN_OFF, {"entity_id": entity}, blocking=True
) )
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 12 assert args["nodeId"] == 12
assert args["value"] == 0 assert args["value"] == 0
@ -134,7 +134,7 @@ async def test_barrier_signaling_switch(hass, gdc_zw062, integration, client):
state = hass.states.get(entity) state = hass.states.get(entity)
assert state.state == STATE_OFF assert state.state == STATE_OFF
client.async_send_command.reset_mock() client.async_send_command_no_wait.reset_mock()
# Test turning on # Test turning on
await hass.services.async_call( await hass.services.async_call(
@ -143,8 +143,8 @@ async def test_barrier_signaling_switch(hass, gdc_zw062, integration, client):
# Note: the valueId's value is still 255 because we never # Note: the valueId's value is still 255 because we never
# received an updated value # received an updated value
assert len(client.async_send_command.call_args_list) == 1 assert len(client.async_send_command_no_wait.call_args_list) == 1
args = client.async_send_command.call_args[0][0] args = client.async_send_command_no_wait.call_args[0][0]
assert args["command"] == "node.set_value" assert args["command"] == "node.set_value"
assert args["nodeId"] == 12 assert args["nodeId"] == 12
assert args["value"] == 255 assert args["value"] == 255

View file

@ -6,10 +6,10 @@
"status": 4, "status": 4,
"ready": true, "ready": true,
"deviceClass": { "deviceClass": {
"basic": "Routing Slave", "basic": {"key": 4, "label": "Routing Slave"},
"generic": "Binary Switch", "generic": {"key": 16, "label":"Binary Switch"},
"specific": "Binary Power Switch", "specific": {"key": 1, "label":"Binary Power Switch"},
"mandatorySupportedCCs": ["Basic", "Binary Switch", "All Switch"], "mandatorySupportedCCs": [],
"mandatoryControlCCs": [] "mandatoryControlCCs": []
}, },
"isListening": true, "isListening": true,
@ -53,6 +53,7 @@
"userIcon": 1792 "userIcon": 1792
} }
], ],
"commandClasses": [],
"values": [ "values": [
{ {
"endpoint": 0, "endpoint": 0,

View file

@ -6,16 +6,10 @@
"status": 4, "status": 4,
"ready": true, "ready": true,
"deviceClass": { "deviceClass": {
"basic": "Routing Slave", "basic": {"key": 4, "label":"Routing Slave"},
"generic": "Thermostat", "generic": {"key": 8, "label":"Thermostat"},
"specific": "Thermostat General V2", "specific": {"key": 6, "label":"Thermostat General V2"},
"mandatorySupportedCCs": [ "mandatorySupportedCCs": [],
"Basic",
"Manufacturer Specific",
"Thermostat Mode",
"Thermostat Setpoint",
"Version"
],
"mandatoryControlCCs": [] "mandatoryControlCCs": []
}, },
"isListening": false, "isListening": false,

View file

@ -6,14 +6,10 @@
"status": 4, "status": 4,
"ready": true, "ready": true,
"deviceClass": { "deviceClass": {
"basic": "Static Controller", "basic": {"key": 2, "label": "Static Controller"},
"generic": "Multilevel Switch", "generic": {"key": 17, "label":"Multilevel Switch"},
"specific": "Multilevel Power Switch", "specific": {"key": 1, "label":"Multilevel Power Switch"},
"mandatorySupportedCCs": [ "mandatorySupportedCCs": [],
"Basic",
"Multilevel Switch",
"All Switch"
],
"mandatoryControlCCs": [] "mandatoryControlCCs": []
}, },
"isListening": true, "isListening": true,
@ -67,6 +63,7 @@
"userIcon": 1536 "userIcon": 1536
} }
], ],
"commandClasses": [],
"values": [ "values": [
{ {
"commandClassName": "Multilevel Switch", "commandClassName": "Multilevel Switch",

View file

@ -6,16 +6,10 @@
"status": 4, "status": 4,
"ready": true, "ready": true,
"deviceClass": { "deviceClass": {
"basic": "Routing Slave", "basic": {"key": 4, "label":"Routing Slave"},
"generic": "Multilevel Switch", "generic": {"key": 17, "label":"Multilevel Switch"},
"specific": "Motor Control Class C", "specific": {"key": 7, "label":"Motor Control Class C"},
"mandatorySupportedCCs": [ "mandatorySupportedCCs": [],
"Basic",
"Multilevel Switch",
"Binary Switch",
"Manufacturer Specific",
"Version"
],
"mandatoryControlCCs": [] "mandatoryControlCCs": []
}, },
"isListening": true, "isListening": true,
@ -52,6 +46,7 @@
"endpoints": [ "endpoints": [
{ "nodeId": 6, "index": 0, "installerIcon": 6656, "userIcon": 6656 } { "nodeId": 6, "index": 0, "installerIcon": 6656, "userIcon": 6656 }
], ],
"commandClasses": [],
"values": [ "values": [
{ {
"commandClassName": "Multilevel Switch", "commandClassName": "Multilevel Switch",

View file

@ -4,15 +4,10 @@
"status": 1, "status": 1,
"ready": true, "ready": true,
"deviceClass": { "deviceClass": {
"basic": "Routing Slave", "basic": {"key": 4, "label":"Routing Slave"},
"generic": "Thermostat", "generic": {"key": 8, "label":"Thermostat"},
"specific": "Setpoint Thermostat", "specific": {"key": 4, "label":"Setpoint Thermostat"},
"mandatorySupportedCCs": [ "mandatorySupportedCCs": [],
"Manufacturer Specific",
"Multi Command",
"Thermostat Setpoint",
"Version"
],
"mandatoryControlCCs": [] "mandatoryControlCCs": []
}, },
"isListening": false, "isListening": false,
@ -77,6 +72,7 @@
"index": 0 "index": 0
} }
], ],
"commandClasses": [],
"values": [ "values": [
{ {
"endpoint": 0, "endpoint": 0,

View file

@ -6,16 +6,10 @@
"status": 4, "status": 4,
"ready": true, "ready": true,
"deviceClass": { "deviceClass": {
"basic": "Routing Slave", "basic": {"key": 4, "label":"Routing Slave"},
"generic": "Thermostat", "generic": {"key": 8, "label":"Thermostat"},
"specific": "Thermostat General V2", "specific": {"key": 6, "label":"Thermostat General V2"},
"mandatorySupportedCCs": [ "mandatorySupportedCCs": [],
"Basic",
"Manufacturer Specific",
"Thermostat Mode",
"Thermostat Setpoint",
"Version"
],
"mandatoryControlCCs": [] "mandatoryControlCCs": []
}, },
"isListening": true, "isListening": true,
@ -116,6 +110,7 @@
"userIcon": 3329 "userIcon": 3329
} }
], ],
"commandClasses": [],
"values": [ "values": [
{ {
"endpoint": 0, "endpoint": 0,

View file

@ -6,16 +6,10 @@
"status": 4, "status": 4,
"ready": true, "ready": true,
"deviceClass": { "deviceClass": {
"basic": "Routing Slave", "basic": {"key": 4, "label":"Routing Slave"},
"generic": "Thermostat", "generic": {"key": 8, "label":"Thermostat"},
"specific": "Thermostat General V2", "specific": {"key": 6, "label":"Thermostat General V2"},
"mandatorySupportedCCs": [ "mandatorySupportedCCs": [],
"Basic",
"Manufacturer Specific",
"Thermostat Mode",
"Thermostat Setpoint",
"Version"
],
"mandatoryControlCCs": [] "mandatoryControlCCs": []
}, },
"isListening": true, "isListening": true,
@ -63,6 +57,7 @@
"userIcon": 3333 "userIcon": 3333
} }
], ],
"commandClasses": [],
"values": [ "values": [
{ {
"commandClassName": "Manufacturer Specific", "commandClassName": "Manufacturer Specific",

View file

@ -6,16 +6,10 @@
"status": 4, "status": 4,
"ready": true, "ready": true,
"deviceClass": { "deviceClass": {
"basic": "Static Controller", "basic": {"key": 2, "label":"Static Controller"},
"generic": "Thermostat", "generic": {"key": 8, "label":"Thermostat"},
"specific": "Thermostat General V2", "specific": {"key": 6, "label":"Thermostat General V2"},
"mandatorySupportedCCs": [ "mandatorySupportedCCs": [],
"Basic",
"Manufacturer Specific",
"Thermostat Mode",
"Thermostat Setpoint",
"Version"
],
"mandatoryControlCCs": [] "mandatoryControlCCs": []
}, },
"isListening": true, "isListening": true,
@ -63,6 +57,7 @@
}, },
{ "nodeId": 13, "index": 2 } { "nodeId": 13, "index": 2 }
], ],
"commandClasses": [],
"values": [ "values": [
{ {
"commandClassName": "Manufacturer Specific", "commandClassName": "Manufacturer Specific",

View file

@ -6,13 +6,10 @@
"status": 4, "status": 4,
"ready": true, "ready": true,
"deviceClass": { "deviceClass": {
"basic": "Routing Slave", "basic": {"key": 4, "label":"Routing Slave"},
"generic": "Multilevel Switch", "generic": {"key": 17, "label":"Routing Slave"},
"specific": "Unused", "specific": {"key": 0, "label":"Unused"},
"mandatorySupportedCCs": [ "mandatorySupportedCCs": [],
"Basic",
"Multilevel Switch"
],
"mandatoryControlCCs": [] "mandatoryControlCCs": []
}, },
"isListening": false, "isListening": false,
@ -75,6 +72,7 @@
"userIcon": 6400 "userIcon": 6400
} }
], ],
"commandClasses": [],
"values": [ "values": [
{ {
"endpoint": 0, "endpoint": 0,

View file

@ -6,26 +6,10 @@
"status": 4, "status": 4,
"ready": true, "ready": true,
"deviceClass": { "deviceClass": {
"basic": "Routing Slave", "basic": {"key": 4, "label":"Routing Slave"},
"generic": "Entry Control", "generic": {"key": 64, "label":"Entry Control"},
"specific": "Secure Barrier Add-on", "specific": {"key": 7, "label":"Secure Barrier Add-on"},
"mandatorySupportedCCs": [ "mandatorySupportedCCs": [],
"Application Status",
"Association",
"Association Group Information",
"Barrier Operator",
"Battery",
"Device Reset Locally",
"Manufacturer Specific",
"Notification",
"Powerlevel",
"Security",
"Security 2",
"Supervision",
"Transport Service",
"Version",
"Z-Wave Plus Info"
],
"mandatoryControlCCs": [] "mandatoryControlCCs": []
}, },
"isListening": true, "isListening": true,
@ -94,6 +78,7 @@
"userIcon": 7680 "userIcon": 7680
} }
], ],
"commandClasses": [],
"values": [ "values": [
{ {
"endpoint": 0, "endpoint": 0,

View file

@ -6,14 +6,10 @@
"status": 4, "status": 4,
"ready": true, "ready": true,
"deviceClass": { "deviceClass": {
"basic": "Routing Slave", "basic": {"key": 4, "label":"Routing Slave"},
"generic": "Multilevel Switch", "generic": {"key": 17, "label":"Routing Slave"},
"specific": "Multilevel Power Switch", "specific": {"key": 1, "label":"Multilevel Power Switch"},
"mandatorySupportedCCs": [ "mandatorySupportedCCs": [],
"Basic",
"Multilevel Switch",
"All Switch"
],
"mandatoryControlCCs": [] "mandatoryControlCCs": []
}, },
"isListening": true, "isListening": true,
@ -74,6 +70,7 @@
"userIcon": 1536 "userIcon": 1536
} }
], ],
"commandClasses": [],
"values": [ "values": [
{ {
"commandClassName": "Multilevel Switch", "commandClassName": "Multilevel Switch",

View file

@ -4,16 +4,11 @@
"status": 1, "status": 1,
"ready": true, "ready": true,
"deviceClass": { "deviceClass": {
"basic": "Static Controller", "basic": {"key": 2, "label":"Static Controller"},
"generic": "Binary Sensor", "generic": {"key": 32, "label":"Binary Sensor"},
"specific": "Routing Binary Sensor", "specific": {"key": 1, "label":"Routing Binary Sensor"},
"mandatorySupportedCCs": [ "mandatorySupportedCCs": [],
"Basic", "mandatoryControlCCs": []
"Binary Sensor"
],
"mandatoryControlCCs": [
]
}, },
"isListening": false, "isListening": false,
"isFrequentListening": false, "isFrequentListening": false,
@ -61,6 +56,7 @@
"index": 0 "index": 0
} }
], ],
"commandClasses": [],
"values": [ "values": [
{ {
"commandClassName": "Basic", "commandClassName": "Basic",

View file

@ -4,14 +4,10 @@
"status": 4, "status": 4,
"ready": true, "ready": true,
"deviceClass": { "deviceClass": {
"basic": "Routing Slave", "basic": {"key": 4, "label":"Routing Slave"},
"generic": "Multilevel Switch", "generic": {"key": 17, "label":"Multilevel Switch"},
"specific": "Multilevel Power Switch", "specific": {"key": 1, "label":"Multilevel Power Switch"},
"mandatorySupportedCCs": [ "mandatorySupportedCCs": [],
"Basic",
"Multilevel Switch",
"All Switch"
],
"mandatoryControlCCs": [] "mandatoryControlCCs": []
}, },
"isListening": true, "isListening": true,
@ -57,6 +53,7 @@
"index": 0 "index": 0
} }
], ],
"commandClasses": [],
"values": [ "values": [
{ {
"endpoint": 0, "endpoint": 0,

View file

@ -6,14 +6,10 @@
"status": 4, "status": 4,
"ready": true, "ready": true,
"deviceClass": { "deviceClass": {
"basic": "Static Controller", "basic": {"key": 2, "label":"Static Controller"},
"generic": "Binary Switch", "generic": {"key": 16, "label":"Binary Switch"},
"specific": "Binary Power Switch", "specific": {"key": 1, "label":"Binary Power Switch"},
"mandatorySupportedCCs": [ "mandatorySupportedCCs": [],
"Basic",
"Binary Switch",
"All Switch"
],
"mandatoryControlCCs": [] "mandatoryControlCCs": []
}, },
"isListening": true, "isListening": true,
@ -67,6 +63,7 @@
"userIcon": 1792 "userIcon": 1792
} }
], ],
"commandClasses": [],
"values": [ "values": [
{ {
"commandClassName": "Binary Switch", "commandClassName": "Binary Switch",

View file

@ -6,13 +6,10 @@
"status": 4, "status": 4,
"ready": true, "ready": true,
"deviceClass": { "deviceClass": {
"basic": "Routing Slave", "basic": {"key": 4, "label":"Routing Slave"},
"generic": "Multilevel Switch", "generic": {"key": 17, "label":"Multilevel Switch"},
"specific": "Fan Switch", "specific": {"key": 8, "label":"Fan Switch"},
"mandatorySupportedCCs": [ "mandatorySupportedCCs": [],
"Basic",
"Multilevel Switch"
],
"mandatoryControlCCs": [] "mandatoryControlCCs": []
}, },
"isListening": true, "isListening": true,
@ -87,6 +84,7 @@
"userIcon": 1024 "userIcon": 1024
} }
], ],
"commandClasses": [],
"values": [ "values": [
{ {
"commandClassName": "Multilevel Switch", "commandClassName": "Multilevel Switch",

View file

@ -6,17 +6,10 @@
"status": 4, "status": 4,
"ready": true, "ready": true,
"deviceClass": { "deviceClass": {
"basic": "Routing Slave", "basic": {"key": 4, "label":"Routing Slave"},
"generic": "Entry Control", "generic": {"key": 64, "label":"Entry Control"},
"specific": "Secure Keypad Door Lock", "specific": {"key": 3, "label":"Secure Keypad Door Lock"},
"mandatorySupportedCCs": [ "mandatorySupportedCCs": [],
"Basic",
"Door Lock",
"User Code",
"Manufacturer Specific",
"Security",
"Version"
],
"mandatoryControlCCs": [] "mandatoryControlCCs": []
}, },
"isListening": false, "isListening": false,
@ -73,6 +66,7 @@
"userIcon": 768 "userIcon": 768
} }
], ],
"commandClasses": [],
"values": [ "values": [
{ {
"commandClassName": "Door Lock", "commandClassName": "Door Lock",

View file

@ -4,17 +4,10 @@
"status": 4, "status": 4,
"ready": true, "ready": true,
"deviceClass": { "deviceClass": {
"basic": "Static Controller", "basic": {"key": 2, "label":"Static Controller"},
"generic": "Entry Control", "generic": {"key": 64, "label":"Entry Control"},
"specific": "Secure Keypad Door Lock", "specific": {"key": 3, "label":"Secure Keypad Door Lock"},
"mandatorySupportedCCs": [ "mandatorySupportedCCs": [],
"Basic",
"Door Lock",
"User Code",
"Manufacturer Specific",
"Security",
"Version"
],
"mandatoryControlCCs": [] "mandatoryControlCCs": []
}, },
"isListening": false, "isListening": false,
@ -57,6 +50,7 @@
"index": 0 "index": 0
} }
], ],
"commandClasses": [],
"values": [ "values": [
{ {
"commandClassName": "Door Lock", "commandClassName": "Door Lock",

View file

@ -6,13 +6,10 @@
"status": 1, "status": 1,
"ready": true, "ready": true,
"deviceClass": { "deviceClass": {
"basic": "Static Controller", "basic": {"key": 2, "label":"Static Controller"},
"generic": "Multilevel Sensor", "generic": {"key": 21, "label":"Multilevel Sensor"},
"specific": "Routing Multilevel Sensor", "specific": {"key": 1, "label":"Routing Multilevel Sensor"},
"mandatorySupportedCCs": [ "mandatorySupportedCCs": [],
"Basic",
"Multilevel Sensor"
],
"mandatoryControlCCs": [] "mandatoryControlCCs": []
}, },
"isListening": true, "isListening": true,
@ -70,6 +67,7 @@
"userIcon": 3079 "userIcon": 3079
} }
], ],
"commandClasses": [],
"values": [ "values": [
{ {
"commandClassName": "Basic", "commandClassName": "Basic",

View file

@ -7,16 +7,10 @@
"status": 0, "status": 0,
"ready": false, "ready": false,
"deviceClass": { "deviceClass": {
"basic": "Static Controller", "basic": {"key": 2, "label":"Static Controller"},
"generic": "Thermostat", "generic": {"key": 8, "label":"Thermostat"},
"specific": "Thermostat General V2", "specific": {"key": 6, "label":"Thermostat General V2"},
"mandatorySupportedCCs": [ "mandatorySupportedCCs": [],
"Basic",
"Manufacturer Specific",
"Thermostat Mode",
"Thermostat Setpoint",
"Version"
],
"mandatoryControlCCs": [] "mandatoryControlCCs": []
}, },
"neighbors": [], "neighbors": [],
@ -27,6 +21,7 @@
"index": 0 "index": 0
} }
], ],
"commandClasses": [],
"values": [ "values": [
{ {
"commandClassName": "Basic", "commandClassName": "Basic",

View file

@ -7,16 +7,10 @@
"status": 4, "status": 4,
"ready": true, "ready": true,
"deviceClass": { "deviceClass": {
"basic": "Static Controller", "basic": {"key": 2, "label":"Static Controller"},
"generic": "Thermostat", "generic": {"key": 8, "label":"Thermostat"},
"specific": "Thermostat General V2", "specific": {"key": 6, "label":"Thermostat General V2"},
"mandatorySupportedCCs": [ "mandatorySupportedCCs": [],
"Basic",
"Manufacturer Specific",
"Thermostat Mode",
"Thermostat Setpoint",
"Version"
],
"mandatoryControlCCs": [] "mandatoryControlCCs": []
}, },
"isListening": false, "isListening": false,
@ -67,6 +61,7 @@
"index": 0 "index": 0
} }
], ],
"commandClasses": [],
"values": [ "values": [
{ {
"commandClassName": "Manufacturer Specific", "commandClassName": "Manufacturer Specific",

View file

@ -6,16 +6,10 @@
"status": 4, "status": 4,
"ready": true, "ready": true,
"deviceClass": { "deviceClass": {
"basic": "Static Controller", "basic": {"key": 2, "label":"Static Controller"},
"generic": "Thermostat", "generic": {"key": 8, "label":"Thermostat"},
"specific": "Thermostat General V2", "specific": {"key": 6, "label":"Thermostat General V2"},
"mandatorySupportedCCs": [ "mandatorySupportedCCs": [],
"Basic",
"Manufacturer Specific",
"Thermostat Mode",
"Thermostat Setpoint",
"Version"
],
"mandatoryControlCCs": [] "mandatoryControlCCs": []
}, },
"isListening": false, "isListening": false,
@ -75,6 +69,7 @@
"userIcon": 4608 "userIcon": 4608
} }
], ],
"commandClasses": [],
"values": [ "values": [
{ {
"commandClassName": "Manufacturer Specific", "commandClassName": "Manufacturer Specific",