150 lines
4.2 KiB
Python
150 lines
4.2 KiB
Python
"""
|
|
Example of a custom component.
|
|
|
|
Example component to target an entity_id to:
|
|
- turn it on at 7AM in the morning
|
|
- turn it on if anyone comes home and it is off
|
|
- turn it off if all lights are turned off
|
|
- turn it off if all people leave the house
|
|
- offer a service to turn it on for 10 seconds
|
|
|
|
Configuration:
|
|
|
|
To use the Example custom component you will need to add the following to
|
|
your configuration.yaml file.
|
|
|
|
example:
|
|
target: TARGET_ENTITY
|
|
|
|
Variable:
|
|
|
|
target
|
|
*Required
|
|
TARGET_ENTITY should be one of your devices that can be turned on and off,
|
|
ie a light or a switch. Example value could be light.Ceiling or switch.AC
|
|
(if you have these devices with those names).
|
|
"""
|
|
import time
|
|
import logging
|
|
|
|
from homeassistant.const import STATE_HOME, STATE_NOT_HOME, STATE_ON, STATE_OFF
|
|
from homeassistant.helpers import validate_config
|
|
from homeassistant.helpers.event_decorators import \
|
|
track_state_change, track_time_change
|
|
from homeassistant.helpers.service import service
|
|
import homeassistant.components as core
|
|
from homeassistant.components import device_tracker
|
|
from homeassistant.components import light
|
|
|
|
# The domain of your component. Should be equal to the name of your component.
|
|
DOMAIN = "example"
|
|
|
|
# List of component names (string) your component depends upon.
|
|
# We depend on group because group will be loaded after all the components that
|
|
# initialize devices have been setup.
|
|
DEPENDENCIES = ['group', 'device_tracker', 'light']
|
|
|
|
# Configuration key for the entity id we are targeting.
|
|
CONF_TARGET = 'target'
|
|
|
|
# Variable for storing configuration parameters.
|
|
TARGET_ID = None
|
|
|
|
# Name of the service that we expose.
|
|
SERVICE_FLASH = 'flash'
|
|
|
|
# Shortcut for the logger
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
def setup(hass, config):
|
|
"""Setup example component."""
|
|
global TARGET_ID
|
|
|
|
# Validate that all required config options are given.
|
|
if not validate_config(config, {DOMAIN: [CONF_TARGET]}, _LOGGER):
|
|
return False
|
|
|
|
TARGET_ID = config[DOMAIN][CONF_TARGET]
|
|
|
|
# Validate that the target entity id exists.
|
|
if hass.states.get(TARGET_ID) is None:
|
|
_LOGGER.error("Target entity id %s does not exist",
|
|
TARGET_ID)
|
|
|
|
# Tell the bootstrapper that we failed to initialize and clear the
|
|
# stored target id so our functions don't run.
|
|
TARGET_ID = None
|
|
return False
|
|
|
|
# Tell the bootstrapper that we initialized successfully.
|
|
return True
|
|
|
|
|
|
@track_state_change(device_tracker.ENTITY_ID_ALL_DEVICES)
|
|
def track_devices(hass, entity_id, old_state, new_state):
|
|
"""Called when the group.all devices change state."""
|
|
# If the target id is not set, return
|
|
if not TARGET_ID:
|
|
return
|
|
|
|
# If anyone comes home and the entity is not on, turn it on.
|
|
if new_state.state == STATE_HOME and not core.is_on(hass, TARGET_ID):
|
|
|
|
core.turn_on(hass, TARGET_ID)
|
|
|
|
# If all people leave the house and the entity is on, turn it off.
|
|
elif new_state.state == STATE_NOT_HOME and core.is_on(hass, TARGET_ID):
|
|
|
|
core.turn_off(hass, TARGET_ID)
|
|
|
|
|
|
@track_time_change(hour=7, minute=0, second=0)
|
|
def wake_up(hass, now):
|
|
"""Turn light on in the morning.
|
|
|
|
Turn the light on at 7 AM if there are people home and it is not already
|
|
on.
|
|
"""
|
|
if not TARGET_ID:
|
|
return
|
|
|
|
if device_tracker.is_on(hass) and not core.is_on(hass, TARGET_ID):
|
|
_LOGGER.info('People home at 7AM, turning it on')
|
|
core.turn_on(hass, TARGET_ID)
|
|
|
|
|
|
@track_state_change(light.ENTITY_ID_ALL_LIGHTS, STATE_ON, STATE_OFF)
|
|
def all_lights_off(hass, entity_id, old_state, new_state):
|
|
"""If all lights turn off, turn off."""
|
|
if not TARGET_ID:
|
|
return
|
|
|
|
if core.is_on(hass, TARGET_ID):
|
|
_LOGGER.info('All lights have been turned off, turning it off')
|
|
core.turn_off(hass, TARGET_ID)
|
|
|
|
|
|
@service(DOMAIN, SERVICE_FLASH)
|
|
def flash_service(hass, call):
|
|
"""Service that will toggle the target.
|
|
|
|
Set the light to off for 10 seconds if on and vice versa.
|
|
"""
|
|
if not TARGET_ID:
|
|
return
|
|
|
|
if core.is_on(hass, TARGET_ID):
|
|
core.turn_off(hass, TARGET_ID)
|
|
|
|
time.sleep(10)
|
|
|
|
core.turn_on(hass, TARGET_ID)
|
|
|
|
else:
|
|
core.turn_on(hass, TARGET_ID)
|
|
|
|
time.sleep(10)
|
|
|
|
core.turn_off(hass, TARGET_ID)
|