107 lines
3.3 KiB
Python
107 lines
3.3 KiB
Python
"""Helpers for LCN component."""
|
|
import re
|
|
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.const import CONF_NAME
|
|
|
|
from .const import DEFAULT_NAME
|
|
|
|
# Regex for address validation
|
|
PATTERN_ADDRESS = re.compile(
|
|
"^((?P<conn_id>\\w+)\\.)?s?(?P<seg_id>\\d+)\\.(?P<type>m|g)?(?P<id>\\d+)$"
|
|
)
|
|
|
|
|
|
def get_connection(connections, connection_id=None):
|
|
"""Return the connection object from list."""
|
|
if connection_id is None:
|
|
connection = connections[0]
|
|
else:
|
|
for connection in connections:
|
|
if connection.connection_id == connection_id:
|
|
break
|
|
else:
|
|
raise ValueError("Unknown connection_id.")
|
|
return connection
|
|
|
|
|
|
def has_unique_connection_names(connections):
|
|
"""Validate that all connection names are unique.
|
|
|
|
Use 'pchk' as default connection_name (or add a numeric suffix if
|
|
pchk' is already in use.
|
|
"""
|
|
for suffix, connection in enumerate(connections):
|
|
connection_name = connection.get(CONF_NAME)
|
|
if connection_name is None:
|
|
if suffix == 0:
|
|
connection[CONF_NAME] = DEFAULT_NAME
|
|
else:
|
|
connection[CONF_NAME] = f"{DEFAULT_NAME}{suffix:d}"
|
|
|
|
schema = vol.Schema(vol.Unique())
|
|
schema([connection.get(CONF_NAME) for connection in connections])
|
|
return connections
|
|
|
|
|
|
def is_address(value):
|
|
"""Validate the given address string.
|
|
|
|
Examples for S000M005 at myhome:
|
|
myhome.s000.m005
|
|
myhome.s0.m5
|
|
myhome.0.5 ("m" is implicit if missing)
|
|
|
|
Examples for s000g011
|
|
myhome.0.g11
|
|
myhome.s0.g11
|
|
"""
|
|
matcher = PATTERN_ADDRESS.match(value)
|
|
if matcher:
|
|
is_group = matcher.group("type") == "g"
|
|
addr = (int(matcher.group("seg_id")), int(matcher.group("id")), is_group)
|
|
conn_id = matcher.group("conn_id")
|
|
return addr, conn_id
|
|
raise vol.error.Invalid("Not a valid address string.")
|
|
|
|
|
|
def is_relays_states_string(states_string):
|
|
"""Validate the given states string and return states list."""
|
|
if len(states_string) == 8:
|
|
states = []
|
|
for state_string in states_string:
|
|
if state_string == "1":
|
|
state = "ON"
|
|
elif state_string == "0":
|
|
state = "OFF"
|
|
elif state_string == "T":
|
|
state = "TOGGLE"
|
|
elif state_string == "-":
|
|
state = "NOCHANGE"
|
|
else:
|
|
raise vol.error.Invalid("Not a valid relay state string.")
|
|
states.append(state)
|
|
return states
|
|
raise vol.error.Invalid("Wrong length of relay state string.")
|
|
|
|
|
|
def is_key_lock_states_string(states_string):
|
|
"""Validate the given states string and returns states list."""
|
|
if len(states_string) == 8:
|
|
states = []
|
|
for state_string in states_string:
|
|
if state_string == "1":
|
|
state = "ON"
|
|
elif state_string == "0":
|
|
state = "OFF"
|
|
elif state_string == "T":
|
|
state = "TOGGLE"
|
|
elif state_string == "-":
|
|
state = "NOCHANGE"
|
|
else:
|
|
raise vol.error.Invalid("Not a valid key lock state string.")
|
|
states.append(state)
|
|
return states
|
|
raise vol.error.Invalid("Wrong length of key lock state string.")
|