def test_platform(self, mock_setup_component): """Test discover platform method.""" calls = [] @callback def platform_callback(platform, info): """Platform callback method.""" calls.append((platform, info)) discovery.listen_platform(self.hass, 'test_component', platform_callback) discovery.load_platform(self.hass, 'test_component', 'test_platform', 'discovery info') self.hass.block_till_done() assert mock_setup_component.called assert mock_setup_component.call_args[0] == \ (self.hass, 'test_component', None) self.hass.block_till_done() discovery.load_platform(self.hass, 'test_component_2', 'test_platform', 'discovery info') self.hass.block_till_done() assert len(calls) == 1 assert calls[0] == ('test_platform', 'discovery info') self.hass.bus.fire( discovery.EVENT_PLATFORM_DISCOVERED, { discovery.ATTR_SERVICE: discovery.EVENT_LOAD_PLATFORM.format('test_component') }) self.hass.block_till_done() assert len(calls) == 1
def test_platform(self, mock_setup_component): """Test discover platform method.""" calls = [] @callback def platform_callback(platform, info): """Platform callback method.""" calls.append((platform, info)) discovery.listen_platform(self.hass, 'test_component', platform_callback) discovery.load_platform(self.hass, 'test_component', 'test_platform', 'discovery info') self.hass.block_till_done() assert mock_setup_component.called assert mock_setup_component.call_args[0] == \ (self.hass, 'test_component', None) self.hass.block_till_done() discovery.load_platform(self.hass, 'test_component_2', 'test_platform', 'discovery info') self.hass.block_till_done() assert len(calls) == 1 assert calls[0] == ('test_platform', 'discovery info') self.hass.bus.fire(discovery.EVENT_PLATFORM_DISCOVERED, { discovery.ATTR_SERVICE: discovery.EVENT_LOAD_PLATFORM.format('test_component') }) self.hass.block_till_done() assert len(calls) == 1
def setup(self, config): """Set up a full entity component. Loads the platforms from the config and will listen for supported discovered platforms. """ self.config = config # Look in config for Domain, Domain 2, Domain 3 etc and load them for p_type, p_config in config_per_platform(config, self.domain): self._setup_platform(p_type, p_config) # Generic discovery listener for loading platform dynamically # Refer to: homeassistant.components.discovery.load_platform() def component_platform_discovered(platform, info): """Callback to load a platform.""" self._setup_platform(platform, {}, info) discovery.listen_platform(self.hass, self.domain, component_platform_discovered)
def setup(hass, config): """Setup the notify services.""" descriptions = load_yaml_config_file( os.path.join(os.path.dirname(__file__), 'services.yaml')) targets = {} def setup_notify_platform(platform, p_config=None, discovery_info=None): """Set up a notify platform.""" if p_config is None: p_config = {} if discovery_info is None: discovery_info = {} notify_implementation = bootstrap.prepare_setup_platform( hass, config, DOMAIN, platform) if notify_implementation is None: _LOGGER.error("Unknown notification service specified") return False notify_service = notify_implementation.get_service( hass, p_config, discovery_info) if notify_service is None: _LOGGER.error("Failed to initialize notification service %s", platform) return False def notify_message(notify_service, call): """Handle sending notification message service calls.""" kwargs = {} message = call.data[ATTR_MESSAGE] title = call.data.get(ATTR_TITLE) if title: title.hass = hass kwargs[ATTR_TITLE] = title.render() if targets.get(call.service) is not None: kwargs[ATTR_TARGET] = [targets[call.service]] elif call.data.get(ATTR_TARGET) is not None: kwargs[ATTR_TARGET] = call.data.get(ATTR_TARGET) message.hass = hass kwargs[ATTR_MESSAGE] = message.render() kwargs[ATTR_DATA] = call.data.get(ATTR_DATA) notify_service.send_message(**kwargs) service_call_handler = partial(notify_message, notify_service) if hasattr(notify_service, 'targets'): platform_name = ( p_config.get(CONF_NAME) or discovery_info.get(CONF_NAME) or platform) for name, target in notify_service.targets.items(): target_name = slugify('{}_{}'.format(platform_name, name)) targets[target_name] = target hass.services.register(DOMAIN, target_name, service_call_handler, descriptions.get(SERVICE_NOTIFY), schema=NOTIFY_SERVICE_SCHEMA) platform_name = ( p_config.get(CONF_NAME) or discovery_info.get(CONF_NAME) or SERVICE_NOTIFY) platform_name_slug = slugify(platform_name) hass.services.register( DOMAIN, platform_name_slug, service_call_handler, descriptions.get(SERVICE_NOTIFY), schema=NOTIFY_SERVICE_SCHEMA) return True for platform, p_config in config_per_platform(config, DOMAIN): if not setup_notify_platform(platform, p_config): _LOGGER.error("Failed to set up platform %s", platform) continue def platform_discovered(platform, info): """Callback to load a platform.""" setup_notify_platform(platform, discovery_info=info) discovery.listen_platform(hass, DOMAIN, platform_discovered) return True