diff --git a/devices/homie/modules/home-assistant/timer.nix b/devices/homie/modules/home-assistant/timer.nix index 9265f134..32e115b8 100644 --- a/devices/homie/modules/home-assistant/timer.nix +++ b/devices/homie/modules/home-assistant/timer.nix @@ -1,73 +1,191 @@ # From https://github.com/don86nl/ha_intents/blob/main/config/packages/assist_timers.yaml -{...}: let +{lib, ...}: let + inherit (lib) concatStrings concatStringsSep; + + mkTimer = id: { + "assist_timer${toString id}" = { + icon = "mdi:assistant"; + name = "Assist - Timer ${toString id}"; + restore = true; + }; + }; + + mkLocation = id: { + "assist_timer${toString id}_location" = { + icon = "mdi:assistant"; + name = "Assist - Timer ${toString id} Location"; + max = 255; + }; + }; + + entityIdList = concatStringsSep " " [ + ''{{ states.timer '' + ''| rejectattr('state','eq','idle')'' + ''| selectattr('entity_id','match','timer.assist_timer*')'' + ''| map(attribute='entity_id')'' + ]; + settings = { - timer_media_location = "/path/to/file.mp3"; timer_target = "kitchen"; timer_target_default = "media_player.music_player_daemon"; + timer_tts = true; - timer_tts_message = "A set timer has finished."; timer_tts_service = "tts.speak"; timer_tts_target = "tts.piper"; timer_volume = 0.4; + timer_tts_message = "A set timer has finished."; + + timer_media_location = "/path/to/file.mp3"; }; in { services.home-assistant = { config = { - # TODO: format this properly + homeassistant.customize."script.assist_timerstart" = {inherit settings;}; + + # Make timers + timer = (mkTimer 1) // (mkTimer 2) // (mkTimer 3); + + # Makes location of a timer customizable from the UI + input_text = (mkLocation 1) // (mkLocation 2) // (mkLocation 3); + + # Automate some logic automation = [ { + alias = "Assist - TimerReached"; + description = "Assist automation when set timer time is reached."; + id = "assist_timerreached"; + mode = "single"; + + condition = [ + { + alias = "Finished timer is an assist timer"; + condition = "template"; + value_template = ''{{ trigger.event.data.entity_id[:18] == 'timer.assist_timer' }}''; + } + ]; + + trigger = [ + { + alias = "Any timer reached"; + id = "timer_finished"; + event_type = "timer.finished"; + platform = "event"; + } + ]; + + variables = {inherit settings;}; + action = [ { alias = "Get generic variables from script"; + variables = { - timer_media_location = "{{ settings.get('timer_media_location') }}"; - timer_target = "{%- if settings.get('timer_target')[:13] == \"\" %} {{- settings.get('timer_target_default') }} {%- elif settings.get('timer_target')[:13] == \"media_player.\" %} {{- settings.get('timer_target') }} {%- elif (settings.get('timer_target')[:7] == \"sensor.\" or settings.get('timer_target')[:11] == \"input_text.\") and (states(settings.get('timer_target'))[:13] == \"media_player.\") %} {{- states(settings.get('timer_target')) }} {%- elif (settings.get('timer_target')[:7] == \"sensor.\" or settings.get('timer_target')[:11] == \"input_text.\") and (states(settings.get('timer_target')) == \"\") %} {{- settings.get('timer_target_default') }} {%- else %} {%- set media_player_list = states.media_player | map(attribute='entity_id') | list %} {%- if \"sensor.\" in settings.get('timer_target') or \"input_text.\" in target_area %} {%- set target_area = states(settings.get('timer_target')) %} {%- else %} {%- set target_area = settings.get('timer_target') %} {%- endif %} {%- for entity_id in media_player_list %} {%- if area_name(entity_id) | lower == target_area | lower %} {{ entity_id }} {%- endif %} {%- endfor %} {%- endif %} "; - timer_tts = "{{ settings.get('timer_tts') }}"; - timer_tts_message = "{{ settings.get('timer_tts_message') }}"; - timer_tts_service = "{{ settings.get('timer_tts_service') }}"; - timer_tts_target = "{{ settings.get('timer_tts_target') }}"; - timer_volume = "{{ settings.get('timer_volume') }}"; + timer_target = concatStrings [ + ''{%- if settings.get('timer_target')[:13] == "" %}'' + ''{{- settings.get('timer_target_default') }}'' + + ''{%- elif settings.get('timer_target')[:13] == "media_player." %}'' + ''{{- settings.get('timer_target') }}'' + + ''{%- elif (${concatStringsSep " " [ + ''settings.get('timer_target')[:7] == "sensor."'' + ''or'' + ''settings.get('timer_target')[:11] == "input_text.")'' + ''and'' + ''(states(settings.get('timer_target'))[:13] == "media_player.")'' + ]}%}'' + ''{{- states(settings.get('timer_target')) }}'' + + ''{%- elif (${concatStringsSep " " [ + ''settings.get('timer_target')[:7] == "sensor."'' + ''or'' + ''settings.get('timer_target')[:11] == "input_text.")'' + ''and'' + ''(states(settings.get('timer_target')) == "")'' + ]}%}'' + ''{{- settings.get('timer_target_default') }}'' + + ''{%- else %}'' + ''{%- set media_player_list = states.media_player | map(attribute='entity_id') | list %}'' + + ''{%- if "sensor." in settings.get('timer_target') or "input_text." in target_area %}'' + ''{%- set target_area = states(settings.get('timer_target')) %}'' + + ''{%- else %}'' + ''{%- set target_area = settings.get('timer_target') %}'' + ''{%- endif %}'' + + ''{%- for entity_id in media_player_list %}'' + ''{%- if area_name(entity_id) | lower == target_area | lower %}'' + ''{{ entity_id }}'' + ''{%- endif %}'' + ''{%- endfor %}'' + ''{%- endif %} '' + ]; + + timer_tts = ''{{ settings.get('timer_tts') }}''; + timer_tts_service = ''{{ settings.get('timer_tts_service') }}''; + timer_tts_target = ''{{ settings.get('timer_tts_target') }}''; + timer_volume = ''{{ settings.get('timer_volume') }}''; + timer_tts_message = ''{{ settings.get('timer_tts_message') }}''; + + timer_media_location = ''{{ settings.get('timer_media_location') }}''; }; } + { alias = "Store current device volume"; - variables = {device_volume = "{{ state_attr(timer_target, 'volume_level') }}";}; + + variables = { + device_volume = ''{{ state_attr(timer_target, 'volume_level') }}''; + }; } + { alias = "Set volume for timer"; - data = {volume_level = "{{ timer_volume }}";}; service = "media_player.volume_set"; - target = {entity_id = "{{ timer_target }}";}; + + target.entity_id = ''{{ timer_target }}''; + + data = { + volume_level = ''{{ timer_volume }}''; + }; } + { alias = "Media file or TTS"; + choose = [ { alias = "Media file"; + conditions = [ { alias = "Timer is a media file"; condition = "template"; - value_template = "{{ timer_tts == false }}"; + value_template = ''{{ timer_tts == false }}''; } ]; + sequence = [ { alias = "Play media"; + service = "media_player.play_media"; + target.entity_id = ''{{ timer_target }}''; + enabled = true; + data = { announce = true; - media_content_id = "{{ timer_media_location }}"; + media_content_id = ''{{ timer_media_location }}''; media_content_type = "music"; }; - enabled = true; - service = "media_player.play_media"; - target = {entity_id = "{{ timer_target }}";}; } ]; } ]; + default = [ - {delay = {seconds = 1;};} + {delay.seconds = 1;} { alias = "Choose TTS service"; choose = [ @@ -76,89 +194,80 @@ in { { alias = "tts.cloud_say"; condition = "template"; - value_template = "{{ timer_tts_service != 'tts.speak' }}"; + value_template = ''{{ timer_tts_service != 'tts.speak' }}''; } ]; + sequence = [ { + service = ''{{ timer_tts_service }}''; + data = { cache = true; - entity_id = "{{ timer_target }}"; - message = "{% if timer_tts_message[:7] == \"sensor.\" or timer_tts_message[:11] == \"input_text.\" %} {{ states(timer_tts_message) }} {% else %} {{ timer_tts_message }} {% endif %}"; + entity_id = ''{{ timer_target }}''; + message = concatStrings [ + ''{% if timer_tts_message[:7] == "sensor." or timer_tts_message[:11] == "input_text." %}'' + ''{{ states(timer_tts_message) }}'' + ''{% else %}'' + ''{{ timer_tts_message }}'' + ''{% endif %}'' + ]; }; - service = "{{ timer_tts_service }}"; } ]; } ]; + default = [ { + service = "tts.speak"; + + target.entity_id = ''{{ timer_tts_target }}''; + data = { cache = true; - media_player_entity_id = "{{ timer_target }}"; - message = "{% if timer_tts_message[:7] == \"sensor.\" or timer_tts_message[:11] == \"input_text.\" %} {{ states(timer_tts_message) }} {% else %} {{ timer_tts_message }} {% endif %}"; + media_player_entity_id = ''{{ timer_target }}''; + message = concatStrings [ + ''{% if timer_tts_message[:7] == "sensor." or timer_tts_message[:11] == "input_text." %}'' + ''{{ states(timer_tts_message) }}'' + ''{% else %}'' + ''{{ timer_tts_message }}'' + ''{% endif %}'' + ]; }; - service = "tts.speak"; - target = {entity_id = "{{ timer_tts_target }}";}; } ]; } ]; } + { alias = "Restore device previous volume"; - data = {volume_level = "{{ device_volume }}";}; service = "media_player.volume_set"; - target = {entity_id = "{{ timer_target }}";}; + + target.entity_id = ''{{ timer_target }}''; + + data = { + volume_level = ''{{ device_volume }}''; + }; } ]; - alias = "Assist - TimerReached"; - condition = [ - { - alias = "Finished timer is an assist timer"; - condition = "template"; - value_template = "{{ trigger.event.data.entity_id[:18] == 'timer.assist_timer' }}"; - } - ]; - description = "Assist automation when set timer time is reached."; - id = "assist_timerreached"; - mode = "single"; - trigger = [ - { - alias = "Any timer reached"; - event_type = "timer.finished"; - id = "timer_finished"; - platform = "event"; - } - ]; - variables = { - inherit settings; - }; } + { - action = [ - { - alias = "Delay for Timer Reached automation"; - delay = {seconds = 3;}; - } - { - alias = "Reset timer location"; - data = {value = "";}; - service = "input_text.set_value"; - target = {entity_id = "{{ 'input_text.' + trigger.entity_id[6:] + '_location' }}";}; - } - ]; alias = "Assist - TimerFinished"; + id = "assist_timerfinished"; + description = "Assist automation when set timer time is finished."; + mode = "parallel"; + condition = [ { alias = "Timer was active or paused"; condition = "template"; - value_template = "{{ trigger.from_state != trigger.to_state }}"; + value_template = ''{{ trigger.from_state != trigger.to_state }}''; } ]; - description = "Assist automation when set timer time is finished."; - id = "assist_timerfinished"; - mode = "parallel"; + trigger = [ { alias = "Assist timer finished or cancelled"; @@ -167,74 +276,42 @@ in { to = "idle"; } ]; + + action = [ + { + alias = "Delay for Timer Reached automation"; + delay.seconds = 3; + } + + { + alias = "Reset timer location"; + service = "input_text.set_value"; + + target.entity_id = ''{{ 'input_text.' + trigger.entity_id[6:] + '_location' }}''; + + data = { + value = ""; + }; + } + ]; } ]; - homeassistant = { - customize = { - "script.assist_timerstart" = { - inherit settings; - }; - }; - }; - input_text = { - assist_timer1_location = { - icon = "mdi:assistant"; - max = 255; - name = "Assist - Timer 1 Location"; - }; - assist_timer2_location = { - icon = "mdi:assistant"; - max = 255; - name = "Assist - Timer 2 Location"; - }; - assist_timer3_location = { - icon = "mdi:assistant"; - max = 255; - name = "Assist - Timer 3 Location"; - }; - }; - intent_script = { - TimerDuration = { - action = [{stop = "";}]; - async_action = true; - }; - TimerPause = { - action = [ - { - data = { - entity_id = "{{ entity_id }}"; - timer_action = "{{ timer_action }}"; - }; - service = "script.assist_TimerPause"; - } - ]; - async_action = true; - }; - TimerStart = { - action = [ - { - data = {duration = "{{hours | int(default=0)}}:{{ minutes | int(default=0) }}:{{ seconds | int(default=0) }}";}; - service = "script.assist_TimerStart"; - } - ]; - async_action = false; - }; - TimerStop = { - action = [ - { - data = {entity_id = "{{ entity_id }}";}; - service = "script.assist_TimerStop"; - } - ]; - async_action = true; - }; - }; - script = { + + # Scripts to start, pause and stop timers + script = let + entity_id = ''{% if entity_id is set or entity_id != "" %} {{ entity_id }} {% else %} null {% endif %}''; + in { assist_timerpause = { alias = "Assist - TimerPause"; description = "Script for pausing a timer using HA Assist."; icon = "mdi:assistant"; mode = "single"; + + variables = { + inherit entity_id; + timer_action = ''{% if timer_action is set or timer_action != "" %} {{ timer_action }} {% else %} resume {% endif %}''; + }; + sequence = [ { choose = [ @@ -243,52 +320,64 @@ in { { alias = "Single Timer"; condition = "template"; - value_template = "{{ entity_id[:18] == 'timer.assist_timer' }}"; + value_template = ''{{ entity_id[:18] == 'timer.assist_timer' }}''; } ]; + sequence = [ { alias = "Single timer: Idle or active"; + choose = [ { conditions = [ { alias = "Timer not active"; condition = "template"; - value_template = "{{ states(entity_id) == 'idle' }}"; + value_template = ''{{ states(entity_id) == 'idle' }}''; } ]; - sequence = [{stop = "Timer is not active";}]; + + sequence = [ + {stop = "Timer is not active";} + ]; } ]; + default = [ { alias = "Pause or resume"; + choose = [ { alias = "Pause"; + conditions = [ { alias = "Action = pause"; condition = "template"; - value_template = "{{ timer_action == 'pause' }}"; + value_template = ''{{ timer_action == 'pause' }}''; } ]; + sequence = [ { alias = "Pause timer"; service = "timer.pause"; - target = {entity_id = "{{ entity_id }}";}; + + target.entity_id = ''{{ entity_id }}''; } {stop = "Pause timer";} ]; } ]; + default = [ { alias = "Resume timer"; service = "timer.start"; - target = {entity_id = "{{ entity_id }}";}; + + target.entity_id = ''{{ entity_id }}''; } {stop = "Resume timer";} ]; @@ -297,68 +386,84 @@ in { } ]; } + { alias = "No specific timer"; + conditions = [ { alias = "No specific Timer"; condition = "template"; - value_template = "{{ entity_id == 'null' }}"; + value_template = ''{{ entity_id == 'null' }}''; } + { alias = "Timer(s) are active"; condition = "template"; - value_template = "{{ states.timer \n | rejectattr('state','eq','idle') \n | selectattr('entity_id','match','timer.assist_timer*')\n | map(attribute='entity_id') \n | list\n | length > 0 }}"; + value_template = ''${entityIdList} | list | length > 0 }}''; } ]; + sequence = [ { alias = "No specific timer: # active?"; + choose = [ { conditions = [ { alias = "No specific timer asked"; condition = "template"; - value_template = "{{ entity_id == 'null' }}"; + value_template = ''{{ entity_id == 'null' }}''; } + { alias = "Multiple timers active"; condition = "template"; - value_template = "{{ states.timer \n | rejectattr('state','eq','idle') \n | selectattr('entity_id','match','timer.assist_timer*')\n | map(attribute='entity_id') \n | list\n | length > 1 }}"; + value_template = ''${entityIdList} | list | length > 1 }}''; } ]; - sequence = [{stop = "Multiple timers active, none specified";}]; + + sequence = [ + {stop = "Multiple timers active, none specified";} + ]; } ]; + default = [ { alias = "Pause or resume"; + choose = [ { alias = "Pause"; + conditions = [ { alias = "Action = pause"; condition = "template"; - value_template = "{{ timer_action == 'pause' }}"; + value_template = ''{{ timer_action == 'pause' }}''; } ]; + sequence = [ { alias = "Pause timer"; service = "timer.pause"; - target = {entity_id = "{{ states.timer \n | rejectattr('state','eq','idle') \n | selectattr('entity_id','match','timer.assist_timer*')\n | map(attribute='entity_id') \n | join(', ') }}";}; + + target.entity_id = ''${entityIdList} | join(', ') }}''; } {stop = "Pause timer";} ]; } ]; + default = [ { alias = "Resume timer"; service = "timer.start"; - target = {entity_id = "{{ states.timer \n | rejectattr('state','eq','idle') \n | selectattr('entity_id','match','timer.assist_timer*')\n | map(attribute='entity_id') \n | join(', ') }}";}; + + target.entity_id = ''${entityIdList} | join(', ') }}''; } {stop = "Resume timer";} ]; @@ -367,59 +472,73 @@ in { } ]; } + { alias = "All timers"; + conditions = [ { alias = "All timers"; condition = "template"; - value_template = "{{ entity_id == 'all' }}"; + value_template = ''{{ entity_id == 'all' }}''; } ]; + sequence = [ { alias = "Timers active?"; + choose = [ { alias = "No timers active"; + conditions = [ { alias = "No timers active"; condition = "template"; - value_template = "{{ states.timer \n | rejectattr('state','eq','idle') \n | selectattr('entity_id','match','timer.assist_timer*')\n | map(attribute='entity_id') \n | list\n | length == 0 }}"; + value_template = ''${entityIdList} | list | length == 0 }}''; } ]; - sequence = [{stop = "No timers active";}]; + + sequence = [ + {stop = "No timers active";} + ]; } ]; + default = [ { alias = "Pause or resume"; + choose = [ { alias = "Pause"; + conditions = [ { alias = "Action = pause"; condition = "template"; - value_template = "{{ timer_action == 'pause' }}"; + value_template = ''{{ timer_action == 'pause' }}''; } ]; + sequence = [ { alias = "Pause timer"; service = "timer.pause"; - target = {entity_id = "{{ states.timer \n | rejectattr('state','eq','idle') \n | selectattr('entity_id','match','timer.assist_timer*')\n | map(attribute='entity_id') \n | join(', ') }}";}; + target.entity_id = ''${entityIdList} | join(', ') }}''; } {stop = "Pause timer";} ]; } ]; + default = [ { alias = "Resume timer"; service = "timer.start"; - target = {entity_id = "{{ states.timer \n | rejectattr('state','eq','idle') \n | selectattr('entity_id','match','timer.assist_timer*')\n | map(attribute='entity_id') \n | join(', ') }}";}; + + target.entity_id = ''${entityIdList} | join(', ') }}''; } {stop = "Resume timer";} ]; @@ -431,194 +550,310 @@ in { ]; } ]; - variables = { - entity_id = "{% if entity_id is set or entity_id != \"\" %} {{ entity_id }} {% else %} null {% endif %}"; - timer_action = "{% if timer_action is set or timer_action != \"\" %} {{ timer_action }} {% else %} resume {% endif %}"; - }; }; + assist_timerstart = { alias = "Assist - TimerStart"; description = "Script for starting a timer using HA Assist."; icon = "mdi:assistant"; mode = "single"; + + variables = {inherit settings;}; + sequence = [ { alias = "Set variables"; - variables = {timer_location = "{%- if settings.get('timer_target')[:13] == \"media_player.\" %} {{ area_name(settings.get('timer_target')) | lower }} {% elif (settings.get('timer_target')[:7] == \"sensor.\" or settings.get('timer_target')[:11] == \"input_text.\") and states(settings.get('timer_target'))[:13] == \"media_player.\" %} {{- states(settings.get('timer_target')) }} {%- elif settings.get('timer_target')[:13] != \"media_player.\" and settings.get('timer_target')[:7] != \"sensor.\" and settings.get('timer_target')[:11] != \"input_text.\" %} {{- settings.get('timer_target') }} {%- elif (settings.get('timer_target')[:7] == \"sensor.\" or settings.get('timer_target')[:11] == \"input_text.\") and (states(settings.get('timer_target')) != \"\") and (states(settings.get('timer_target'))[:13] == \"media_player.\") %} {{ area_name(settings.get('timer_target_default')) }} {%- elif (settings.get('timer_target')[:7] == \"sensor.\" or settings.get('timer_target')[:11] == \"input_text.\") %} {% if states(settings.get('timer_target')) != \"\" and states(settings.get('timer_target')) != \"not_home\" and states(settings.get('timer_target')) != 0 %} {{ states(settings.get('timer_target')) }} {% else %} {{- area_name(settings.get('timer_target_default')) | lower }} {%- endif %} {%- else %} {{- area_name(settings.get('timer_target')) | lower }} {%- endif %}";}; + + variables = { + timer_location = concatStrings [ + ''{%- if settings.get('timer_target')[:13] == "media_player." %}'' + ''{{ area_name(settings.get('timer_target')) | lower }}'' + + ''{% elif (settings.get('timer_target')[:7] == "sensor." or settings.get('timer_target')[:11] == "input_text.") and states(settings.get('timer_target'))[:13] == "media_player." %}'' + ''{{- states(settings.get('timer_target')) }}'' + + ''{%- elif settings.get('timer_target')[:13] != "media_player." and settings.get('timer_target')[:7] != "sensor." and settings.get('timer_target')[:11] != "input_text." %}'' + ''{{- settings.get('timer_target') }}'' + + ''{%- elif (settings.get('timer_target')[:7] == "sensor." or settings.get('timer_target')[:11] == "input_text.") and (states(settings.get('timer_target')) != "") and (states(settings.get('timer_target'))[:13] == "media_player.") %}'' + ''{{ area_name(settings.get('timer_target_default')) }} '' + + ''{%- elif (settings.get('timer_target')[:7] == "sensor." or settings.get('timer_target')[:11] == "input_text.") %}'' + ''{% if states(settings.get('timer_target')) != "" and states(settings.get('timer_target')) != "not_home" and states(settings.get('timer_target')) != 0 %}'' + ''{{ states(settings.get('timer_target')) }}'' + + ''{% else %}'' + ''{{- area_name(settings.get('timer_target_default')) | lower }}'' + ''{%- endif %}'' + + ''{%- else %}'' + ''{{- area_name(settings.get('timer_target')) | lower }}'' + ''{%- endif %}'' + ]; + }; } + { alias = "Set timer location"; - data = {value = "{{ timer_location }}";}; service = "input_text.set_value"; - target = {entity_id = "{% if states('timer.assist_timer1') != 'active' and states('timer.assist_timer1') != 'paused' %} input_text.assist_timer1_location {% elif states('timer.assist_timer2') != 'active' and states('timer.assist_timer2') != 'paused' %} input_text.assist_timer2_location {% else %} input_text.assist_timer3_location {% endif%}";}; + + target.entity_id = concatStrings [ + ''{% if states('timer.assist_timer1') != 'active' and states('timer.assist_timer1') != 'paused' %}'' + ''input_text.assist_timer1_location'' + + ''{% elif states('timer.assist_timer2') != 'active' and states('timer.assist_timer2') != 'paused' %}'' + ''input_text.assist_timer2_location'' + + ''{% else %}'' + ''input_text.assist_timer3_location'' + ''{% endif%}'' + ]; + + data = { + value = ''{{ timer_location }}''; + }; } + { alias = "Start timer"; - data_template = {duration = "{{ duration }}";}; service = "timer.start"; - target = {entity_id = "{% if states('timer.assist_timer1') != 'active' and states('timer.assist_timer1') != 'paused' %} timer.assist_timer1 {% elif states('timer.assist_timer2') != 'active' and states('timer.assist_timer2') != 'paused' %} timer.assist_timer2 {% else %} timer.assist_timer3{% endif%}";}; + + target.entity_id = concatStrings [ + ''{% if states('timer.assist_timer1') != 'active' and states('timer.assist_timer1') != 'paused' %}'' + ''timer.assist_timer1'' + + ''{% elif states('timer.assist_timer2') != 'active' and states('timer.assist_timer2') != 'paused' %}'' + ''timer.assist_timer2'' + + ''{% else %}'' + ''timer.assist_timer3'' + ''{% endif%}'' + ]; + + data_template = { + duration = ''{{ duration }}''; + }; } ]; - variables = { - inherit settings; - }; }; + assist_timerstop = { alias = "Assist - TimerStop"; description = "Script for stopping a timer using HA Assist."; icon = "mdi:assistant"; mode = "single"; + + variables = {inherit entity_id;}; + sequence = [ { alias = "Set variables"; - variables = {entity_id = "{% if entity_id is set or entity_id != \"\" %} {{ entity_id }} {% else %} null {% endif %}";}; + variables = {inherit entity_id;}; } + { choose = [ { alias = "Stop Timer music"; + conditions = [ { alias = "Timer is a media file"; condition = "template"; - value_template = "{{ timer_tts == false }}"; + value_template = ''{{ timer_tts == false }}''; } + { condition = "template"; - value_template = "{% set mediaplayer = namespace(entity=[]) %}\n{% for player in states.media_player %}\n {%- if ((state_attr(player.entity_id, 'media_content_id') |lower != 'none' and state_attr(player.entity_id, 'media_content_id')[:47][38:] == 'timer.mp3') or state_attr(player.entity_id, 'media_title') | lower == 'timer') and states(player.entity_id) == 'playing' -%}\n {%- set mediaplayer.entity = player.entity_id -%}\n {% endif -%}\n{% endfor %}\n{{ mediaplayer.entity[:12] == 'media_player' }}"; + value_template = '' + {% set mediaplayer = namespace(entity=[]) %} + {% for player in states.media_player %} + {%- if ((state_attr(player.entity_id, 'media_content_id') |lower != 'none' and state_attr(player.entity_id, 'media_content_id')[:47][38:] == 'timer.mp3') or state_attr(player.entity_id, 'media_title') | lower == 'timer') and states(player.entity_id) == 'playing' -%} + {%- set mediaplayer.entity = player.entity_id -%} + {% endif -%} + {% endfor %} + {{ mediaplayer.entity[:12] == 'media_player' }} + ''; } ]; + sequence = [ { alias = "Stop timer music"; service = "media_player.media_stop"; - target = {entity_id = "{% set mediaplayer = namespace(entity=[]) %} {% for player in states.media_player %}\n {% if ((state_attr(player.entity_id, 'media_content_id') |lower != 'none' and state_attr(player.entity_id, 'media_content_id')[:47][38:] == 'timer.mp3') or state_attr(player.entity_id, 'media_title') | lower == 'timer') and states(player.entity_id) == 'playing' %}\n {% set mediaplayer.entity = player.entity_id %}\n {% endif %}\n{% endfor %} {{ mediaplayer.entity }}";}; + + target.entity_id = '' + {% set mediaplayer = namespace(entity=[]) %} + {% for player in states.media_player %} + {% if ((state_attr(player.entity_id, 'media_content_id') |lower != 'none' and state_attr(player.entity_id, 'media_content_id')[:47][38:] == 'timer.mp3') or state_attr(player.entity_id, 'media_title') | lower == 'timer') and states(player.entity_id) == 'playing' %} + {% set mediaplayer.entity = player.entity_id %} + {% endif %} + {% endfor %} {{ mediaplayer.entity }}''; } ]; } + { conditions = [ { alias = "Single Timer"; condition = "template"; - value_template = "{{ entity_id[:18] == 'timer.assist_timer' }}"; + value_template = ''{{ entity_id[:18] == 'timer.assist_timer' }}''; } ]; + sequence = [ { alias = "Single timer: Idle or active"; + choose = [ { conditions = [ { alias = "Timer not active"; condition = "template"; - value_template = "{{ states(entity_id) == 'idle' }}"; + value_template = ''{{ states(entity_id) == 'idle' }}''; } ]; - sequence = [{stop = "Timer is not active";}]; + + sequence = [ + {stop = "Timer is not active";} + ]; } ]; + default = [ { alias = "Cancel single timer"; service = "timer.cancel"; - target = {entity_id = "{{ entity_id }}";}; + + target.entity_id = ''{{ entity_id }}''; } + { alias = "Reset timer location value"; - data = {value = "0";}; service = "input_text.set_value"; - target = {entity_id = "{{ states.timer \n | selectattr('state','eq','active') \n | selectattr('entity_id','match','timer.assist_timer*')\n | map(attribute='entity_id') \n | join('_location, ') | replace('timer.', 'input_text.') }}";}; + + target.entity_id = ''${entityIdList} | join('_location, ') | replace('timer.', 'input_text.') }}''; + + data = { + value = "0"; + }; } {stop = "Timer cancelled";} ]; } ]; } + { alias = "No specific timer"; + conditions = [ { alias = "No specific Timer"; condition = "template"; - value_template = "{{ entity_id == 'null' }}"; + value_template = ''{{ entity_id == 'null' }}''; } + { alias = "Timer(s) are active"; condition = "template"; - value_template = "{{ states.timer \n | rejectattr('state','eq','idle') \n | selectattr('entity_id','match','timer.assist_timer*')\n | map(attribute='entity_id') \n | list\n | length > 0 }}"; + value_template = ''${entityIdList} | list | length > 0 }}''; } ]; + sequence = [ { alias = "No specific timer: # active?"; + choose = [ { conditions = [ { alias = "No specific timer asked"; condition = "template"; - value_template = "{{ entity_id == 'null' }}"; + value_template = ''{{ entity_id == 'null' }}''; } + { alias = "Multiple timers active"; condition = "template"; - value_template = "{{ states.timer \n | rejectattr('state','eq','idle') \n | selectattr('entity_id','match','timer.assist_timer*')\n | map(attribute='entity_id') \n | list\n | length > 1 }}"; + value_template = ''${entityIdList} | list | length > 1 }}''; } ]; - sequence = [{stop = "Multiple timers active, none specified";}]; + + sequence = [ + {stop = "Multiple timers active, none specified";} + ]; } ]; + default = [ { alias = "Cancel single timer"; service = "timer.cancel"; - target = {entity_id = "{{ states.timer \n | rejectattr('state','eq','idle') \n | selectattr('entity_id','match','timer.assist_timer*')\n | map(attribute='entity_id') \n | join(', ') }}";}; + + target.entity_id = ''${entityIdList} | join(', ') }}''; } + { alias = "Reset timer location value"; - data = {value = "0";}; - metadata = {}; service = "input_text.set_value"; - target = {entity_id = "{{ states.timer \n | rejectattr('state','eq','idle') \n | selectattr('entity_id','match','timer.assist_timer*')\n | map(attribute='entity_id') \n | join('_location, ') | replace('timer.', 'input_text.') }}";}; + metadata = {}; + + target.entity_id = ''${entityIdList} | join('_location, ') | replace('timer.', 'input_text.') }}''; + + data = {value = "0";}; } + {stop = "Timer cancelled";} ]; } ]; } + { alias = "All timers"; + conditions = [ { alias = "All timers"; condition = "template"; - value_template = "{{ entity_id == 'all' }}"; + value_template = ''{{ entity_id == 'all' }}''; } ]; + sequence = [ { alias = "Timers active?"; + choose = [ { alias = "No timers active"; + conditions = [ { alias = "No timers active"; condition = "template"; - value_template = "{{ states.timer \n | rejectattr('state','eq','idle') \n | selectattr('entity_id','match','timer.assist_timer*')\n | map(attribute='entity_id') \n | list\n | length == 0 }}"; + value_template = ''${entityIdList} | list | length == 0 }}''; } ]; - sequence = [{stop = "No timers active";}]; + + sequence = [ + {stop = "No timers active";} + ]; } ]; + default = [ { alias = "Cancel all timers"; service = "timer.cancel"; - target = {entity_id = "{{ states.timer \n | rejectattr('state','eq','idle') \n | selectattr('entity_id','match','timer.assist_timer*')\n | map(attribute='entity_id') \n | join(', ') }}";}; + + target.entity_id = ''${entityIdList} | join(', ') }}''; } + {stop = "Cancel all timers";} ]; } @@ -627,24 +862,6 @@ in { ]; } ]; - variables = {entity_id = "{% if entity_id is set or entity_id != \"\" %} {{ entity_id }} {% else %} null {% endif %}";}; - }; - }; - timer = { - assist_timer1 = { - icon = "mdi:assistant"; - name = "Assist - Timer 1"; - restore = true; - }; - assist_timer2 = { - icon = "mdi:assistant"; - name = "Assist - Timer 2"; - restore = true; - }; - assist_timer3 = { - icon = "mdi:assistant"; - name = "Assist - Timer 3"; - restore = true; }; }; };