"""Support for LCN binary sensors.""" import pypck from homeassistant.components.binary_sensor import BinarySensorDevice from homeassistant.const import CONF_ADDRESS from . import LcnDevice from .const import ( BINSENSOR_PORTS, CONF_CONNECTIONS, CONF_SOURCE, DATA_LCN, SETPOINTS) from .helpers import get_connection async def async_setup_platform(hass, hass_config, async_add_entities, discovery_info=None): """Set up the LCN binary sensor platform.""" if discovery_info is None: return devices = [] for config in discovery_info: address, connection_id = config[CONF_ADDRESS] addr = pypck.lcn_addr.LcnAddr(*address) connections = hass.data[DATA_LCN][CONF_CONNECTIONS] connection = get_connection(connections, connection_id) address_connection = connection.get_address_conn(addr) if config[CONF_SOURCE] in SETPOINTS: device = LcnRegulatorLockSensor(config, address_connection) elif config[CONF_SOURCE] in BINSENSOR_PORTS: device = LcnBinarySensor(config, address_connection) else: # in KEYS device = LcnLockKeysSensor(config, address_connection) devices.append(device) async_add_entities(devices) class LcnRegulatorLockSensor(LcnDevice, BinarySensorDevice): """Representation of a LCN binary sensor for regulator locks.""" def __init__(self, config, address_connection): """Initialize the LCN binary sensor.""" super().__init__(config, address_connection) self.setpoint_variable = \ pypck.lcn_defs.Var[config[CONF_SOURCE]] self._value = None async def async_added_to_hass(self): """Run when entity about to be added to hass.""" await super().async_added_to_hass() await self.address_connection.activate_status_request_handler( self.setpoint_variable) @property def is_on(self): """Return true if the binary sensor is on.""" return self._value def input_received(self, input_obj): """Set sensor value when LCN input object (command) is received.""" if not isinstance(input_obj, pypck.inputs.ModStatusVar) or \ input_obj.get_var() != self.setpoint_variable: return self._value = input_obj.get_value().is_locked_regulator() self.async_schedule_update_ha_state() class LcnBinarySensor(LcnDevice, BinarySensorDevice): """Representation of a LCN binary sensor for binary sensor ports.""" def __init__(self, config, address_connection): """Initialize the LCN binary sensor.""" super().__init__(config, address_connection) self.bin_sensor_port = \ pypck.lcn_defs.BinSensorPort[config[CONF_SOURCE]] self._value = None async def async_added_to_hass(self): """Run when entity about to be added to hass.""" await super().async_added_to_hass() await self.address_connection.activate_status_request_handler( self.bin_sensor_port) @property def is_on(self): """Return true if the binary sensor is on.""" return self._value def input_received(self, input_obj): """Set sensor value when LCN input object (command) is received.""" if not isinstance(input_obj, pypck.inputs.ModStatusBinSensors): return self._value = input_obj.get_state(self.bin_sensor_port.value) self.async_schedule_update_ha_state() class LcnLockKeysSensor(LcnDevice, BinarySensorDevice): """Representation of a LCN sensor for key locks.""" def __init__(self, config, address_connection): """Initialize the LCN sensor.""" super().__init__(config, address_connection) self.source = pypck.lcn_defs.Key[config[CONF_SOURCE]] self._value = None async def async_added_to_hass(self): """Run when entity about to be added to hass.""" await super().async_added_to_hass() await self.address_connection.activate_status_request_handler( self.source) @property def is_on(self): """Return true if the binary sensor is on.""" return self._value def input_received(self, input_obj): """Set sensor value when LCN input object (command) is received.""" if not isinstance(input_obj, pypck.inputs.ModStatusKeyLocks) or \ self.source not in pypck.lcn_defs.Key: return table_id = ord(self.source.name[0]) - 65 key_id = int(self.source.name[1]) - 1 self._value = input_obj.get_state(table_id, key_id) self.async_schedule_update_ha_state()