"""Set up the demo environment that mimics interaction with devices.""" import asyncio import logging import time from homeassistant import bootstrap import homeassistant.core as ha from homeassistant.const import ATTR_ENTITY_ID, EVENT_HOMEASSISTANT_START DOMAIN = "demo" _LOGGER = logging.getLogger(__name__) COMPONENTS_WITH_DEMO_PLATFORM = [ "air_quality", "alarm_control_panel", "binary_sensor", "calendar", "camera", "climate", "cover", "device_tracker", "fan", "image_processing", "light", "lock", "media_player", "notify", "sensor", "switch", "tts", "mailbox", ] async def async_setup(hass, config): """Set up the demo environment.""" if DOMAIN not in config: return True config.setdefault(ha.DOMAIN, {}) config.setdefault(DOMAIN, {}) # Set up demo platforms for component in COMPONENTS_WITH_DEMO_PLATFORM: hass.async_create_task( hass.helpers.discovery.async_load_platform(component, DOMAIN, {}, config) ) # Set up sun if not hass.config.latitude: hass.config.latitude = 32.87336 if not hass.config.longitude: hass.config.longitude = 117.22743 tasks = [bootstrap.async_setup_component(hass, "sun", config)] # Set up input select tasks.append( bootstrap.async_setup_component( hass, "input_select", { "input_select": { "living_room_preset": { "options": ["Visitors", "Visitors with kids", "Home Alone"] }, "who_cooks": { "icon": "mdi:panda", "initial": "Anne Therese", "name": "Cook today", "options": ["Paulus", "Anne Therese"], }, } }, ) ) # Set up input boolean tasks.append( bootstrap.async_setup_component( hass, "input_boolean", { "input_boolean": { "notify": { "icon": "mdi:car", "initial": False, "name": "Notify Anne Therese is home", } } }, ) ) # Set up input boolean tasks.append( bootstrap.async_setup_component( hass, "input_number", { "input_number": { "noise_allowance": { "icon": "mdi:bell-ring", "min": 0, "max": 10, "name": "Allowed Noise", "unit_of_measurement": "dB", } } }, ) ) # Set up weblink tasks.append( bootstrap.async_setup_component( hass, "weblink", { "weblink": { "entities": [{"name": "Router", "url": "http://192.168.1.1"}] } }, ) ) results = await asyncio.gather(*tasks) if any(not result for result in results): return False # Set up example persistent notification hass.components.persistent_notification.async_create( "This is an example of a persistent notification.", title="Example Notification" ) # Set up configurator configurator_ids = [] configurator = hass.components.configurator def hue_configuration_callback(data): """Fake callback, mark config as done.""" time.sleep(2) # First time it is called, pretend it failed. if len(configurator_ids) == 1: configurator.notify_errors( configurator_ids[0], "Failed to register, please try again." ) configurator_ids.append(0) else: configurator.request_done(configurator_ids[0]) request_id = configurator.async_request_config( "Philips Hue", hue_configuration_callback, description=( "Press the button on the bridge to register Philips " "Hue with Home Assistant." ), description_image="/static/images/config_philips_hue.jpg", fields=[{"id": "username", "name": "Username"}], submit_caption="I have pressed the button", ) configurator_ids.append(request_id) async def demo_start_listener(_event): """Finish set up.""" await finish_setup(hass, config) hass.bus.async_listen(EVENT_HOMEASSISTANT_START, demo_start_listener) return True async def finish_setup(hass, config): """Finish set up once demo platforms are set up.""" lights = sorted(hass.states.async_entity_ids("light")) switches = sorted(hass.states.async_entity_ids("switch")) # Set up history graph await bootstrap.async_setup_component( hass, "history_graph", { "history_graph": { "switches": { "name": "Recent Switches", "entities": switches, "hours_to_show": 1, "refresh": 60, } } }, ) # Set up scripts await bootstrap.async_setup_component( hass, "script", { "script": { "demo": { "alias": "Toggle {}".format(lights[0].split(".")[1]), "sequence": [ { "service": "light.turn_off", "data": {ATTR_ENTITY_ID: lights[0]}, }, {"delay": {"seconds": 5}}, { "service": "light.turn_on", "data": {ATTR_ENTITY_ID: lights[0]}, }, {"delay": {"seconds": 5}}, { "service": "light.turn_off", "data": {ATTR_ENTITY_ID: lights[0]}, }, ], } } }, ) # Set up scenes await bootstrap.async_setup_component( hass, "scene", { "scene": [ { "name": "Romantic lights", "entities": { lights[0]: True, lights[1]: { "state": "on", "xy_color": [0.33, 0.66], "brightness": 200, }, }, }, { "name": "Switch on and off", "entities": {switches[0]: True, switches[1]: False}, }, ] }, )