def setup_platform(hass, config, add_devices_callback, discovery_info=None): """ Find and return Vera lights. """ import pyvera as veraApi base_url = config.get('vera_controller_url') if not base_url: _LOGGER.error( "The required parameter 'vera_controller_url'" " was not found in config" ) return False device_data = config.get('device_data', {}) controller = veraApi.VeraController(base_url) devices = [] try: devices = controller.get_devices(['Switch', 'On/Off Switch']) except RequestException: # There was a network related error connecting to the vera controller _LOGGER.exception("Error communicating with Vera API") return False lights = [] for device in devices: extra_data = device_data.get(device.deviceId, {}) exclude = extra_data.get('exclude', False) if exclude is not True: lights.append(VeraSwitch(device, extra_data)) add_devices_callback(lights)
def get_devices(hass, config): """ Find and return Vera switches. """ import pyvera as veraApi base_url = config.get('vera_controller_url') if not base_url: _LOGGER.error( "The required parameter 'vera_controller_url'" " was not found in config" ) return False device_data = config.get('device_data', {}) vera_controller = veraApi.VeraController(base_url) devices = [] try: devices = vera_controller.get_devices([ 'Switch', 'Armable Sensor', 'On/Off Switch']) except RequestException: # There was a network related error connecting to the vera controller. _LOGGER.exception("Error communicating with Vera API") return False vera_switches = [] for device in devices: extra_data = device_data.get(device.deviceId, {}) exclude = extra_data.get('exclude', False) if exclude is not True: vera_switches.append(VeraSwitch(device, extra_data)) return vera_switches
def __init__(self, zwave_id, config_file): self.zwave_id = zwave_id config = configparser.ConfigParser() config.read(config_file) ip_address = config.get('ZWAVE_CONTROLLER', 'ip_address') port = config.get('ZWAVE_CONTROLLER', 'port') controller_address = "http://{}:{}/".format(ip_address, port) log.debug("Controller: {}".format(controller_address)) self._controller = pyvera.VeraController(controller_address) self._devices = self._controller.get_devices('On/Off Switch') self._mapping_id_to_ix = {} for index, value in enumerate(self._devices): self._mapping_id_to_ix[value.device_id] = index self._index = self._mapping_id_to_ix[self.zwave_id] log.debug("ix: {}, id: {}".format(self._index, self.zwave_id))
async def async_step_finish(self, config: dict): """Validate and create config entry.""" base_url = config[CONF_CONTROLLER] = config[CONF_CONTROLLER].rstrip( "/") controller = pv.VeraController(base_url) # Verify the controller is online and get the serial number. try: await self.hass.async_add_executor_job(controller.refresh_data) except RequestException: _LOGGER.error("Failed to connect to vera controller %s", base_url) return self.async_abort( reason="cannot_connect", description_placeholders={"base_url": base_url}) await self.async_set_unique_id(controller.serial_number) self._abort_if_unique_id_configured(config) return self.async_create_entry(title=base_url, data=config)
async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool: """Do setup of vera.""" # Use options entered during initial config flow or provided from configuration.yml if config_entry.data.get(CONF_LIGHTS) or config_entry.data.get( CONF_EXCLUDE): hass.config_entries.async_update_entry( entry=config_entry, data=config_entry.data, options=new_options( config_entry.data.get(CONF_LIGHTS, []), config_entry.data.get(CONF_EXCLUDE, []), ), ) saved_light_ids = config_entry.options.get(CONF_LIGHTS, []) saved_exclude_ids = config_entry.options.get(CONF_EXCLUDE, []) base_url = config_entry.data[CONF_CONTROLLER] light_ids = fix_device_id_list(saved_light_ids) exclude_ids = fix_device_id_list(saved_exclude_ids) # If the ids were corrected. Update the config entry. if light_ids != saved_light_ids or exclude_ids != saved_exclude_ids: hass.config_entries.async_update_entry(entry=config_entry, options=new_options( light_ids, exclude_ids)) # Initialize the Vera controller. subscription_registry = SubscriptionRegistry(hass) controller = veraApi.VeraController(base_url, subscription_registry) try: all_devices = await hass.async_add_executor_job(controller.get_devices) all_scenes = await hass.async_add_executor_job(controller.get_scenes) except RequestException as exception: # There was a network related error connecting to the Vera controller. _LOGGER.exception("Error communicating with Vera API") raise ConfigEntryNotReady from exception # Exclude devices unwanted by user. devices = [ device for device in all_devices if device.device_id not in exclude_ids ] vera_devices = defaultdict(list) for device in devices: device_type = map_vera_device(device, light_ids) if device_type is not None: vera_devices[device_type].append(device) vera_scenes = [] for scene in all_scenes: vera_scenes.append(scene) controller_data = ControllerData( controller=controller, devices=vera_devices, scenes=vera_scenes, config_entry=config_entry, ) set_controller_data(hass, config_entry, controller_data) # Forward the config data to the necessary platforms. for platform in get_configured_platforms(controller_data): hass.async_create_task( hass.config_entries.async_forward_entry_setup( config_entry, platform)) def stop_subscription(event): """Stop SubscriptionRegistry updates.""" controller.stop() await hass.async_add_executor_job(controller.start) hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, stop_subscription) return True
async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool: """Do setup of vera.""" # Use options entered during initial config flow or provided from configuration.yml if config_entry.data.get(CONF_LIGHTS) or config_entry.data.get( CONF_EXCLUDE): hass.config_entries.async_update_entry( entry=config_entry, data=config_entry.data, options=new_options( config_entry.data.get(CONF_LIGHTS, []), config_entry.data.get(CONF_EXCLUDE, []), ), ) base_url = config_entry.data[CONF_CONTROLLER] light_ids = config_entry.options.get(CONF_LIGHTS, []) exclude_ids = config_entry.options.get(CONF_EXCLUDE, []) # Initialize the Vera controller. controller = veraApi.VeraController(base_url) controller.start() hass.bus.async_listen_once( EVENT_HOMEASSISTANT_STOP, lambda event: hass.async_add_executor_job(controller.stop), ) try: all_devices = await hass.async_add_executor_job(controller.get_devices) all_scenes = await hass.async_add_executor_job(controller.get_scenes) except RequestException: # There was a network related error connecting to the Vera controller. _LOGGER.exception("Error communicating with Vera API") return False # Exclude devices unwanted by user. devices = [ device for device in all_devices if device.device_id not in exclude_ids ] vera_devices = defaultdict(list) for device in devices: device_type = map_vera_device(device, light_ids) if device_type is None: continue vera_devices[device_type].append(device) vera_scenes = [] for scene in all_scenes: vera_scenes.append(scene) controller_data = ControllerData(controller=controller, devices=vera_devices, scenes=vera_scenes) hass.data[DOMAIN] = controller_data # Forward the config data to the necessary platforms. for platform in get_configured_platforms(controller_data): hass.async_create_task( hass.config_entries.async_forward_entry_setup( config_entry, platform)) return True
def connect_to_controller(address): controller = pyvera.VeraController(address) return controller