Script IF template

Greetings,

I have the following script, but I can’t find a way to make it “andif” instead of “if”. Basically I want it to say the textstring for every door that is open in that order, so Framdörr Öppen, Uppfartsdörr öppen…

  doors_check:
    alias: Dörrstatus
    sequence:
      - service: tts.google_say
        data_template:
          ##entity_id: media_player.kok
          message: >
            {% if is_state('sensor.framdoor','ÖPPEN')%}
            'Framdörren är Öppen'
            {% elif is_state('sensor.uppfartdoor','ÖPPEN')%}
            'Uppfartsdörren är Öppen'
            {% elif is_state('sensor.terassdoor','ÖPPEN')%}
            'Terassdörren är Öppen'
            {% elif is_state('sensor.garagedoor','ÖPPEN')%}
            'Garagedörren är Öppen'
            {% elif is_state('sensor.garagepoort','ÖPPEN')%}
            'Garageporten är Öppen'
            {% else %}
            'Alla dörrar är Stängda'
            {% endif %}

Try this, note the use of if rather than elf and the addition of spaces at the end of the strings to say. Also the use of >- to strip newline characters.

  doors_check:
    alias: Dörrstatus
    sequence:
      - service: tts.google_say
        data_template:
          ##entity_id: media_player.kok
          message: >-
            {% if is_state('sensor.framdoor','ÖPPEN')%}
            'Framdörren är Öppen '
            {% if is_state('sensor.uppfartdoor','ÖPPEN')%}
            'Uppfartsdörren är Öppen '
            {% if is_state('sensor.terassdoor','ÖPPEN')%}
            'Terassdörren är Öppen '
            {% if is_state('sensor.garagedoor','ÖPPEN')%}
            'Garagedörren är Öppen '
            {% if is_state('sensor.garagepoort','ÖPPEN')%}
            'Garageporten är Öppen'
            {% else %}
            'Alla dörrar är Stängda'
            {% endif %}

So if your 1st, 2nd and 4th doors are open you should get this sent to tts:

Framdörren är Öppen Uppfartsdörren är Öppen Garagedörren är Öppen

I get the following error when I use “if” instead of “elif”

Invalid config for [script]: invalid template (TemplateSyntaxError: Unexpected end of template. Jinja was looking for the following tags: 'elif' or 'else' or 'endif'. The innermost block that needs to be closed is 'if'.) for dictionary value @ data['script']['doors_check']['sequence'][0]['data_template']['message']. Got "{% if is_state('sensor.framdoor','ÖPPEN')%} 'Framdörren är Öppen' {% if is_state('sensor.uppfartdoor','ÖPPEN')%} 'Uppfartsdörren är Öppen' {% if is_state('sensor.terassdoor','ÖPPEN')%} 'Terassdörren är Öppen' {% if is_state('sensor.garagedoor','ÖPPEN')%} 'Garagedörren är Öppen' {% if is_state('sensor.garagepoort','ÖPPEN')%} 'Garageporten är Öppen' {% else %} 'Alla dörrar är Stängda' {% endif %}". (See /home/homeassistant/.homeassistant/configuration.yaml, line 1488). Please check the docs at https://home-assistant.io/components/script/

Ok, try adapting the last two lines of petro’s post here:

1 Like

Wow what a nice template, I will check this later, too tired to wrap my head around it right now. Thanks for all the help! :slight_smile:

FYI that has a typo and I can’t edit that post anymore.

This is without a typo.

          {% set open_doors = states | selectattr('entity_id', 'in', state_attr('group.all_doors','entity_id')) | selectattr('state','in',['on','open']) | list | map(attribute='name') | join(', ') %}
          The following doors are open: {{ open_doors }}
1 Like

Thanks petro you’re amazing!

Are all these entities sensors? Because you can make this faster by using states.sensor instead of state after the equal sign too. If you have sensors and binary_sensors, then you have to use states.

All of them are template sensors, will definetely check that out