From 562d30319b4e344a6336ee6663c4a6512f0b2423 Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Sat, 16 Jan 2021 10:43:25 -0600 Subject: [PATCH] Add lock platform to zwave_js (#45175) Co-authored-by: Martin Hjelmare --- homeassistant/components/zwave_js/const.py | 2 +- .../components/zwave_js/discovery.py | 19 +- homeassistant/components/zwave_js/lock.py | 88 + tests/components/zwave_js/conftest.py | 14 + tests/components/zwave_js/test_lock.py | 124 + .../zwave_js/lock_schlage_be469_state.json | 2052 +++++++++++++++++ 6 files changed, 2297 insertions(+), 2 deletions(-) create mode 100644 homeassistant/components/zwave_js/lock.py create mode 100644 tests/components/zwave_js/test_lock.py create mode 100644 tests/fixtures/zwave_js/lock_schlage_be469_state.json diff --git a/homeassistant/components/zwave_js/const.py b/homeassistant/components/zwave_js/const.py index 28a4b076be9..18a22a9f8d8 100644 --- a/homeassistant/components/zwave_js/const.py +++ b/homeassistant/components/zwave_js/const.py @@ -3,7 +3,7 @@ DOMAIN = "zwave_js" NAME = "Z-Wave JS" -PLATFORMS = ["binary_sensor", "light", "sensor", "switch"] +PLATFORMS = ["binary_sensor", "light", "lock", "sensor", "switch"] DATA_CLIENT = "client" DATA_UNSUBSCRIBE = "unsubs" diff --git a/homeassistant/components/zwave_js/discovery.py b/homeassistant/components/zwave_js/discovery.py index 6564aad1cd8..c0d298fec37 100644 --- a/homeassistant/components/zwave_js/discovery.py +++ b/homeassistant/components/zwave_js/discovery.py @@ -57,7 +57,24 @@ class ZWaveDiscoverySchema: DISCOVERY_SCHEMAS = [ - # light + # locks + ZWaveDiscoverySchema( + platform="lock", + device_class_generic={"Entry Control"}, + device_class_specific={ + "Door Lock", + "Advanced Door Lock", + "Secure Keypad Door Lock", + "Secure Lockbox", + }, + command_class={ + CommandClass.LOCK, + CommandClass.DOOR_LOCK, + }, + property={"currentMode", "locked"}, + type={"number", "boolean"}, + ), + # lights # primary value is the currentValue (brightness) ZWaveDiscoverySchema( platform="light", diff --git a/homeassistant/components/zwave_js/lock.py b/homeassistant/components/zwave_js/lock.py new file mode 100644 index 00000000000..825e286cf01 --- /dev/null +++ b/homeassistant/components/zwave_js/lock.py @@ -0,0 +1,88 @@ +"""Representation of Z-Wave locks.""" +import logging +from typing import Any, Callable, Dict, List, Optional, Union + +from zwave_js_server.client import Client as ZwaveClient +from zwave_js_server.const import ( + LOCK_CMD_CLASS_TO_LOCKED_STATE_MAP, + LOCK_CMD_CLASS_TO_PROPERTY_MAP, + CommandClass, + DoorLockMode, +) +from zwave_js_server.model.value import Value as ZwaveValue + +from homeassistant.components.lock import DOMAIN as LOCK_DOMAIN, LockEntity +from homeassistant.config_entries import ConfigEntry +from homeassistant.const import STATE_LOCKED, STATE_UNLOCKED +from homeassistant.core import HomeAssistant, callback +from homeassistant.helpers.dispatcher import async_dispatcher_connect + +from .const import DATA_CLIENT, DATA_UNSUBSCRIBE, DOMAIN +from .discovery import ZwaveDiscoveryInfo +from .entity import ZWaveBaseEntity + +LOGGER = logging.getLogger(__name__) + +STATE_TO_ZWAVE_MAP: Dict[int, Dict[str, Union[int, bool]]] = { + CommandClass.DOOR_LOCK: { + STATE_UNLOCKED: DoorLockMode.UNSECURED, + STATE_LOCKED: DoorLockMode.SECURED, + }, + CommandClass.LOCK: { + STATE_UNLOCKED: False, + STATE_LOCKED: True, + }, +} + + +async def async_setup_entry( + hass: HomeAssistant, config_entry: ConfigEntry, async_add_entities: Callable +) -> None: + """Set up Z-Wave lock from config entry.""" + client: ZwaveClient = hass.data[DOMAIN][config_entry.entry_id][DATA_CLIENT] + + @callback + def async_add_lock(info: ZwaveDiscoveryInfo) -> None: + """Add Z-Wave Lock.""" + entities: List[ZWaveBaseEntity] = [] + entities.append(ZWaveLock(client, info)) + + async_add_entities(entities) + + hass.data[DOMAIN][config_entry.entry_id][DATA_UNSUBSCRIBE].append( + async_dispatcher_connect(hass, f"{DOMAIN}_add_{LOCK_DOMAIN}", async_add_lock) + ) + + +class ZWaveLock(ZWaveBaseEntity, LockEntity): + """Representation of a Z-Wave lock.""" + + @property + def is_locked(self) -> Optional[bool]: + """Return true if the lock is locked.""" + return int( + LOCK_CMD_CLASS_TO_LOCKED_STATE_MAP[ + CommandClass(self.info.primary_value.command_class) + ] + ) == int(self.info.primary_value.value) + + async def _set_lock_state( + self, target_state: str, **kwargs: Dict[str, Any] + ) -> None: + """Set the lock state.""" + target_value: ZwaveValue = self.get_zwave_value( + LOCK_CMD_CLASS_TO_PROPERTY_MAP[self.info.primary_value.command_class] + ) + if target_value is not None: + await self.info.node.async_set_value( + target_value, + STATE_TO_ZWAVE_MAP[self.info.primary_value.command_class][target_state], + ) + + async def async_lock(self, **kwargs: Dict[str, Any]) -> None: + """Lock the lock.""" + await self._set_lock_state(STATE_LOCKED) + + async def async_unlock(self, **kwargs: Dict[str, Any]) -> None: + """Unlock the lock.""" + await self._set_lock_state(STATE_UNLOCKED) diff --git a/tests/components/zwave_js/conftest.py b/tests/components/zwave_js/conftest.py index 1d92a73d84d..183f1785585 100644 --- a/tests/components/zwave_js/conftest.py +++ b/tests/components/zwave_js/conftest.py @@ -61,6 +61,12 @@ def bulb_6_multi_color_state_fixture(): return json.loads(load_fixture("zwave_js/bulb_6_multi_color_state.json")) +@pytest.fixture(name="lock_schlage_be469_state", scope="session") +def lock_schlage_be469_state_fixture(): + """Load the schlage lock node state fixture data.""" + return json.loads(load_fixture("zwave_js/lock_schlage_be469_state.json")) + + @pytest.fixture(name="client") def mock_client_fixture(controller_state, version_state): """Mock a client.""" @@ -108,6 +114,14 @@ def bulb_6_multi_color_fixture(client, bulb_6_multi_color_state): return node +@pytest.fixture(name="lock_schlage_be469") +def lock_schlage_be469_fixture(client, lock_schlage_be469_state): + """Mock a schlage lock node.""" + node = Node(client, lock_schlage_be469_state) + client.driver.controller.nodes[node.node_id] = node + return node + + @pytest.fixture(name="integration") async def integration_fixture(hass, client): """Set up the zwave_js integration.""" diff --git a/tests/components/zwave_js/test_lock.py b/tests/components/zwave_js/test_lock.py new file mode 100644 index 00000000000..bf2d3f3c5c2 --- /dev/null +++ b/tests/components/zwave_js/test_lock.py @@ -0,0 +1,124 @@ +"""Test the Z-Wave JS lock platform.""" +from zwave_js_server.event import Event + +from homeassistant.components.lock import ( + DOMAIN as LOCK_DOMAIN, + SERVICE_LOCK, + SERVICE_UNLOCK, +) +from homeassistant.const import ATTR_ENTITY_ID, STATE_LOCKED, STATE_UNLOCKED + +SCHLAGE_BE469_LOCK_ENTITY = "lock.touchscreen_deadbolt_current_lock_mode" + + +async def test_door_lock(hass, client, lock_schlage_be469, integration): + """Test a lock entity with door lock command class.""" + node = lock_schlage_be469 + state = hass.states.get(SCHLAGE_BE469_LOCK_ENTITY) + + assert state + assert state.state == STATE_UNLOCKED + + # Test locking + await hass.services.async_call( + LOCK_DOMAIN, + SERVICE_LOCK, + {ATTR_ENTITY_ID: SCHLAGE_BE469_LOCK_ENTITY}, + 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"] == 20 + assert args["valueId"] == { + "commandClassName": "Door Lock", + "commandClass": 98, + "endpoint": 0, + "property": "targetMode", + "propertyName": "targetMode", + "metadata": { + "type": "number", + "readable": True, + "writeable": True, + "min": 0, + "max": 255, + "label": "Target lock mode", + "states": { + "0": "Unsecured", + "1": "UnsecuredWithTimeout", + "16": "InsideUnsecured", + "17": "InsideUnsecuredWithTimeout", + "32": "OutsideUnsecured", + "33": "OutsideUnsecuredWithTimeout", + "254": "Unknown", + "255": "Secured", + }, + }, + } + assert args["value"] == 255 + + client.async_send_command.reset_mock() + + # Test locked update from value updated event + event = Event( + type="value updated", + data={ + "source": "node", + "event": "value updated", + "nodeId": 20, + "args": { + "commandClassName": "Door Lock", + "commandClass": 98, + "endpoint": 0, + "property": "currentMode", + "newValue": 255, + "prevValue": 0, + "propertyName": "currentMode", + }, + }, + ) + node.receive_event(event) + + assert hass.states.get(SCHLAGE_BE469_LOCK_ENTITY).state == STATE_LOCKED + + client.async_send_command.reset_mock() + + # Test unlocking + await hass.services.async_call( + LOCK_DOMAIN, + SERVICE_UNLOCK, + {ATTR_ENTITY_ID: SCHLAGE_BE469_LOCK_ENTITY}, + 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"] == 20 + assert args["valueId"] == { + "commandClassName": "Door Lock", + "commandClass": 98, + "endpoint": 0, + "property": "targetMode", + "propertyName": "targetMode", + "metadata": { + "type": "number", + "readable": True, + "writeable": True, + "min": 0, + "max": 255, + "label": "Target lock mode", + "states": { + "0": "Unsecured", + "1": "UnsecuredWithTimeout", + "16": "InsideUnsecured", + "17": "InsideUnsecuredWithTimeout", + "32": "OutsideUnsecured", + "33": "OutsideUnsecuredWithTimeout", + "254": "Unknown", + "255": "Secured", + }, + }, + } + assert args["value"] == 0 diff --git a/tests/fixtures/zwave_js/lock_schlage_be469_state.json b/tests/fixtures/zwave_js/lock_schlage_be469_state.json new file mode 100644 index 00000000000..af1fc92a206 --- /dev/null +++ b/tests/fixtures/zwave_js/lock_schlage_be469_state.json @@ -0,0 +1,2052 @@ +{ + "nodeId": 20, + "index": 0, + "status": 4, + "ready": true, + "deviceClass": { + "basic": "Static Controller", + "generic": "Entry Control", + "specific": "Secure Keypad Door Lock", + "mandatorySupportedCCs": [ + "Basic", + "Door Lock", + "User Code", + "Manufacturer Specific", + "Security", + "Version" + ], + "mandatoryControlCCs": [] + }, + "isListening": false, + "isFrequentListening": true, + "isRouting": true, + "maxBaudRate": 40000, + "isSecure": true, + "version": 4, + "isBeaming": true, + "manufacturerId": 59, + "productId": 20548, + "productType": 25409, + "firmwareVersion": "113.22", + "deviceConfig": { + "manufacturerId": 59, + "manufacturer": "Allegion", + "label": "BE469", + "description": "Touchscreen Deadbolt", + "devices": [ + { + "productType": "0x6341", + "productId": "0x5044" + } + ], + "firmwareVersion": { + "min": "0.0", + "max": "255.255" + }, + "associations": {}, + "paramInformation": { + "_map": {} + } + }, + "label": "BE469", + "neighbors": [1, 2, 3, 4, 13], + "interviewAttempts": 1, + "endpoints": [ + { + "nodeId": 20, + "index": 0 + } + ], + "values": [ + { + "commandClassName": "Door Lock", + "commandClass": 98, + "endpoint": 0, + "property": "currentMode", + "propertyName": "currentMode", + "metadata": { + "type": "number", + "readable": true, + "writeable": false, + "min": 0, + "max": 255, + "label": "Current lock mode", + "states": { + "0": "Unsecured", + "1": "UnsecuredWithTimeout", + "16": "InsideUnsecured", + "17": "InsideUnsecuredWithTimeout", + "32": "OutsideUnsecured", + "33": "OutsideUnsecuredWithTimeout", + "254": "Unknown", + "255": "Secured" + } + }, + "value": 0 + }, + { + "commandClassName": "Door Lock", + "commandClass": 98, + "endpoint": 0, + "property": "targetMode", + "propertyName": "targetMode", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "min": 0, + "max": 255, + "label": "Target lock mode", + "states": { + "0": "Unsecured", + "1": "UnsecuredWithTimeout", + "16": "InsideUnsecured", + "17": "InsideUnsecuredWithTimeout", + "32": "OutsideUnsecured", + "33": "OutsideUnsecuredWithTimeout", + "254": "Unknown", + "255": "Secured" + } + } + }, + { + "commandClassName": "Door Lock", + "commandClass": 98, + "endpoint": 0, + "property": "outsideHandlesCanOpenDoor", + "propertyName": "outsideHandlesCanOpenDoor", + "metadata": { + "type": "any", + "readable": true, + "writeable": false, + "label": "Which outside handles can open the door (actual status)" + }, + "value": [false, false, false, false] + }, + { + "commandClassName": "Door Lock", + "commandClass": 98, + "endpoint": 0, + "property": "insideHandlesCanOpenDoor", + "propertyName": "insideHandlesCanOpenDoor", + "metadata": { + "type": "any", + "readable": true, + "writeable": false, + "label": "Which inside handles can open the door (actual status)" + }, + "value": [false, false, false, false] + }, + { + "commandClassName": "Door Lock", + "commandClass": 98, + "endpoint": 0, + "property": "latchStatus", + "propertyName": "latchStatus", + "metadata": { + "type": "any", + "readable": true, + "writeable": false, + "label": "The current status of the latch" + }, + "value": "open" + }, + { + "commandClassName": "Door Lock", + "commandClass": 98, + "endpoint": 0, + "property": "boltStatus", + "propertyName": "boltStatus", + "metadata": { + "type": "any", + "readable": true, + "writeable": false, + "label": "The current status of the bolt" + }, + "value": "unlocked" + }, + { + "commandClassName": "Door Lock", + "commandClass": 98, + "endpoint": 0, + "property": "doorStatus", + "propertyName": "doorStatus", + "metadata": { + "type": "any", + "readable": true, + "writeable": false, + "label": "The current status of the door" + }, + "value": "open" + }, + { + "commandClassName": "Door Lock", + "commandClass": 98, + "endpoint": 0, + "property": "lockTimeout", + "propertyName": "lockTimeout", + "metadata": { + "type": "number", + "readable": true, + "writeable": false, + "label": "Seconds until lock mode times out" + } + }, + { + "commandClassName": "Door Lock", + "commandClass": 98, + "endpoint": 0, + "property": "operationType", + "propertyName": "operationType", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "min": 0, + "max": 255, + "label": "Lock operation type", + "states": { + "1": "Constant", + "2": "Timed" + } + }, + "value": 1 + }, + { + "commandClassName": "Door Lock", + "commandClass": 98, + "endpoint": 0, + "property": "outsideHandlesCanOpenDoorConfiguration", + "propertyName": "outsideHandlesCanOpenDoorConfiguration", + "metadata": { + "type": "any", + "readable": true, + "writeable": true, + "label": "Which outside handles can open the door (configuration)" + }, + "value": [false, false, false, false] + }, + { + "commandClassName": "Door Lock", + "commandClass": 98, + "endpoint": 0, + "property": "insideHandlesCanOpenDoorConfiguration", + "propertyName": "insideHandlesCanOpenDoorConfiguration", + "metadata": { + "type": "any", + "readable": true, + "writeable": true, + "label": "Which inside handles can open the door (configuration)" + }, + "value": [false, false, false, false] + }, + { + "commandClassName": "Door Lock", + "commandClass": 98, + "endpoint": 0, + "property": "lockTimeoutConfiguration", + "propertyName": "lockTimeoutConfiguration", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "min": 0, + "max": 65535, + "label": "Duration of timed mode in seconds" + } + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 1, + "propertyName": "userIdStatus", + "propertyKeyName": "1", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (1)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 1 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 1, + "propertyName": "userCode", + "propertyKeyName": "1", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (1)" + }, + "value": "**********" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 2, + "propertyName": "userIdStatus", + "propertyKeyName": "2", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (2)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 1 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 2, + "propertyName": "userCode", + "propertyKeyName": "2", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (2)" + }, + "value": "**********" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 3, + "propertyName": "userIdStatus", + "propertyKeyName": "3", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (3)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 1 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 3, + "propertyName": "userCode", + "propertyKeyName": "3", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (3)" + }, + "value": "**********" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 4, + "propertyName": "userIdStatus", + "propertyKeyName": "4", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (4)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 4, + "propertyName": "userCode", + "propertyKeyName": "4", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (4)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 5, + "propertyName": "userIdStatus", + "propertyKeyName": "5", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (5)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 5, + "propertyName": "userCode", + "propertyKeyName": "5", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (5)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 6, + "propertyName": "userIdStatus", + "propertyKeyName": "6", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (6)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 6, + "propertyName": "userCode", + "propertyKeyName": "6", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (6)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 7, + "propertyName": "userIdStatus", + "propertyKeyName": "7", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (7)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 7, + "propertyName": "userCode", + "propertyKeyName": "7", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (7)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 8, + "propertyName": "userIdStatus", + "propertyKeyName": "8", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (8)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 8, + "propertyName": "userCode", + "propertyKeyName": "8", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (8)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 9, + "propertyName": "userIdStatus", + "propertyKeyName": "9", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (9)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 9, + "propertyName": "userCode", + "propertyKeyName": "9", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (9)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 10, + "propertyName": "userIdStatus", + "propertyKeyName": "10", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (10)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 10, + "propertyName": "userCode", + "propertyKeyName": "10", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (10)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 11, + "propertyName": "userIdStatus", + "propertyKeyName": "11", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (11)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 11, + "propertyName": "userCode", + "propertyKeyName": "11", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (11)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 12, + "propertyName": "userIdStatus", + "propertyKeyName": "12", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (12)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 12, + "propertyName": "userCode", + "propertyKeyName": "12", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (12)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 13, + "propertyName": "userIdStatus", + "propertyKeyName": "13", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (13)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 13, + "propertyName": "userCode", + "propertyKeyName": "13", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (13)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 14, + "propertyName": "userIdStatus", + "propertyKeyName": "14", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (14)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 14, + "propertyName": "userCode", + "propertyKeyName": "14", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (14)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 15, + "propertyName": "userIdStatus", + "propertyKeyName": "15", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (15)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 15, + "propertyName": "userCode", + "propertyKeyName": "15", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (15)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 16, + "propertyName": "userIdStatus", + "propertyKeyName": "16", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (16)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 16, + "propertyName": "userCode", + "propertyKeyName": "16", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (16)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 17, + "propertyName": "userIdStatus", + "propertyKeyName": "17", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (17)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 17, + "propertyName": "userCode", + "propertyKeyName": "17", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (17)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 18, + "propertyName": "userIdStatus", + "propertyKeyName": "18", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (18)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 18, + "propertyName": "userCode", + "propertyKeyName": "18", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (18)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 19, + "propertyName": "userIdStatus", + "propertyKeyName": "19", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (19)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 19, + "propertyName": "userCode", + "propertyKeyName": "19", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (19)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 20, + "propertyName": "userIdStatus", + "propertyKeyName": "20", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (20)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 20, + "propertyName": "userCode", + "propertyKeyName": "20", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (20)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 21, + "propertyName": "userIdStatus", + "propertyKeyName": "21", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (21)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 21, + "propertyName": "userCode", + "propertyKeyName": "21", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (21)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 22, + "propertyName": "userIdStatus", + "propertyKeyName": "22", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (22)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 22, + "propertyName": "userCode", + "propertyKeyName": "22", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (22)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 23, + "propertyName": "userIdStatus", + "propertyKeyName": "23", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (23)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 23, + "propertyName": "userCode", + "propertyKeyName": "23", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (23)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 24, + "propertyName": "userIdStatus", + "propertyKeyName": "24", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (24)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 24, + "propertyName": "userCode", + "propertyKeyName": "24", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (24)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 25, + "propertyName": "userIdStatus", + "propertyKeyName": "25", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (25)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 25, + "propertyName": "userCode", + "propertyKeyName": "25", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (25)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 26, + "propertyName": "userIdStatus", + "propertyKeyName": "26", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (26)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 26, + "propertyName": "userCode", + "propertyKeyName": "26", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (26)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 27, + "propertyName": "userIdStatus", + "propertyKeyName": "27", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (27)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 27, + "propertyName": "userCode", + "propertyKeyName": "27", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (27)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 28, + "propertyName": "userIdStatus", + "propertyKeyName": "28", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (28)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 28, + "propertyName": "userCode", + "propertyKeyName": "28", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (28)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 29, + "propertyName": "userIdStatus", + "propertyKeyName": "29", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (29)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 29, + "propertyName": "userCode", + "propertyKeyName": "29", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (29)" + }, + "value": "" + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userIdStatus", + "propertyKey": 30, + "propertyName": "userIdStatus", + "propertyKeyName": "30", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "label": "User ID status (30)", + "states": { + "0": "Available", + "1": "Enabled", + "2": "Disabled" + } + }, + "value": 0 + }, + { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyKey": 30, + "propertyName": "userCode", + "propertyKeyName": "30", + "metadata": { + "type": "string", + "readable": true, + "writeable": true, + "minLength": 4, + "maxLength": 10, + "label": "User Code (30)" + }, + "value": "" + }, + { + "commandClassName": "Manufacturer Specific", + "commandClass": 114, + "endpoint": 0, + "property": "manufacturerId", + "propertyName": "manufacturerId", + "metadata": { + "type": "number", + "readable": true, + "writeable": false, + "min": 0, + "max": 65535, + "label": "Manufacturer ID" + }, + "value": 59 + }, + { + "commandClassName": "Manufacturer Specific", + "commandClass": 114, + "endpoint": 0, + "property": "productType", + "propertyName": "productType", + "metadata": { + "type": "number", + "readable": true, + "writeable": false, + "min": 0, + "max": 65535, + "label": "Product type" + }, + "value": 25409 + }, + { + "commandClassName": "Manufacturer Specific", + "commandClass": 114, + "endpoint": 0, + "property": "productId", + "propertyName": "productId", + "metadata": { + "type": "number", + "readable": true, + "writeable": false, + "min": 0, + "max": 65535, + "label": "Product ID" + }, + "value": 20548 + }, + { + "commandClassName": "Version", + "commandClass": 134, + "endpoint": 0, + "property": "libraryType", + "propertyName": "libraryType", + "metadata": { + "type": "any", + "readable": true, + "writeable": false, + "label": "Library type" + }, + "value": 6 + }, + { + "commandClassName": "Version", + "commandClass": 134, + "endpoint": 0, + "property": "protocolVersion", + "propertyName": "protocolVersion", + "metadata": { + "type": "any", + "readable": true, + "writeable": false, + "label": "Z-Wave protocol version" + }, + "value": "3.42" + }, + { + "commandClassName": "Version", + "commandClass": 134, + "endpoint": 0, + "property": "firmwareVersions", + "propertyName": "firmwareVersions", + "metadata": { + "type": "any", + "readable": true, + "writeable": false, + "label": "Z-Wave chip firmware versions" + }, + "value": ["113.22"] + }, + { + "commandClassName": "Battery", + "commandClass": 128, + "endpoint": 0, + "property": "level", + "propertyName": "level", + "metadata": { + "type": "number", + "readable": true, + "writeable": false, + "min": 0, + "max": 100, + "unit": "%", + "label": "Battery level" + }, + "value": 100 + }, + { + "commandClassName": "Battery", + "commandClass": 128, + "endpoint": 0, + "property": "isLow", + "propertyName": "isLow", + "metadata": { + "type": "boolean", + "readable": true, + "writeable": false, + "label": "Low battery level" + }, + "value": false + }, + { + "commandClassName": "Configuration", + "commandClass": 112, + "endpoint": 0, + "property": 3, + "propertyName": "Beeper", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "valueSize": 1, + "min": 0, + "max": 255, + "default": 255, + "format": 1, + "allowManualEntry": false, + "states": { + "0": "Disable Beeper", + "255": "Enable Beeper" + }, + "label": "Beeper", + "isFromConfig": true + }, + "value": 255 + }, + { + "commandClassName": "Configuration", + "commandClass": 112, + "endpoint": 0, + "property": 4, + "propertyName": "Vacation Mode", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "valueSize": 1, + "min": 0, + "max": 255, + "default": 0, + "format": 1, + "allowManualEntry": false, + "states": { + "0": "Disable Vacation Mode", + "255": "Enable Vacation Mode" + }, + "label": "Vacation Mode", + "isFromConfig": true + }, + "value": 0 + }, + { + "commandClassName": "Configuration", + "commandClass": 112, + "endpoint": 0, + "property": 5, + "propertyName": "Lock & Leave", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "valueSize": 1, + "min": 0, + "max": 255, + "default": 0, + "format": 1, + "allowManualEntry": false, + "states": { + "0": "Disable Lock & Leave", + "255": "Enable Lock & Leave" + }, + "label": "Lock & Leave", + "isFromConfig": true + }, + "value": 255 + }, + { + "commandClassName": "Configuration", + "commandClass": 112, + "endpoint": 0, + "property": 6, + "propertyName": "User Slot Status", + "metadata": { + "type": "number", + "readable": true, + "writeable": false, + "valueSize": 4, + "min": 0, + "max": 255, + "default": 0, + "format": 0, + "allowManualEntry": true, + "label": "User Slot Status", + "description": "User slot status", + "isFromConfig": true + }, + "value": 117440512 + }, + { + "commandClassName": "Configuration", + "commandClass": 112, + "endpoint": 0, + "property": 7, + "propertyName": "Lock Specific Alarm Mode", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "valueSize": 1, + "min": 0, + "max": 3, + "default": 0, + "format": 0, + "allowManualEntry": false, + "states": { + "0": "Alarm Off", + "1": "Alert", + "2": "Tamper", + "3": "Forced Entry" + }, + "label": "Lock Specific Alarm Mode", + "description": "BE469 Only", + "isFromConfig": true + }, + "value": 0 + }, + { + "commandClassName": "Configuration", + "commandClass": 112, + "endpoint": 0, + "property": 8, + "propertyName": "Lock Specific Alarm Alert Sensitivity", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "valueSize": 1, + "min": 0, + "max": 5, + "default": 0, + "format": 0, + "allowManualEntry": false, + "states": { + "0": "Not Supported", + "1": "Most Sensitive", + "2": "More Sensitive", + "3": "Medium Sensitivity", + "4": "Less Sensitive", + "5": "Least Sensitive" + }, + "label": "Lock Specific Alarm Alert Sensitivity", + "isFromConfig": true + }, + "value": 3 + }, + { + "commandClassName": "Configuration", + "commandClass": 112, + "endpoint": 0, + "property": 9, + "propertyName": "Lock Specific Alarm Tamper Sensitivity", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "valueSize": 1, + "min": 0, + "max": 5, + "default": 0, + "format": 0, + "allowManualEntry": false, + "states": { + "0": "Not Supported", + "1": "Most Sensitive", + "2": "More Sensitive", + "3": "Medium Sensitivity", + "4": "Less Sensitive", + "5": "Least Sensitive" + }, + "label": "Lock Specific Alarm Tamper Sensitivity", + "isFromConfig": true + }, + "value": 3 + }, + { + "commandClassName": "Configuration", + "commandClass": 112, + "endpoint": 0, + "property": 10, + "propertyName": "Lock Specific Alarm Kick Sensitivity", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "valueSize": 1, + "min": 0, + "max": 5, + "default": 0, + "format": 0, + "allowManualEntry": false, + "states": { + "0": "Not Supported", + "1": "Most Sensitive", + "2": "More Sensitive", + "3": "Medium Sensitivity", + "4": "Less Sensitive", + "5": "Least Sensitive" + }, + "label": "Lock Specific Alarm Kick Sensitivity", + "description": "BE469 Only", + "isFromConfig": true + }, + "value": 3 + }, + { + "commandClassName": "Configuration", + "commandClass": 112, + "endpoint": 0, + "property": 11, + "propertyName": "Lock Specific Alarm Disable—Local Controls", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "valueSize": 1, + "min": 0, + "max": 255, + "default": 0, + "format": 1, + "allowManualEntry": false, + "states": { + "0": "Disable Local Control", + "255": "Enable Local Control" + }, + "label": "Lock Specific Alarm Disable—Local Controls", + "isFromConfig": true + }, + "value": 255 + }, + { + "commandClassName": "Configuration", + "commandClass": 112, + "endpoint": 0, + "property": 12, + "propertyName": "Electronic Transition Count", + "metadata": { + "type": "number", + "readable": true, + "writeable": false, + "valueSize": 4, + "min": 0, + "max": 2147483647, + "default": 0, + "format": 0, + "allowManualEntry": true, + "label": "Electronic Transition Count", + "isFromConfig": true + }, + "value": 2260 + }, + { + "commandClassName": "Configuration", + "commandClass": 112, + "endpoint": 0, + "property": 13, + "propertyName": "Mechanical Transition Count", + "metadata": { + "type": "number", + "readable": true, + "writeable": false, + "valueSize": 4, + "min": 0, + "max": 2147483647, + "default": 0, + "format": 0, + "allowManualEntry": true, + "label": "Mechanical Transition Count", + "isFromConfig": true + }, + "value": 2166 + }, + { + "commandClassName": "Configuration", + "commandClass": 112, + "endpoint": 0, + "property": 14, + "propertyName": "Electronic Failed Count", + "metadata": { + "type": "number", + "readable": true, + "writeable": false, + "valueSize": 4, + "min": 0, + "max": 2147483647, + "default": 0, + "format": 0, + "allowManualEntry": true, + "label": "Electronic Failed Count", + "isFromConfig": true + }, + "value": 0 + }, + { + "commandClassName": "Configuration", + "commandClass": 112, + "endpoint": 0, + "property": 15, + "propertyName": "Auto Lock", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "valueSize": 1, + "min": 0, + "max": 255, + "default": 0, + "format": 1, + "allowManualEntry": false, + "states": { + "0": "Disable Auto Lock", + "255": "Enable Auto Lock" + }, + "label": "Auto Lock", + "isFromConfig": true + }, + "value": 0 + }, + { + "commandClassName": "Configuration", + "commandClass": 112, + "endpoint": 0, + "property": 16, + "propertyName": "User Code PIN Length", + "metadata": { + "type": "number", + "readable": true, + "writeable": true, + "valueSize": 1, + "min": 4, + "max": 8, + "default": 4, + "format": 0, + "allowManualEntry": false, + "states": { + "4": "Four Digits", + "5": "Five Digits", + "6": "Six Digits", + "7": "Seven Digits", + "8": "Eight Digits" + }, + "label": "User Code PIN Length", + "description": "User Code PIN length, a value between 4 and 8 (default 4)", + "isFromConfig": true + }, + "value": 4 + }, + { + "commandClassName": "Configuration", + "commandClass": 112, + "endpoint": 0, + "property": 18, + "propertyName": "Get Bootloader Version", + "metadata": { + "type": "number", + "readable": true, + "writeable": false, + "valueSize": 1, + "min": 0, + "max": 255, + "default": 0, + "format": 1, + "allowManualEntry": true, + "label": "Get Bootloader Version", + "isFromConfig": true + }, + "value": 1 + }, + { + "commandClassName": "Notification", + "commandClass": 113, + "endpoint": 0, + "property": "Access Control", + "propertyKey": "Lock state", + "propertyName": "Access Control", + "propertyKeyName": "Lock state", + "metadata": { + "type": "number", + "readable": true, + "writeable": false, + "min": 0, + "max": 255, + "label": "Lock state", + "states": { + "0": "idle", + "11": "Lock jammed" + }, + "ccSpecific": { + "notificationType": 6 + } + }, + "value": 0 + }, + { + "commandClassName": "Notification", + "commandClass": 113, + "endpoint": 0, + "property": "Access Control", + "propertyKey": "Keypad state", + "propertyName": "Access Control", + "propertyKeyName": "Keypad state", + "metadata": { + "type": "number", + "readable": true, + "writeable": false, + "min": 0, + "max": 255, + "label": "Keypad state", + "states": { + "0": "idle", + "16": "Keypad temporary disabled" + }, + "ccSpecific": { + "notificationType": 6 + } + }, + "value": 0 + }, + { + "commandClassName": "Notification", + "commandClass": 113, + "endpoint": 0, + "property": "Home Security", + "propertyKey": "Sensor status", + "propertyName": "Home Security", + "propertyKeyName": "Sensor status", + "metadata": { + "type": "number", + "readable": true, + "writeable": false, + "min": 0, + "max": 255, + "label": "Sensor status", + "states": { + "0": "idle", + "2": "Intrusion" + }, + "ccSpecific": { + "notificationType": 7 + } + }, + "value": 0 + }, + { + "commandClassName": "Notification", + "commandClass": 113, + "endpoint": 0, + "property": "Power Management", + "propertyKey": "Battery maintenance status", + "propertyName": "Power Management", + "propertyKeyName": "Battery maintenance status", + "metadata": { + "type": "number", + "readable": true, + "writeable": false, + "min": 0, + "max": 255, + "label": "Battery maintenance status", + "states": { + "0": "idle", + "10": "Replace battery soon", + "11": "Replace battery now" + }, + "ccSpecific": { + "notificationType": 8 + } + }, + "value": 0 + }, + { + "commandClassName": "Notification", + "commandClass": 113, + "endpoint": 0, + "property": "System", + "propertyKey": "Hardware status", + "propertyName": "System", + "propertyKeyName": "Hardware status", + "metadata": { + "type": "number", + "readable": true, + "writeable": false, + "min": 0, + "max": 255, + "label": "Hardware status", + "states": { + "0": "idle", + "1": "System hardware failure" + }, + "ccSpecific": { + "notificationType": 9 + } + }, + "value": 0 + } + ] +}