""" homeassistant.components.demo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sets up a demo environment that mimics interaction with devices """ import random import homeassistant as ha import homeassistant.loader as loader from homeassistant.components import (SERVICE_TURN_ON, SERVICE_TURN_OFF, STATE_ON, STATE_OFF, ATTR_ENTITY_PICTURE, extract_entity_ids) from homeassistant.components.light import (ATTR_XY_COLOR, ATTR_BRIGHTNESS, GROUP_NAME_ALL_LIGHTS) from homeassistant.util import split_entity_id DOMAIN = "demo" DEPENDENCIES = [] def setup(hass, config): """ Setup a demo environment. """ group = loader.get_component('group') if config[DOMAIN].get('hide_demo_state') != '1': hass.states.set('a.Demo_Mode', 'Enabled') light_colors = [ [0.861, 0.3259], [0.6389, 0.3028], [0.1684, 0.0416] ] def mock_turn_on(service): """ Will fake the component has been turned on. """ for entity_id in extract_entity_ids(hass, service): domain, _ = split_entity_id(entity_id) if domain == "light": data = {ATTR_BRIGHTNESS: 200, ATTR_XY_COLOR: random.choice(light_colors)} else: data = None hass.states.set(entity_id, STATE_ON, data) def mock_turn_off(service): """ Will fake the component has been turned off. """ for entity_id in extract_entity_ids(hass, service): hass.states.set(entity_id, STATE_OFF) # Setup sun if ha.CONF_LATITUDE not in config[ha.DOMAIN]: config[ha.DOMAIN][ha.CONF_LATITUDE] = '32.87336' if ha.CONF_LONGITUDE not in config[ha.DOMAIN]: config[ha.DOMAIN][ha.CONF_LONGITUDE] = '-117.22743' loader.get_component('sun').setup(hass, config) # Setup fake lights lights = ['light.Bowl', 'light.Ceiling', 'light.TV_Back_light', 'light.Bed_light'] hass.services.register('light', SERVICE_TURN_ON, mock_turn_on) hass.services.register('light', SERVICE_TURN_OFF, mock_turn_off) mock_turn_on(ha.ServiceCall('light', SERVICE_TURN_ON, {'entity_id': lights[0:2]})) mock_turn_off(ha.ServiceCall('light', SERVICE_TURN_OFF, {'entity_id': lights[2:]})) group.setup_group(hass, GROUP_NAME_ALL_LIGHTS, lights, False) # Setup switch switches = ['switch.AC', 'switch.Christmas_Lights'] hass.services.register('switch', SERVICE_TURN_ON, mock_turn_on) hass.services.register('switch', SERVICE_TURN_OFF, mock_turn_off) mock_turn_on(ha.ServiceCall('switch', SERVICE_TURN_ON, {'entity_id': switches[0:1]})) mock_turn_off(ha.ServiceCall('switch', SERVICE_TURN_OFF, {'entity_id': switches[1:]})) # Setup room groups group.setup_group(hass, 'living_room', lights[0:3] + switches[0:1]) group.setup_group(hass, 'bedroom', [lights[3]] + switches[1:]) # Setup process hass.states.set("process.XBMC", STATE_ON) # Setup device tracker hass.states.set("device_tracker.Paulus", "home", {ATTR_ENTITY_PICTURE: "http://graph.facebook.com/schoutsen/picture"}) hass.states.set("device_tracker.Anne_Therese", "not_home", {ATTR_ENTITY_PICTURE: "http://graph.facebook.com/anne.t.frederiksen/picture"}) hass.states.set("group.all_devices", "home", { "auto": True, "entity_id": [ "device_tracker.Paulus", "device_tracker.Anne_Therese" ] }) # Setup chromecast hass.states.set("chromecast.Living_Rm", "Netflix", {'friendly_name': 'Living Room', ATTR_ENTITY_PICTURE: 'http://graph.facebook.com/KillBillMovie/picture'}) # Setup tellstick sensors hass.states.set("tellstick_sensor.Outside_temperature", "15.6", { 'friendly_name': 'Outside temperature', 'unit_of_measurement': '°C' }) hass.states.set("tellstick_sensor.Outside_humidity", "54", { 'friendly_name': 'Outside humidity', 'unit_of_measurement': '%' }) return True