Created
November 3, 2021 05:12
-
-
Save amitkeret/3d5febc3fb1bcf9d0e0034e5904eef9d to your computer and use it in GitHub Desktop.
Home Assistant - Motion-controlled multiroom speakers with manual override
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Inspired by PIR_light.yaml by @vanceb | |
# @see https://gist.github.com/vanceb/b7402b9d1f66a6a2fb5c8e6de2a39b26 | |
blueprint: | |
name: Music on motion (OwnTone) | |
description: Turn on (= join the group) a OwnTone-controlled media player on motion detection | |
domain: automation | |
input: | |
owntone_source: | |
name: OwnTone server | |
description: OwnTone server entity | |
selector: | |
entity: | |
integration: forked_daapd | |
owntone_target: | |
name: OwnTone target | |
description: OwnTone-controlled media player to turn on | |
selector: | |
entity: | |
integration: forked_daapd | |
presence_entity: | |
name: Motion sensor entity | |
description: A presence sensor to trigger the automation | |
selector: | |
entity: | |
domain: binary_sensor | |
device_class: motion | |
no_presence_delay: | |
name: Delay time | |
description: Time delay to stop media after last presence is detected | |
default: 5 | |
selector: | |
number: | |
min: 0 | |
max: 300 | |
step: 5 | |
unit_of_measurement: minutes | |
mode: restart | |
max_exceeded: silent | |
variables: | |
presence_entity: !input presence_entity | |
owntone_target: !input owntone_target | |
no_presence_delay: !input no_presence_delay | |
trigger: | |
- platform: state | |
id: motion on | |
entity_id: !input presence_entity | |
to: 'on' | |
- platform: state | |
id: music start | |
entity_id: !input owntone_source | |
to: playing | |
condition: | |
# Two scenarios for which we'd need to turn on the media player | |
- condition: or | |
conditions: | |
# 1) Motion detected while music is playing | |
- condition: and | |
conditions: | |
- condition: trigger | |
id: motion on | |
- condition: state | |
entity_id: !input owntone_source | |
state: playing | |
# 2) Playback started while presence detected | |
- condition: and | |
conditions: | |
- condition: trigger | |
id: music start | |
- condition: state | |
entity_id: !input presence_entity | |
state: 'on' | |
action: | |
- service: media_player.turn_on | |
target: | |
entity_id: !input owntone_target | |
# Turn player off when presence no longer detected | |
- wait_for_trigger: | |
platform: state | |
entity_id: !input presence_entity | |
to: 'off' | |
# Wait until presence no longer detected for the user-defined time | |
- delay: | |
minutes: !input no_presence_delay | |
- service: media_player.turn_off | |
target: | |
entity_id: !input owntone_target | |
# The manual-override automation (MOA) needs to know if a media player was turned on/off manually or from here | |
# By adding this delay, will allow MOA to detect this automation's "current" attribute | |
- delay: 1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Inspired by PIR_light.yaml by @vanceb | |
# @see https://gist.github.com/vanceb/b7402b9d1f66a6a2fb5c8e6de2a39b26 | |
blueprint: | |
name: Music on motion (OwnTone) manual override | |
description: Override automated music playback when player is manually turned on/off | |
domain: automation | |
input: | |
owntone_source: | |
name: OwnTone server | |
description: OwnTone server entity | |
selector: | |
entity: | |
integration: forked_daapd | |
owntone_target: | |
name: OwnTone target | |
description: OwnTone-controlled media player to watch | |
selector: | |
entity: | |
integration: forked_daapd | |
auto_script: | |
name: Music on motion script | |
description: Select the automation affecting the media player above | |
selector: | |
entity: | |
domain: automation | |
reenable_after: | |
name: Re-enable automation delay | |
description: Time delay to re-enable automated behaviour after manual turn on/off | |
default: 120 | |
selector: | |
number: | |
min: 15 | |
max: 1440 | |
step: 5 | |
unit_of_measurement: minutes | |
mode: restart | |
max_exceeded: silent | |
variables: | |
owntone_target: !input owntone_target | |
auto_script: !input auto_script | |
reenable_after: !input reenable_after | |
trigger: | |
# Any change to the state of the media player (on/off) | |
# Made more specific to stop trigger by attribute changes | |
- platform: state | |
id: player on | |
entity_id: !input owntone_target | |
to: 'on' | |
- platform: state | |
id: player off | |
entity_id: !input owntone_target | |
to: 'off' | |
condition: | |
- condition: state | |
entity_id: !input owntone_source | |
state: playing | |
action: | |
# In case the player was turned off, a little hack: | |
# Delay the script by 1 second longer than the auto-behaviour automation, and check the "current" value: | |
# 0 means the "player_off" request came from it (and then it concluded) | |
# 1 means it is still running, probably during "delay" step, therefor "player_off" request was manual | |
- choose: | |
- conditions: | |
- condition: trigger | |
id: player off | |
sequence: | |
- delay: 2 | |
- condition: or | |
conditions: | |
- condition: and | |
conditions: | |
- condition: trigger | |
id: player on | |
- condition: template | |
value_template: "{{ is_state_attr(auto_script, 'current', 0) }}" | |
- condition: and | |
conditions: | |
- condition: trigger | |
id: player off | |
- condition: template | |
value_template: "{{ is_state_attr(auto_script, 'current', 1) }}" | |
# Disable auto-behaviour and resume when "reenable_after" expires | |
- service: automation.turn_off | |
entity_id: !input auto_script | |
- delay: | |
minutes: !input reenable_after | |
- service: automation.turn_on | |
entity_id: !input auto_script |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment