rossdargan / hass-config

Home assistant configuration
6 stars 0 forks source link

Complete zwave integration for door #79

Open rossdargan opened 6 years ago

rossdargan commented 6 years ago

"""Zwave discovery schemas.""" from . import const

DEFAULT_VALUES_SCHEMA = { 'power': { const.DISC_SCHEMAS: [ {const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SENSOR_MULTILEVEL], const.DISC_INDEX: [const.INDEX_SENSOR_MULTILEVEL_POWER]}, {const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_METER], const.DISC_INDEX: [const.INDEX_METER_POWER]}, ], const.DISC_OPTIONAL: True, }, }

DISCOVERY_SCHEMAS = [ {const.DISC_COMPONENT: 'binary_sensor', const.DISC_GENERIC_DEVICE_CLASS: [ const.GENERIC_TYPE_SENSOR_ALARM, const.GENERIC_TYPE_SENSOR_BINARY, const.GENERIC_TYPE_SWITCH_BINARY, const.GENERIC_TYPE_METER, const.GENERIC_TYPE_SENSOR_MULTILEVEL, const.GENERIC_TYPE_SWITCH_MULTILEVEL, const.GENERIC_TYPE_SENSOR_NOTIFICATION, const.GENERIC_TYPE_THERMOSTAT], const.DISC_VALUES: dict(DEFAULT_VALUES_SCHEMA, { const.DISC_PRIMARY: { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SENSOR_BINARY], const.DISC_TYPE: const.TYPE_BOOL, const.DISC_GENRE: const.GENRE_USER, }, 'off_delay': { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_CONFIGURATION], const.DISC_INDEX: [9], const.DISC_OPTIONAL: True, }})}, {const.DISC_COMPONENT: 'climate', const.DISC_GENERIC_DEVICE_CLASS: [const.GENERIC_TYPE_THERMOSTAT], const.DISC_VALUES: dict(DEFAULT_VALUES_SCHEMA, { const.DISC_PRIMARY: { const.DISC_COMMAND_CLASS: [ const.COMMAND_CLASS_THERMOSTAT_SETPOINT], }, 'temperature': { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SENSOR_MULTILEVEL], const.DISC_INDEX: [const.INDEX_SENSOR_MULTILEVEL_TEMPERATURE], const.DISC_OPTIONAL: True, }, 'mode': { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_THERMOSTAT_MODE], const.DISC_OPTIONAL: True, }, 'fan_mode': { const.DISC_COMMAND_CLASS: [ const.COMMAND_CLASS_THERMOSTAT_FAN_MODE], const.DISC_OPTIONAL: True, }, 'operating_state': { const.DISC_COMMAND_CLASS: [ const.COMMAND_CLASS_THERMOSTAT_OPERATING_STATE], const.DISC_OPTIONAL: True, }, 'fan_state': { const.DISC_COMMAND_CLASS: [ const.COMMAND_CLASS_THERMOSTAT_FAN_STATE], const.DISC_OPTIONAL: True, }, 'zxt_120_swing_mode': { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_CONFIGURATION], const.DISC_INDEX: [33], const.DISC_OPTIONAL: True, }})}, {const.DISC_COMPONENT: 'cover', # Rollershutter const.DISC_GENERIC_DEVICE_CLASS: [ const.GENERIC_TYPE_SWITCH_MULTILEVEL, const.GENERIC_TYPE_ENTRY_CONTROL], const.DISC_SPECIFIC_DEVICE_CLASS: [ const.SPECIFIC_TYPE_CLASS_A_MOTOR_CONTROL, const.SPECIFIC_TYPE_CLASS_B_MOTOR_CONTROL, const.SPECIFIC_TYPE_CLASS_C_MOTOR_CONTROL, const.SPECIFIC_TYPE_MOTOR_MULTIPOSITION, const.SPECIFIC_TYPE_SECURE_BARRIER_ADDON, const.SPECIFIC_TYPE_SECURE_DOOR], const.DISC_VALUES: dict(DEFAULT_VALUES_SCHEMA, { const.DISC_PRIMARY: { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_MULTILEVEL], const.DISC_GENRE: const.GENRE_USER, }, 'open': { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_MULTILEVEL], const.DISC_INDEX: [const.INDEX_SWITCH_MULTILEVEL_BRIGHT], const.DISC_OPTIONAL: True, }, 'close': { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_MULTILEVEL], const.DISC_INDEX: [const.INDEX_SWITCH_MULTILEVEL_DIM], const.DISC_OPTIONAL: True, }})}, {const.DISC_COMPONENT: 'cover', # Garage Door Switch const.DISC_GENERIC_DEVICE_CLASS: [ const.GENERIC_TYPE_SWITCH_MULTILEVEL, const.GENERIC_TYPE_ENTRY_CONTROL], const.DISC_SPECIFIC_DEVICE_CLASS: [ const.SPECIFIC_TYPE_CLASS_A_MOTOR_CONTROL, const.SPECIFIC_TYPE_CLASS_B_MOTOR_CONTROL, const.SPECIFIC_TYPE_CLASS_C_MOTOR_CONTROL, const.SPECIFIC_TYPE_MOTOR_MULTIPOSITION, const.SPECIFIC_TYPE_SECURE_BARRIER_ADDON, const.SPECIFIC_TYPE_SECURE_DOOR], const.DISC_VALUES: dict(DEFAULT_VALUES_SCHEMA, { const.DISC_PRIMARY: { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_BINARY], const.DISC_GENRE: const.GENRE_USER, }})}, {const.DISC_COMPONENT: 'cover', # Garage Door Barrier const.DISC_GENERIC_DEVICE_CLASS: [ const.GENERIC_TYPE_SWITCH_MULTILEVEL, const.GENERIC_TYPE_ENTRY_CONTROL], const.DISC_SPECIFIC_DEVICE_CLASS: [ const.SPECIFIC_TYPE_CLASS_A_MOTOR_CONTROL, const.SPECIFIC_TYPE_CLASS_B_MOTOR_CONTROL, const.SPECIFIC_TYPE_CLASS_C_MOTOR_CONTROL, const.SPECIFIC_TYPE_MOTOR_MULTIPOSITION, const.SPECIFIC_TYPE_SECURE_BARRIER_ADDON, const.SPECIFIC_TYPE_SECURE_DOOR], const.DISC_VALUES: dict(DEFAULT_VALUES_SCHEMA, { const.DISC_PRIMARY: { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_BARRIER_OPERATOR], const.DISC_INDEX: [const.INDEX_BARRIER_OPERATOR_LABEL], }})}, {const.DISC_COMPONENT: 'fan', const.DISC_GENERIC_DEVICE_CLASS: [ const.GENERIC_TYPE_SWITCH_MULTILEVEL], const.DISC_SPECIFIC_DEVICE_CLASS: [ const.SPECIFIC_TYPE_FAN_SWITCH], const.DISC_VALUES: dict(DEFAULT_VALUES_SCHEMA, { const.DISC_PRIMARY: { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_MULTILEVEL], const.DISC_INDEX: [const.INDEX_SWITCH_MULTILEVEL_LEVEL], const.DISC_TYPE: const.TYPE_BYTE, }})}, {const.DISC_COMPONENT: 'light', const.DISC_GENERIC_DEVICE_CLASS: [ const.GENERIC_TYPE_SWITCH_MULTILEVEL, const.GENERIC_TYPE_SWITCH_REMOTE], const.DISC_SPECIFIC_DEVICE_CLASS: [ const.SPECIFIC_TYPE_POWER_SWITCH_MULTILEVEL, const.SPECIFIC_TYPE_SCENE_SWITCH_MULTILEVEL, const.SPECIFIC_TYPE_NOT_USED], const.DISC_VALUES: dict(DEFAULT_VALUES_SCHEMA, { const.DISC_PRIMARY: { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_MULTILEVEL], const.DISC_INDEX: [const.INDEX_SWITCH_MULTILEVEL_LEVEL], const.DISC_TYPE: const.TYPE_BYTE, }, 'dimming_duration': { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_MULTILEVEL], const.DISC_INDEX: [const.INDEX_SWITCH_MULTILEVEL_DURATION], const.DISC_OPTIONAL: True, }, 'color': { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_COLOR], const.DISC_INDEX: [const.INDEX_SWITCH_COLOR_COLOR], const.DISC_OPTIONAL: True, }, 'color_channels': { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_COLOR], const.DISC_INDEX: [const.INDEX_SWITCH_COLOR_CHANNELS], const.DISC_OPTIONAL: True, }})}, {const.DISC_COMPONENT: 'lock', const.DISC_GENERIC_DEVICE_CLASS: [const.GENERIC_TYPE_ENTRY_CONTROL], const.DISC_SPECIFIC_DEVICE_CLASS: [ const.SPECIFIC_TYPE_ADVANCED_DOOR_LOCK, const.SPECIFIC_TYPE_SECURE_KEYPAD_DOOR_LOCK], const.DISC_VALUES: dict(DEFAULT_VALUES_SCHEMA, { const.DISC_PRIMARY: { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_DOOR_LOCK], const.DISC_INDEX: [const.INDEX_DOOR_LOCK_LOCK], }, 'lock_log': { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_DOOR_LOCK_LOGGING], const.DISC_INDEX: [const.INDEX_DOOR_LOCK_LOGGING_RECORD], const.DISC_OPTIONAL: True, }, 'access_control': { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_ALARM], const.DISC_INDEX: [const.INDEX_ALARM_ACCESS_CONTROL], const.DISC_OPTIONAL: True, }, 'alarm_type': { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_ALARM], const.DISC_INDEX: [const.INDEX_ALARM_TYPE], const.DISC_OPTIONAL: True, }, 'alarm_level': { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_ALARM], const.DISC_INDEX: [const.INDEX_ALARM_LEVEL], const.DISC_OPTIONAL: True, }, 'v2btze_advanced': { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_CONFIGURATION], const.DISC_INDEX: [12], const.DISC_OPTIONAL: True, }})}, {const.DISC_COMPONENT: 'sensor', const.DISC_VALUES: dict(DEFAULT_VALUES_SCHEMA, { const.DISC_PRIMARY: { const.DISC_COMMAND_CLASS: [ const.COMMAND_CLASS_SENSOR_MULTILEVEL, const.COMMAND_CLASS_METER, const.COMMAND_CLASS_ALARM, const.COMMAND_CLASS_SENSOR_ALARM], const.DISC_GENRE: const.GENRE_USER, }})}, {const.DISC_COMPONENT: 'switch', const.DISC_GENERIC_DEVICE_CLASS: [ const.GENERIC_TYPE_SENSOR_ALARM, const.GENERIC_TYPE_SENSOR_BINARY, const.GENERIC_TYPE_SWITCH_BINARY, const.GENERIC_TYPE_ENTRY_CONTROL, const.GENERIC_TYPE_SENSOR_MULTILEVEL, const.GENERIC_TYPE_SWITCH_MULTILEVEL, const.GENERIC_TYPE_SENSOR_NOTIFICATION, const.GENERIC_TYPE_GENERIC_CONTROLLER, const.GENERIC_TYPE_SWITCH_REMOTE, const.GENERIC_TYPE_REPEATER_SLAVE, const.GENERIC_TYPE_THERMOSTAT, const.GENERIC_TYPE_WALL_CONTROLLER], const.DISC_VALUES: dict(DEFAULT_VALUES_SCHEMA, { const.DISC_PRIMARY: { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_BINARY], const.DISC_TYPE: const.TYPE_BOOL, const.DISC_GENRE: const.GENRE_USER, }})}, ]

rossdargan commented 6 years ago

"""Z-Wave Constants.""" DOMAIN = "zwave"

ATTR_NODE_ID = "node_id" ATTR_TARGET_NODE_ID = "target_node_id" ATTR_ASSOCIATION = "association" ATTR_INSTANCE = "instance" ATTR_GROUP = "group" ATTR_VALUE_ID = "value_id" ATTR_OBJECT_ID = "object_id" ATTR_MESSAGES = "messages" ATTR_NAME = "name" ATTR_RETURN_ROUTES = "return_routes" ATTR_SCENE_ID = "scene_id" ATTR_SCENE_DATA = "scene_data" ATTR_BASIC_LEVEL = "basic_level" ATTR_CONFIG_PARAMETER = "parameter" ATTR_CONFIG_SIZE = "size" ATTR_CONFIG_VALUE = "value" ATTR_POLL_INTENSITY = "poll_intensity" ATTR_VALUE_INDEX = "value_index" ATTR_VALUE_INSTANCE = "value_instance" NETWORK_READY_WAIT_SECS = 30

DISCOVERY_DEVICE = 'device'

DATA_DEVICES = 'zwave_devices' DATA_NETWORK = 'zwave_network' DATA_ENTITY_VALUES = 'zwave_entity_values'

SERVICE_CHANGE_ASSOCIATION = "change_association" SERVICE_ADD_NODE = "add_node" SERVICE_ADD_NODE_SECURE = "add_node_secure" SERVICE_REMOVE_NODE = "remove_node" SERVICE_CANCEL_COMMAND = "cancel_command" SERVICE_HEAL_NETWORK = "heal_network" SERVICE_HEAL_NODE = "heal_node" SERVICE_SOFT_RESET = "soft_reset" SERVICE_TEST_NODE = "test_node" SERVICE_TEST_NETWORK = "test_network" SERVICE_SET_CONFIG_PARAMETER = "set_config_parameter" SERVICE_PRINT_CONFIG_PARAMETER = "print_config_parameter" SERVICE_PRINT_NODE = "print_node" SERVICE_REMOVE_FAILED_NODE = "remove_failed_node" SERVICE_REPLACE_FAILED_NODE = "replace_failed_node" SERVICE_SET_POLL_INTENSITY = "set_poll_intensity" SERVICE_SET_WAKEUP = "set_wakeup" SERVICE_STOP_NETWORK = "stop_network" SERVICE_START_NETWORK = "start_network" SERVICE_RENAME_NODE = "rename_node" SERVICE_RENAME_VALUE = "rename_value" SERVICE_REFRESH_ENTITY = "refresh_entity" SERVICE_REFRESH_NODE = "refresh_node" SERVICE_RESET_NODE_METERS = "reset_node_meters"

EVENT_SCENE_ACTIVATED = "zwave.scene_activated" EVENT_NODE_EVENT = "zwave.node_event" EVENT_NETWORK_READY = "zwave.network_ready" EVENT_NETWORK_COMPLETE = "zwave.network_complete" EVENT_NETWORK_START = "zwave.network_start" EVENT_NETWORK_STOP = "zwave.network_stop"

COMMAND_CLASS_ALARM = 113 COMMAND_CLASS_ANTITHEFT = 93 COMMAND_CLASS_APPLICATION_CAPABILITY = 87 COMMAND_CLASS_APPLICATION_STATUS = 34 COMMAND_CLASS_ASSOCIATION = 133 COMMAND_CLASS_ASSOCIATION_COMMAND_CONFIGURATION = 155 COMMAND_CLASS_ASSOCIATION_GRP_INFO = 89 COMMAND_CLASS_BARRIER_OPERATOR = 102 COMMAND_CLASS_BASIC = 32 COMMAND_CLASS_BASIC_TARIFF_INFO = 54 COMMAND_CLASS_BASIC_WINDOW_COVERING = 80 COMMAND_CLASS_BATTERY = 128 COMMAND_CLASS_CENTRAL_SCENE = 91 COMMAND_CLASS_CLIMATE_CONTROL_SCHEDULE = 70 COMMAND_CLASS_CLOCK = 129 COMMAND_CLASS_CONFIGURATION = 112 COMMAND_CLASS_CONTROLLER_REPLICATION = 33 COMMAND_CLASS_CRC_16_ENCAP = 86 COMMAND_CLASS_DCP_CONFIG = 58 COMMAND_CLASS_DCP_MONITOR = 59 COMMAND_CLASS_DEVICE_RESET_LOCALLY = 90 COMMAND_CLASS_DOOR_LOCK = 98 COMMAND_CLASS_DOOR_LOCK_LOGGING = 76 COMMAND_CLASS_ENERGY_PRODUCTION = 144 COMMAND_CLASS_ENTRY_CONTROL = 111 COMMAND_CLASS_FIRMWARE_UPDATE_MD = 122 COMMAND_CLASS_GEOGRAPHIC_LOCATION = 140 COMMAND_CLASS_GROUPING_NAME = 123 COMMAND_CLASS_HAIL = 130 COMMAND_CLASS_HRV_CONTROL = 57 COMMAND_CLASS_HRV_STATUS = 55 COMMAND_CLASS_HUMIDITY_CONTROL_MODE = 109 COMMAND_CLASS_HUMIDITY_CONTROL_OPERATING_STATE = 110 COMMAND_CLASS_HUMIDITY_CONTROL_SETPOINT = 100 COMMAND_CLASS_INDICATOR = 135 COMMAND_CLASS_IP_ASSOCIATION = 92 COMMAND_CLASS_IP_CONFIGURATION = 14 COMMAND_CLASS_IRRIGATION = 107 COMMAND_CLASS_LANGUAGE = 137 COMMAND_CLASS_LOCK = 118 COMMAND_CLASS_MAILBOX = 105 COMMAND_CLASS_MANUFACTURER_PROPRIETARY = 145 COMMAND_CLASS_MANUFACTURER_SPECIFIC = 114 COMMAND_CLASS_MARK = 239 COMMAND_CLASS_METER = 50 COMMAND_CLASS_METER_PULSE = 53 COMMAND_CLASS_METER_TBL_CONFIG = 60 COMMAND_CLASS_METER_TBL_MONITOR = 61 COMMAND_CLASS_METER_TBL_PUSH = 62 COMMAND_CLASS_MTP_WINDOW_COVERING = 81 COMMAND_CLASS_MULTI_CHANNEL = 96 COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION = 142 COMMAND_CLASS_MULTI_COMMAND = 143 COMMAND_CLASS_NETWORK_MANAGEMENT_BASIC = 77 COMMAND_CLASS_NETWORK_MANAGEMENT_INCLUSION = 52 COMMAND_CLASS_NETWORK_MANAGEMENT_PRIMARY = 84 COMMAND_CLASS_NETWORK_MANAGEMENT_PROXY = 82 COMMAND_CLASS_NO_OPERATION = 0 COMMAND_CLASS_NODE_NAMING = 119 COMMAND_CLASS_NON_INTEROPERABLE = 240 COMMAND_CLASS_NOTIFICATION = 113 COMMAND_CLASS_POWERLEVEL = 115 COMMAND_CLASS_PREPAYMENT = 63 COMMAND_CLASS_PREPAYMENT_ENCAPSULATION = 65 COMMAND_CLASS_PROPRIETARY = 136 COMMAND_CLASS_PROTECTION = 117 COMMAND_CLASS_RATE_TBL_CONFIG = 72 COMMAND_CLASS_RATE_TBL_MONITOR = 73 COMMAND_CLASS_REMOTE_ASSOCIATION_ACTIVATE = 124 COMMAND_CLASS_REMOTE_ASSOCIATION = 125 COMMAND_CLASS_SCENE_ACTIVATION = 43 COMMAND_CLASS_SCENE_ACTUATOR_CONF = 44 COMMAND_CLASS_SCENE_CONTROLLER_CONF = 45 COMMAND_CLASS_SCHEDULE = 83 COMMAND_CLASS_SCHEDULE_ENTRY_LOCK = 78 COMMAND_CLASS_SCREEN_ATTRIBUTES = 147 COMMAND_CLASS_SCREEN_MD = 146 COMMAND_CLASS_SECURITY = 152 COMMAND_CLASS_SECURITY_SCHEME0_MARK = 61696 COMMAND_CLASS_SENSOR_ALARM = 156 COMMAND_CLASS_SENSOR_BINARY = 48 COMMAND_CLASS_SENSOR_CONFIGURATION = 158 COMMAND_CLASS_SENSOR_MULTILEVEL = 49 COMMAND_CLASS_SILENCE_ALARM = 157 COMMAND_CLASS_SIMPLE_AV_CONTROL = 148 COMMAND_CLASS_SUPERVISION = 108 COMMAND_CLASS_SWITCH_ALL = 39 COMMAND_CLASS_SWITCH_BINARY = 37 COMMAND_CLASS_SWITCH_COLOR = 51 COMMAND_CLASS_SWITCH_MULTILEVEL = 38 COMMAND_CLASS_SWITCH_TOGGLE_BINARY = 40 COMMAND_CLASS_SWITCH_TOGGLE_MULTILEVEL = 41 COMMAND_CLASS_TARIFF_TBL_CONFIG = 74 COMMAND_CLASS_TARIFF_TBL_MONITOR = 75 COMMAND_CLASS_THERMOSTAT_FAN_MODE = 68 COMMAND_CLASS_THERMOSTAT_FAN_STATE = 69 COMMAND_CLASS_THERMOSTAT_MODE = 64 COMMAND_CLASS_THERMOSTAT_OPERATING_STATE = 66 COMMAND_CLASS_THERMOSTAT_SETBACK = 71 COMMAND_CLASS_THERMOSTAT_SETPOINT = 67 COMMAND_CLASS_TIME = 138 COMMAND_CLASS_TIME_PARAMETERS = 139 COMMAND_CLASS_TRANSPORT_SERVICE = 85 COMMAND_CLASS_USER_CODE = 99 COMMAND_CLASS_VERSION = 134 COMMAND_CLASS_WAKE_UP = 132 COMMAND_CLASS_ZIP = 35 COMMAND_CLASS_ZIP_NAMING = 104 COMMAND_CLASS_ZIP_ND = 88 COMMAND_CLASS_ZIP_6LOWPAN = 79 COMMAND_CLASS_ZIP_GATEWAY = 95 COMMAND_CLASS_ZIP_PORTAL = 97 COMMAND_CLASS_ZWAVEPLUS_INFO = 94 COMMAND_CLASS_WHATEVER = None # Match ALL COMMAND_CLASS_WINDOW_COVERING = 106

GENERIC_TYPE_WHATEVER = None # Match ALL SPECIFIC_TYPE_WHATEVER = None # Match ALL SPECIFIC_TYPE_NOT_USED = 0 # Available in all Generic types

GENERIC_TYPE_AV_CONTROL_POINT = 3 SPECIFIC_TYPE_DOORBELL = 18 SPECIFIC_TYPE_SATELLITE_RECIEVER = 4 SPECIFIC_TYPE_SATELLITE_RECIEVER_V2 = 17

GENERIC_TYPE_DISPLAY = 4 SPECIFIC_TYPE_SIMPLE_DISPLAY = 1

GENERIC_TYPE_ENTRY_CONTROL = 64 SPECIFIC_TYPE_DOOR_LOCK = 1 SPECIFIC_TYPE_ADVANCED_DOOR_LOCK = 2 SPECIFIC_TYPE_SECURE_KEYPAD_DOOR_LOCK = 3 SPECIFIC_TYPE_SECURE_KEYPAD_DOOR_LOCK_DEADBOLT = 4 SPECIFIC_TYPE_SECURE_DOOR = 5 SPECIFIC_TYPE_SECURE_GATE = 6 SPECIFIC_TYPE_SECURE_BARRIER_ADDON = 7 SPECIFIC_TYPE_SECURE_BARRIER_OPEN_ONLY = 8 SPECIFIC_TYPE_SECURE_BARRIER_CLOSE_ONLY = 9 SPECIFIC_TYPE_SECURE_LOCKBOX = 10 SPECIFIC_TYPE_SECURE_KEYPAD = 11

GENERIC_TYPE_GENERIC_CONTROLLER = 1 SPECIFIC_TYPE_PORTABLE_CONTROLLER = 1 SPECIFIC_TYPE_PORTABLE_SCENE_CONTROLLER = 2 SPECIFIC_TYPE_PORTABLE_INSTALLER_TOOL = 3 SPECIFIC_TYPE_REMOTE_CONTROL_AV = 4 SPECIFIC_TYPE_REMOTE_CONTROL_SIMPLE = 6

GENERIC_TYPE_METER = 49 SPECIFIC_TYPE_SIMPLE_METER = 1 SPECIFIC_TYPE_ADV_ENERGY_CONTROL = 2 SPECIFIC_TYPE_WHOLE_HOME_METER_SIMPLE = 3

GENERIC_TYPE_METER_PULSE = 48

GENERIC_TYPE_NON_INTEROPERABLE = 255

GENERIC_TYPE_REPEATER_SLAVE = 15 SPECIFIC_TYPE_REPEATER_SLAVE = 1 SPECIFIC_TYPE_VIRTUAL_NODE = 2

GENERIC_TYPE_SECURITY_PANEL = 23 SPECIFIC_TYPE_ZONED_SECURITY_PANEL = 1

GENERIC_TYPE_SEMI_INTEROPERABLE = 80 SPECIFIC_TYPE_ENERGY_PRODUCTION = 1

GENERIC_TYPE_SENSOR_ALARM = 161 SPECIFIC_TYPE_ADV_ZENSOR_NET_ALARM_SENSOR = 5 SPECIFIC_TYPE_ADV_ZENSOR_NET_SMOKE_SENSOR = 10 SPECIFIC_TYPE_BASIC_ROUTING_ALARM_SENSOR = 1 SPECIFIC_TYPE_BASIC_ROUTING_SMOKE_SENSOR = 6 SPECIFIC_TYPE_BASIC_ZENSOR_NET_ALARM_SENSOR = 3 SPECIFIC_TYPE_BASIC_ZENSOR_NET_SMOKE_SENSOR = 8 SPECIFIC_TYPE_ROUTING_ALARM_SENSOR = 2 SPECIFIC_TYPE_ROUTING_SMOKE_SENSOR = 7 SPECIFIC_TYPE_ZENSOR_NET_ALARM_SENSOR = 4 SPECIFIC_TYPE_ZENSOR_NET_SMOKE_SENSOR = 9 SPECIFIC_TYPE_ALARM_SENSOR = 11

GENERIC_TYPE_SENSOR_BINARY = 32 SPECIFIC_TYPE_ROUTING_SENSOR_BINARY = 1

GENERIC_TYPE_SENSOR_MULTILEVEL = 33 SPECIFIC_TYPE_ROUTING_SENSOR_MULTILEVEL = 1 SPECIFIC_TYPE_CHIMNEY_FAN = 2

GENERIC_TYPE_STATIC_CONTROLLER = 2 SPECIFIC_TYPE_PC_CONTROLLER = 1 SPECIFIC_TYPE_SCENE_CONTROLLER = 2 SPECIFIC_TYPE_STATIC_INSTALLER_TOOL = 3 SPECIFIC_TYPE_SET_TOP_BOX = 4 SPECIFIC_TYPE_SUB_SYSTEM_CONTROLLER = 5 SPECIFIC_TYPE_TV = 6 SPECIFIC_TYPE_GATEWAY = 7

GENERIC_TYPE_SWITCH_BINARY = 16 SPECIFIC_TYPE_POWER_SWITCH_BINARY = 1 SPECIFIC_TYPE_SCENE_SWITCH_BINARY = 3 SPECIFIC_TYPE_POWER_STRIP = 4 SPECIFIC_TYPE_SIREN = 5 SPECIFIC_TYPE_VALVE_OPEN_CLOSE = 6 SPECIFIC_TYPE_COLOR_TUNABLE_BINARY = 2 SPECIFIC_TYPE_IRRIGATION_CONTROLLER = 7

GENERIC_TYPE_SWITCH_MULTILEVEL = 17 SPECIFIC_TYPE_CLASS_A_MOTOR_CONTROL = 5 SPECIFIC_TYPE_CLASS_B_MOTOR_CONTROL = 6 SPECIFIC_TYPE_CLASS_C_MOTOR_CONTROL = 7 SPECIFIC_TYPE_MOTOR_MULTIPOSITION = 3 SPECIFIC_TYPE_POWER_SWITCH_MULTILEVEL = 1 SPECIFIC_TYPE_SCENE_SWITCH_MULTILEVEL = 4 SPECIFIC_TYPE_FAN_SWITCH = 8 SPECIFIC_TYPE_COLOR_TUNABLE_MULTILEVEL = 2

GENERIC_TYPE_SWITCH_REMOTE = 18 SPECIFIC_TYPE_REMOTE_BINARY = 1 SPECIFIC_TYPE_REMOTE_MULTILEVEL = 2 SPECIFIC_TYPE_REMOTE_TOGGLE_BINARY = 3 SPECIFIC_TYPE_REMOTE_TOGGLE_MULTILEVEL = 4

GENERIC_TYPE_SWITCH_TOGGLE = 19 SPECIFIC_TYPE_SWITCH_TOGGLE_BINARY = 1 SPECIFIC_TYPE_SWITCH_TOGGLE_MULTILEVEL = 2

GENERIC_TYPE_THERMOSTAT = 8 SPECIFIC_TYPE_SETBACK_SCHEDULE_THERMOSTAT = 3 SPECIFIC_TYPE_SETBACK_THERMOSTAT = 5 SPECIFIC_TYPE_SETPOINT_THERMOSTAT = 4 SPECIFIC_TYPE_THERMOSTAT_GENERAL = 2 SPECIFIC_TYPE_THERMOSTAT_GENERAL_V2 = 6 SPECIFIC_TYPE_THERMOSTAT_HEATING = 1

GENERIC_TYPE_VENTILATION = 22 SPECIFIC_TYPE_RESIDENTIAL_HRV = 1

GENERIC_TYPE_WINDOWS_COVERING = 9 SPECIFIC_TYPE_SIMPLE_WINDOW_COVERING = 1

GENERIC_TYPE_ZIP_NODE = 21 SPECIFIC_TYPE_ZIP_ADV_NODE = 2 SPECIFIC_TYPE_ZIP_TUN_NODE = 1

GENERIC_TYPE_WALL_CONTROLLER = 24 SPECIFIC_TYPE_BASIC_WALL_CONTROLLER = 1

GENERIC_TYPE_NETWORK_EXTENDER = 5 SPECIFIC_TYPE_SECURE_EXTENDER = 1

GENERIC_TYPE_APPLIANCE = 6 SPECIFIC_TYPE_GENERAL_APPLIANCE = 1 SPECIFIC_TYPE_KITCHEN_APPLIANCE = 2 SPECIFIC_TYPE_LAUNDRY_APPLIANCE = 3

GENERIC_TYPE_SENSOR_NOTIFICATION = 7 SPECIFIC_TYPE_NOTIFICATION_SENSOR = 1

GENRE_WHATEVER = None GENRE_USER = "User" GENRE_SYSTEM = "System"

TYPE_WHATEVER = None TYPE_BYTE = "Byte" TYPE_BOOL = "Bool" TYPE_DECIMAL = "Decimal" TYPE_INT = "Int" TYPE_LIST = "List" TYPE_STRING = "String"

DISC_COMMAND_CLASS = "command_class" DISC_COMPONENT = "component" DISC_GENERIC_DEVICE_CLASS = "generic_device_class" DISC_GENRE = "genre" DISC_INDEX = "index" DISC_INSTANCE = "instance" DISC_NODE_ID = "node_id" DISC_OPTIONAL = "optional" DISC_PRIMARY = "primary" DISC_SCHEMAS = "schemas" DISC_SPECIFIC_DEVICE_CLASS = "specific_device_class" DISC_TYPE = "type" DISC_VALUES = "values"

noqa

https://github.com/OpenZWave/open-zwave/blob/67f180eb565f0054f517ff395c71ecd706f6a837/cpp/src/command_classes/Alarm.cpp#L49

See also:

https://github.com/OpenZWave/open-zwave/blob/67f180eb565f0054f517ff395c71ecd706f6a837/cpp/src/command_classes/Alarm.cpp#L275

https://github.com/OpenZWave/open-zwave/blob/67f180eb565f0054f517ff395c71ecd706f6a837/cpp/src/command_classes/Alarm.cpp#L278

INDEX_ALARM_TYPE = 0 INDEX_ALARM_LEVEL = 1 INDEX_ALARM_ACCESS_CONTROL = 9

https://github.com/OpenZWave/open-zwave/blob/de1c0e60edf1d1bee81f1ae54b1f58e66c6fd8ed/cpp/src/command_classes/BarrierOperator.cpp#L69

INDEX_BARRIER_OPERATOR_LABEL = 1

https://github.com/OpenZWave/open-zwave/blob/67f180eb565f0054f517ff395c71ecd706f6a837/cpp/src/command_classes/DoorLock.cpp#L77

INDEX_DOOR_LOCK_LOCK = 0

https://github.com/OpenZWave/open-zwave/blob/67f180eb565f0054f517ff395c71ecd706f6a837/cpp/src/command_classes/DoorLockLogging.cpp#L130

INDEX_DOOR_LOCK_LOGGING_RECORD=2

https://github.com/OpenZWave/open-zwave/blob/67f180eb565f0054f517ff395c71ecd706f6a837/cpp/src/command_classes/Meter.cpp#L114

See also:

https://github.com/OpenZWave/open-zwave/blob/67f180eb565f0054f517ff395c71ecd706f6a837/cpp/src/command_classes/Meter.cpp#L279

INDEX_METER_POWER = 8 INDEX_METER_RESET = 33

https://github.com/OpenZWave/open-zwave/blob/67f180eb565f0054f517ff395c71ecd706f6a837/cpp/src/command_classes/SensorMultilevel.cpp#L50

INDEX_SENSOR_MULTILEVEL_TEMPERATURE = 1 INDEX_SENSOR_MULTILEVEL_POWER = 4

https://github.com/OpenZWave/open-zwave/blob/67f180eb565f0054f517ff395c71ecd706f6a837/cpp/src/command_classes/Color.cpp#L109

INDEX_SWITCH_COLOR_COLOR = 0 INDEX_SWITCH_COLOR_CHANNELS = 2

https://github.com/OpenZWave/open-zwave/blob/67f180eb565f0054f517ff395c71ecd706f6a837/cpp/src/command_classes/SwitchMultilevel.cpp#L54

INDEX_SWITCH_MULTILEVEL_LEVEL = 0 INDEX_SWITCH_MULTILEVEL_BRIGHT = 1 INDEX_SWITCH_MULTILEVEL_DIM = 2 INDEX_SWITCH_MULTILEVEL_DURATION = 5

rossdargan commented 6 years ago

""" Z-Wave platform that handles simple door locks.

For more details about this platform, please refer to the documentation at https://home-assistant.io/components/lock.zwave/ """

Because we do not compile openzwave on CI

pylint: disable=import-error

import asyncio import logging

import voluptuous as vol

from homeassistant.components.lock import DOMAIN, LockDevice from homeassistant.components import zwave import homeassistant.helpers.config_validation as cv

_LOGGER = logging.getLogger(name)

ATTR_NOTIFICATION = 'notification' ATTR_LOCK_STATUS = 'lock_status' ATTR_LOCK_LOG = 'lock_log' ATTR_CODE_SLOT = 'code_slot' ATTR_USERCODE = 'usercode' CONFIG_ADVANCED = 'Advanced'

SERVICE_SET_USERCODE = 'set_usercode' SERVICE_GET_USERCODE = 'get_usercode' SERVICE_CLEAR_USERCODE = 'clear_usercode'

POLYCONTROL = 0x10E DANALOCK_V2_BTZE = 0x2 POLYCONTROL_DANALOCK_V2_BTZE_LOCK = (POLYCONTROL, DANALOCK_V2_BTZE) WORKAROUND_V2BTZE = 'v2btze'

DEVICE_MAPPINGS = { POLYCONTROL_DANALOCK_V2_BTZE_LOCK: WORKAROUND_V2BTZE }

LOCK_NOTIFICATION = { '1': 'Manual Lock', '2': 'Manual Unlock', '3': 'RF Lock', '4': 'RF Unlock', '5': 'Keypad Lock', '6': 'Keypad Unlock', '11': 'Lock Jammed', '254': 'Unknown Event' }

LOCK_ALARM_TYPE = { '9': 'Deadbolt Jammed', '18': 'Locked with Keypad by user ', '19': 'Unlocked with Keypad by user ', '21': 'Manually Locked ', '22': 'Manually Unlocked ', '24': 'Locked by RF', '25': 'Unlocked by RF', '27': 'Auto re-lock', '33': 'User deleted: ', '112': 'Master code changed or User added: ', '113': 'Duplicate Pin-code: ', '130': 'RF module, power restored', '161': 'Tamper Alarm: ', '167': 'Low Battery', '168': 'Critical Battery Level', '169': 'Battery too low to operate' }

MANUAL_LOCK_ALARM_LEVEL = { '1': 'by Key Cylinder or Inside thumb turn', '2': 'by Touch function (lock and leave)' }

TAMPER_ALARM_LEVEL = { '1': 'Too many keypresses', '2': 'Cover removed' }

LOCK_STATUS = { '1': True, '2': False, '3': True, '4': False, '5': True, '6': False, '9': False, '18': True, '19': False, '21': True, '22': False, '24': True, '25': False, '27': True }

ALARM_TYPE_STD = [ '18', '19', '33', '112', '113' ]

SET_USERCODE_SCHEMA = vol.Schema({ vol.Required(zwave.const.ATTR_NODE_ID): vol.Coerce(int), vol.Required(ATTR_CODE_SLOT): vol.Coerce(int), vol.Required(ATTR_USERCODE): cv.string, })

GET_USERCODE_SCHEMA = vol.Schema({ vol.Required(zwave.const.ATTR_NODE_ID): vol.Coerce(int), vol.Required(ATTR_CODE_SLOT): vol.Coerce(int), })

CLEAR_USERCODE_SCHEMA = vol.Schema({ vol.Required(zwave.const.ATTR_NODE_ID): vol.Coerce(int), vol.Required(ATTR_CODE_SLOT): vol.Coerce(int), })

@asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Set up the Z-Wave Lock platform.""" yield from zwave.async_setup_platform( hass, config, async_add_devices, discovery_info)

network = hass.data[zwave.const.DATA_NETWORK]

def set_usercode(service):
    """Set the usercode to index X on the lock."""
    node_id = service.data.get(zwave.const.ATTR_NODE_ID)
    lock_node = network.nodes[node_id]
    code_slot = service.data.get(ATTR_CODE_SLOT)
    usercode = service.data.get(ATTR_USERCODE)

    for value in lock_node.get_values(
            class_id=zwave.const.COMMAND_CLASS_USER_CODE).values():
        if value.index != code_slot:
            continue
        if len(str(usercode)) < 4:
            _LOGGER.error("Invalid code provided: (%s) "
                          "usercode must be atleast 4 and at most"
                          " %s digits",
                          usercode, len(value.data))
            break
        value.data = str(usercode)
        break

def get_usercode(service):
    """Get a usercode at index X on the lock."""
    node_id = service.data.get(zwave.const.ATTR_NODE_ID)
    lock_node = network.nodes[node_id]
    code_slot = service.data.get(ATTR_CODE_SLOT)

    for value in lock_node.get_values(
            class_id=zwave.const.COMMAND_CLASS_USER_CODE).values():
        if value.index != code_slot:
            continue
        _LOGGER.info("Usercode at slot %s is: %s", value.index, value.data)
        break

def clear_usercode(service):
    """Set usercode to slot X on the lock."""
    node_id = service.data.get(zwave.const.ATTR_NODE_ID)
    lock_node = network.nodes[node_id]
    code_slot = service.data.get(ATTR_CODE_SLOT)
    data = ''

    for value in lock_node.get_values(
            class_id=zwave.const.COMMAND_CLASS_USER_CODE).values():
        if value.index != code_slot:
            continue
        for i in range(len(value.data)):
            data += '\0'
            i += 1
        _LOGGER.debug('Data to clear lock: %s', data)
        value.data = data
        _LOGGER.info("Usercode at slot %s is cleared", value.index)
        break

hass.services.async_register(
    DOMAIN, SERVICE_SET_USERCODE, set_usercode,
    schema=SET_USERCODE_SCHEMA)
hass.services.async_register(
    DOMAIN, SERVICE_GET_USERCODE, get_usercode,
    schema=GET_USERCODE_SCHEMA)
hass.services.async_register(
    DOMAIN, SERVICE_CLEAR_USERCODE, clear_usercode,
    schema=CLEAR_USERCODE_SCHEMA)

def get_device(node, values, **kwargs): """Create Z-Wave entity device.""" return ZwaveLock(values)

class ZwaveLock(zwave.ZWaveDeviceEntity, LockDevice): """Representation of a Z-Wave Lock."""

def __init__(self, values):
    """Initialize the Z-Wave lock device."""
    zwave.ZWaveDeviceEntity.__init__(self, values, DOMAIN)
    self._state = None
    self._notification = None
    self._lock_status = None
    self._lock_log = None        
    self._v2btze = None

    # Enable appropriate workaround flags for our device
    # Make sure that we have values for the key before converting to int
    if (self.node.manufacturer_id.strip() and
            self.node.product_id.strip()):
        specific_sensor_key = (int(self.node.manufacturer_id, 16),
                               int(self.node.product_id, 16))
        if specific_sensor_key in DEVICE_MAPPINGS:
            if DEVICE_MAPPINGS[specific_sensor_key] == WORKAROUND_V2BTZE:
                self._v2btze = 1
                _LOGGER.debug("Polycontrol Danalock v2 BTZE "
                              "workaround enabled")
    self.update_properties()

def update_properties(self):
    """Handle data changes for node values."""
    self._state = self.values.primary.data
    _LOGGER.debug("Lock state set from Bool value and is %s", self._state)
    if self.values.access_control:
        notification_data = self.values.access_control.data
        self._notification = LOCK_NOTIFICATION.get(str(notification_data))

        if self._v2btze:
            if self.values.v2btze_advanced and \
                    self.values.v2btze_advanced.data == CONFIG_ADVANCED:
                self._state = LOCK_STATUS.get(str(notification_data))
                _LOGGER.debug(
                    "Lock state set from Access Control value and is %s, "
                    "get=%s", str(notification_data), self.state)

    if self.values.lock_log:
       self._lock_log = self.values.lock_log.data
       _LOGGER.error("Lock log %s", str(log_data))

    if not self.values.alarm_type:
        return

    alarm_type = self.values.alarm_type.data
    _LOGGER.debug("Lock alarm_type is %s", str(alarm_type))
    if self.values.alarm_level:
        alarm_level = self.values.alarm_level.data
    else:
        alarm_level = None
    _LOGGER.debug("Lock alarm_level is %s", str(alarm_level))

    if not alarm_type:
        return
    if alarm_type == 21:
        self._lock_status = '{}{}'.format(
            LOCK_ALARM_TYPE.get(str(alarm_type)),
            MANUAL_LOCK_ALARM_LEVEL.get(str(alarm_level)))
        return
    if str(alarm_type) in ALARM_TYPE_STD:
        self._lock_status = '{}{}'.format(
            LOCK_ALARM_TYPE.get(str(alarm_type)), str(alarm_level))
        return
    if alarm_type == 161:
        self._lock_status = '{}{}'.format(
            LOCK_ALARM_TYPE.get(str(alarm_type)),
            TAMPER_ALARM_LEVEL.get(str(alarm_level)))
        return
    if alarm_type != 0:
        self._lock_status = LOCK_ALARM_TYPE.get(str(alarm_type))
        return

@property
def is_locked(self):
    """Return true if device is locked."""
    return self._state

def lock(self, **kwargs):
    """Lock the device."""
    self.values.primary.data = True

def unlock(self, **kwargs):
    """Unlock the device."""
    self.values.primary.data = False

@property
def device_state_attributes(self):
    """Return the device specific state attributes."""
    data = super().device_state_attributes
    if self._notification:
        data[ATTR_NOTIFICATION] = self._notification
    if self._lock_status:
        data[ATTR_LOCK_STATUS] = self._lock_status
    if self._lock_log:
        data[ATTR_LOCK_LOG] = self._lock_log            
    return data