occupancy_manager uses a variety of input sensors (motion sensors, door sensors, device power sensors, etc) as well as event triggers (a light turning on, a door opening, etc) to determine if a room is occupied.
This combines many complicated automations into one simple configuration.
This works as an "app" in pyscript. Therefore, pyscript is required and configuration is done through Home Assistant's configuration.yaml file.
You can see a full configuration example in this repository.
These are the configuration keys:
| key | description |
|---|---|
| state_entity (required) | the input_boolean that will be turned on when occupied |
| occupied_conditions (optional) | a list of pyscript expressions that must ALL be true to allow the room to be occupied |
| armed_conditions (optional) | a list of pyscript expressions that must ALL be true to allow the room to move to occupied state |
| occupied_states (optional) | a list of pyscript expressions that AT LEAST ONE must be true to move to occupied state or hold in occupied state |
| held_states (optional) | a list of pyscript expressions that AT LEAST ONE must be true to keep the room occupied even if occupied_states is False |
| state_triggers (optional) | a list of pyscript expressions to trigger a momentary "on" state as long as conditions and armed is met |
| event_triggers (optional) | a list of dicts to trigger a momentary "on" state as long as conditions and armed is met. The dict should contain an event key, and, optionally, an expression key. |
| timeout (optional / required if using triggers) | number of seconds to delay the state from moving to off once occupied_states and held_states are no longer True |
If occupied_conditions are not met, the state_entity will be off. timeout is not honored so the off state will be immediate. An empty list disables occupied_conditions checking.
If armed_conditions are not met, the state_entity cannot change to on. An empty list disabled armed_conditions checking.
If occupied_states are met (along with occupied_conditions and armed_conditions if set) the state_entity will change to on. When they are no longer met, the state_entity will change to off (if held_states is not met) honoring the timeout.
If held_states are met and the state_entity is already on, it will remain on. If they are not met and occupied_states is also not met, the state_entity will change to off honoring the timeout.
state_triggers are similar to occupied_states however, state_entity is only set to on momentarily. Then it is off again, honoring timeout. Without a timeout this makes no sense and therefore is invalid and will generate an ERROR.
event_triggers are similar to state_triggers however, the work with Home Assistant events instead of entity states.
# get to your homeassistant config directory
cd /config
cd pyscript
mkdir -p apps/
cd apps
git clone https://github.com/dlashua/pyscript-occupancy_manager occupancy_manager
pyscript:
apps:
occupancy_manager:
- state_entity: input_boolean.living_occupied
occupied_conditions:
- binary_sensor.home != 'off'
armed_conditions:
- binary_sensor.living_motion_counter == "on"
- binary_sensor.living_motion_tv == "on"
- binary_sensor.living_motion_over == "on"
occupied_states:
- binary_sensor.living_motion_counter == "on"
- binary_sensor.living_motion_tv == "on"
- binary_sensor.living_motion_over == "on"
- media_player.living_tv == "playing"
state_triggers:
- light.living_overhead == 'on' and light.living_overhead.old == 'off'
- light.living_tv_strip == 'on' and light.living_tv_strip.old == 'off'
timeout: 600