"""Support for INSTEON Modems (PLM and Hub).""" import logging import insteonplm from homeassistant.const import ( CONF_HOST, CONF_PLATFORM, CONF_PORT, EVENT_HOMEASSISTANT_STOP, ) from .const import ( CONF_CAT, CONF_DIM_STEPS, CONF_FIRMWARE, CONF_HOUSECODE, CONF_HUB_PASSWORD, CONF_HUB_USERNAME, CONF_HUB_VERSION, CONF_IP_PORT, CONF_OVERRIDE, CONF_PRODUCT_KEY, CONF_SUBCAT, CONF_UNITCODE, CONF_X10, CONF_X10_ALL_LIGHTS_OFF, CONF_X10_ALL_LIGHTS_ON, CONF_X10_ALL_UNITS_OFF, DOMAIN, INSTEON_ENTITIES, ) from .schemas import CONFIG_SCHEMA # noqa F440 from .utils import async_register_services, register_new_device_callback _LOGGER = logging.getLogger(__name__) async def async_setup(hass, config): """Set up the connection to the modem.""" insteon_modem = None conf = config[DOMAIN] port = conf.get(CONF_PORT) host = conf.get(CONF_HOST) ip_port = conf.get(CONF_IP_PORT) username = conf.get(CONF_HUB_USERNAME) password = conf.get(CONF_HUB_PASSWORD) hub_version = conf.get(CONF_HUB_VERSION) overrides = conf.get(CONF_OVERRIDE, []) x10_devices = conf.get(CONF_X10, []) x10_all_units_off_housecode = conf.get(CONF_X10_ALL_UNITS_OFF) x10_all_lights_on_housecode = conf.get(CONF_X10_ALL_LIGHTS_ON) x10_all_lights_off_housecode = conf.get(CONF_X10_ALL_LIGHTS_OFF) if host: _LOGGER.info("Connecting to Insteon Hub on %s", host) conn = await insteonplm.Connection.create( host=host, port=ip_port, username=username, password=password, hub_version=hub_version, loop=hass.loop, workdir=hass.config.config_dir, ) else: _LOGGER.info("Looking for Insteon PLM on %s", port) conn = await insteonplm.Connection.create( device=port, loop=hass.loop, workdir=hass.config.config_dir ) insteon_modem = conn.protocol hass.data[DOMAIN] = {} hass.data[DOMAIN]["modem"] = insteon_modem hass.data[DOMAIN][INSTEON_ENTITIES] = set() register_new_device_callback(hass, config, insteon_modem) async_register_services(hass, config, insteon_modem) hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, conn.close) for device_override in overrides: # # Override the device default capabilities for a specific address # address = device_override.get("address") for prop in device_override: if prop in [CONF_CAT, CONF_SUBCAT]: insteon_modem.devices.add_override(address, prop, device_override[prop]) elif prop in [CONF_FIRMWARE, CONF_PRODUCT_KEY]: insteon_modem.devices.add_override( address, CONF_PRODUCT_KEY, device_override[prop] ) if x10_all_units_off_housecode: device = insteon_modem.add_x10_device( x10_all_units_off_housecode, 20, "allunitsoff" ) if x10_all_lights_on_housecode: device = insteon_modem.add_x10_device( x10_all_lights_on_housecode, 21, "alllightson" ) if x10_all_lights_off_housecode: device = insteon_modem.add_x10_device( x10_all_lights_off_housecode, 22, "alllightsoff" ) for device in x10_devices: housecode = device.get(CONF_HOUSECODE) unitcode = device.get(CONF_UNITCODE) x10_type = "onoff" steps = device.get(CONF_DIM_STEPS, 22) if device.get(CONF_PLATFORM) == "light": x10_type = "dimmable" elif device.get(CONF_PLATFORM) == "binary_sensor": x10_type = "sensor" _LOGGER.debug( "Adding X10 device to Insteon: %s %d %s", housecode, unitcode, x10_type ) device = insteon_modem.add_x10_device(housecode, unitcode, x10_type) if device and hasattr(device.states[0x01], "steps"): device.states[0x01].steps = steps return True