mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 05:07:41 +00:00
Add select entity for zwave_js Door Lock CC (#104292)
* Add select entity for zwave_js Door Lock CC * fix test
This commit is contained in:
parent
933cd89833
commit
e9920ff73d
@ -664,7 +664,14 @@ DISCOVERY_SCHEMAS = [
|
|||||||
# locks
|
# locks
|
||||||
# Door Lock CC
|
# Door Lock CC
|
||||||
ZWaveDiscoverySchema(
|
ZWaveDiscoverySchema(
|
||||||
platform=Platform.LOCK, primary_value=DOOR_LOCK_CURRENT_MODE_SCHEMA
|
platform=Platform.LOCK,
|
||||||
|
primary_value=DOOR_LOCK_CURRENT_MODE_SCHEMA,
|
||||||
|
allow_multi=True,
|
||||||
|
),
|
||||||
|
ZWaveDiscoverySchema(
|
||||||
|
platform=Platform.SELECT,
|
||||||
|
primary_value=DOOR_LOCK_CURRENT_MODE_SCHEMA,
|
||||||
|
hint="door_lock",
|
||||||
),
|
),
|
||||||
# Only discover the Lock CC if the Door Lock CC isn't also present on the node
|
# Only discover the Lock CC if the Door Lock CC isn't also present on the node
|
||||||
ZWaveDiscoverySchema(
|
ZWaveDiscoverySchema(
|
||||||
|
@ -5,7 +5,8 @@ from typing import cast
|
|||||||
|
|
||||||
from zwave_js_server.client import Client as ZwaveClient
|
from zwave_js_server.client import Client as ZwaveClient
|
||||||
from zwave_js_server.const import TARGET_VALUE_PROPERTY, CommandClass
|
from zwave_js_server.const import TARGET_VALUE_PROPERTY, CommandClass
|
||||||
from zwave_js_server.const.command_class.sound_switch import ToneID
|
from zwave_js_server.const.command_class.lock import TARGET_MODE_PROPERTY
|
||||||
|
from zwave_js_server.const.command_class.sound_switch import TONE_ID_PROPERTY, ToneID
|
||||||
from zwave_js_server.model.driver import Driver
|
from zwave_js_server.model.driver import Driver
|
||||||
|
|
||||||
from homeassistant.components.select import DOMAIN as SELECT_DOMAIN, SelectEntity
|
from homeassistant.components.select import DOMAIN as SELECT_DOMAIN, SelectEntity
|
||||||
@ -46,6 +47,8 @@ async def async_setup_entry(
|
|||||||
entities.append(
|
entities.append(
|
||||||
ZWaveConfigParameterSelectEntity(config_entry, driver, info)
|
ZWaveConfigParameterSelectEntity(config_entry, driver, info)
|
||||||
)
|
)
|
||||||
|
elif info.platform_hint == "door_lock":
|
||||||
|
entities.append(ZWaveDoorLockSelectEntity(config_entry, driver, info))
|
||||||
else:
|
else:
|
||||||
entities.append(ZwaveSelectEntity(config_entry, driver, info))
|
entities.append(ZwaveSelectEntity(config_entry, driver, info))
|
||||||
async_add_entities(entities)
|
async_add_entities(entities)
|
||||||
@ -95,6 +98,27 @@ class ZwaveSelectEntity(ZWaveBaseEntity, SelectEntity):
|
|||||||
await self._async_set_value(self.info.primary_value, int(key))
|
await self._async_set_value(self.info.primary_value, int(key))
|
||||||
|
|
||||||
|
|
||||||
|
class ZWaveDoorLockSelectEntity(ZwaveSelectEntity):
|
||||||
|
"""Representation of a Z-Wave door lock CC mode select entity."""
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self, config_entry: ConfigEntry, driver: Driver, info: ZwaveDiscoveryInfo
|
||||||
|
) -> None:
|
||||||
|
"""Initialize a ZWaveDoorLockSelectEntity entity."""
|
||||||
|
super().__init__(config_entry, driver, info)
|
||||||
|
self._target_value = self.get_zwave_value(TARGET_MODE_PROPERTY)
|
||||||
|
|
||||||
|
async def async_select_option(self, option: str) -> None:
|
||||||
|
"""Change the selected option."""
|
||||||
|
assert self._target_value is not None
|
||||||
|
key = next(
|
||||||
|
key
|
||||||
|
for key, val in self.info.primary_value.metadata.states.items()
|
||||||
|
if val == option
|
||||||
|
)
|
||||||
|
await self._async_set_value(self._target_value, int(key))
|
||||||
|
|
||||||
|
|
||||||
class ZWaveConfigParameterSelectEntity(ZwaveSelectEntity):
|
class ZWaveConfigParameterSelectEntity(ZwaveSelectEntity):
|
||||||
"""Representation of a Z-Wave config parameter select."""
|
"""Representation of a Z-Wave config parameter select."""
|
||||||
|
|
||||||
@ -125,7 +149,7 @@ class ZwaveDefaultToneSelectEntity(ZWaveBaseEntity, SelectEntity):
|
|||||||
"""Initialize a ZwaveDefaultToneSelectEntity entity."""
|
"""Initialize a ZwaveDefaultToneSelectEntity entity."""
|
||||||
super().__init__(config_entry, driver, info)
|
super().__init__(config_entry, driver, info)
|
||||||
self._tones_value = self.get_zwave_value(
|
self._tones_value = self.get_zwave_value(
|
||||||
"toneId", command_class=CommandClass.SOUND_SWITCH
|
TONE_ID_PROPERTY, command_class=CommandClass.SOUND_SWITCH
|
||||||
)
|
)
|
||||||
|
|
||||||
# Entity class attributes
|
# Entity class attributes
|
||||||
|
@ -87,6 +87,7 @@ async def test_lock_popp_electric_strike_lock_control(
|
|||||||
hass.states.get("binary_sensor.node_62_the_current_status_of_the_door")
|
hass.states.get("binary_sensor.node_62_the_current_status_of_the_door")
|
||||||
is not None
|
is not None
|
||||||
)
|
)
|
||||||
|
assert hass.states.get("select.node_62_current_lock_mode") is not None
|
||||||
|
|
||||||
|
|
||||||
async def test_fortrez_ssa3_siren(
|
async def test_fortrez_ssa3_siren(
|
||||||
|
@ -967,7 +967,7 @@ async def test_removed_device(
|
|||||||
# Check how many entities there are
|
# Check how many entities there are
|
||||||
ent_reg = er.async_get(hass)
|
ent_reg = er.async_get(hass)
|
||||||
entity_entries = er.async_entries_for_config_entry(ent_reg, integration.entry_id)
|
entity_entries = er.async_entries_for_config_entry(ent_reg, integration.entry_id)
|
||||||
assert len(entity_entries) == 92
|
assert len(entity_entries) == 93
|
||||||
|
|
||||||
# Remove a node and reload the entry
|
# Remove a node and reload the entry
|
||||||
old_node = driver.controller.nodes.pop(13)
|
old_node = driver.controller.nodes.pop(13)
|
||||||
@ -979,7 +979,7 @@ async def test_removed_device(
|
|||||||
device_entries = dr.async_entries_for_config_entry(dev_reg, integration.entry_id)
|
device_entries = dr.async_entries_for_config_entry(dev_reg, integration.entry_id)
|
||||||
assert len(device_entries) == 2
|
assert len(device_entries) == 2
|
||||||
entity_entries = er.async_entries_for_config_entry(ent_reg, integration.entry_id)
|
entity_entries = er.async_entries_for_config_entry(ent_reg, integration.entry_id)
|
||||||
assert len(entity_entries) == 61
|
assert len(entity_entries) == 62
|
||||||
assert (
|
assert (
|
||||||
dev_reg.async_get_device(identifiers={get_device_id(driver, old_node)}) is None
|
dev_reg.async_get_device(identifiers={get_device_id(driver, old_node)}) is None
|
||||||
)
|
)
|
||||||
|
@ -320,3 +320,30 @@ async def test_config_parameter_select(
|
|||||||
state = hass.states.get(select_entity_id)
|
state = hass.states.get(select_entity_id)
|
||||||
assert state
|
assert state
|
||||||
assert state.state == "Normal"
|
assert state.state == "Normal"
|
||||||
|
|
||||||
|
|
||||||
|
async def test_lock_popp_electric_strike_lock_control_select(
|
||||||
|
hass: HomeAssistant, client, lock_popp_electric_strike_lock_control, integration
|
||||||
|
) -> None:
|
||||||
|
"""Test that the Popp Electric Strike Lock Control select entity."""
|
||||||
|
LOCK_SELECT_ENTITY = "select.node_62_current_lock_mode"
|
||||||
|
state = hass.states.get(LOCK_SELECT_ENTITY)
|
||||||
|
assert state
|
||||||
|
assert state.state == "Unsecured"
|
||||||
|
await hass.services.async_call(
|
||||||
|
"select",
|
||||||
|
"select_option",
|
||||||
|
{"entity_id": LOCK_SELECT_ENTITY, "option": "UnsecuredWithTimeout"},
|
||||||
|
blocking=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert len(client.async_send_command.call_args_list) == 1
|
||||||
|
args = client.async_send_command.call_args[0][0]
|
||||||
|
assert args["command"] == "node.set_value"
|
||||||
|
assert args["nodeId"] == lock_popp_electric_strike_lock_control.node_id
|
||||||
|
assert args["valueId"] == {
|
||||||
|
"endpoint": 0,
|
||||||
|
"commandClass": 98,
|
||||||
|
"property": "targetMode",
|
||||||
|
}
|
||||||
|
assert args["value"] == 1
|
||||||
|
Loading…
x
Reference in New Issue
Block a user