Cloud say message with nested if statements

I’m havind difficulty debugging my message:

service: tts.cloud_say
data:
  entity_id: media_player.woonkamer
  message:
    Op dit moment is het {{ states('sensor.knmi_thuis_omschrijving') }} met een temperatuur van {{ state_attr('weather.knmi_thuis', 'temperature') | float | round(1, "half") | replace('.0','') }} graden en een gevoelstemperatuur van {{ states('sensor.knmi_thuis_gevoelstemperatuur') | float | round (1, "half") | replace('.0','') }} graden. 
    De voorspelling voor vandaag is {{ states('sensor.knmi_thuis_korte_dagverwachting') }}. 
    {% if states('sensor.current_uv_index') | float <= 2 %}
      Er is vandaag vrijwel geen zonkracht.
    {% elif states('sensor.current_uv_index') | float >= 2 and states('sensor.current_uv_index') | float <= 4 %}	
      De zonkracht is vandaag zwak.
    {% elif states('sensor.current_uv_index') | float >= 4 and states('sensor.current_uv_index') | float <= 6 %}	
      De zonkracht is vandaag matig
    {% elif states('sensor.current_uv_index') | float >= 6 and states('sensor.current_uv_index') | float <= 8 %}	
      De zonkracht is vandaag sterk.
    {% elif states('sensor.current_uv_index') | float >= 8 %}	
      De zonkracht is vandaag bijzonder sterk.	  
    {% endif %}  
    Het advies is om niet langer dan {{ states('sensor.skin_type_2_safe_exposure_time') }} in de zon te zijn.

When I copy/paste it into the Template-tab of the Developer Tools is outputs:

service: tts.cloud_say
data:
  entity_id: media_player.woonkamer
  message:
    Op dit moment is het Geheel bewolkt met een temperatuur van 12.5 graden en een gevoelstemperatuur van 10.5 graden. 
    De voorspelling voor vandaag is Vrij veel bewolking, lokaal zon en op de meeste plaatsen droog. 
    	
      De zonkracht is vandaag matig
      
    Het advies is om niet langer dan 40 in de zon te zijn.

And when I run it in the Services-tab it’ll play the message upon “Op dit moment is het Geheel bewolkt met een temperatuur van 12.5 graden en een gevoelstemperatuur van 10.5 graden. De voorspelling voor vandaag is Vrij veel bewolking, lokaal zon en op de meeste plaatsen droog.” it doesn’t play the rest. I’ve tried putting the message inside a data_template, added >- after message: but that didn’t work. Can anyone explain where I’ve missed the exit?

Because there’s a line-break between the text that plays and the text that doesn’t play. The message option expects to receive a string without line-breaks. The first line-break it encounters is effectively the end of the string it will convert to speech.

Try this version:

service: tts.cloud_say
data:
  entity_id: media_player.woonkamer
  message: >
    {% set x = '' %}
    {% if states('sensor.current_uv_index') | float <= 2 %}
      {% set x = 'Er is vandaag vrijwel geen zonkracht.' %}
    {% elif states('sensor.current_uv_index') | float >= 2 and states('sensor.current_uv_index') | float <= 4 %}	
      {% set x = 'De zonkracht is vandaag zwak.' %}
    {% elif states('sensor.current_uv_index') | float >= 4 and states('sensor.current_uv_index') | float <= 6 %}	
      {% set x = 'De zonkracht is vandaag matig' %}
    {% elif states('sensor.current_uv_index') | float >= 6 and states('sensor.current_uv_index') | float <= 8 %}	
      {% set x = 'De zonkracht is vandaag sterk.' %}
    {% elif states('sensor.current_uv_index') | float >= 8 %}	
      {% set x = 'De zonkracht is vandaag bijzonder sterk.' %}
    {% endif %}
    Op dit moment is het {{ states('sensor.knmi_thuis_omschrijving') }} met een temperatuur van {{ state_attr('weather.knmi_thuis', 'temperature') | float | round(1, "half") | replace('.0','') }} graden en een gevoelstemperatuur van {{ states('sensor.knmi_thuis_gevoelstemperatuur') | float | round (1, "half") | replace('.0','') }} graden.  De voorspelling voor vandaag is {{ states('sensor.knmi_thuis_korte_dagverwachting') }}. {{ x }} Het advies is om niet langer dan {{ states('sensor.skin_type_2_safe_exposure_time') 

EDIT

Correction. Added missing line continuation character.

1 Like

Thanks a lot @123, it didn’t work out of the box because >- was missing after message:

For the ones doing similar stuff and also having issues, this is working:

service: tts.cloud_say
data:
  entity_id: media_player.woonkamer
  message: >-
    {% set x = '' %}
    {% if states('sensor.current_uv_index') | float <= 2 %}
      {% set x = 'Er is vandaag vrijwel geen zonkracht.' %}
    {% elif states('sensor.current_uv_index') | float >= 2 and states('sensor.current_uv_index') | float <= 4 %}	
      {% set x = 'De zonkracht is vandaag zwak.' %}
    {% elif states('sensor.current_uv_index') | float >= 4 and states('sensor.current_uv_index') | float <= 6 %}	
      {% set x = 'De zonkracht is vandaag matig' %}
    {% elif states('sensor.current_uv_index') | float >= 6 and states('sensor.current_uv_index') | float <= 8 %}	
      {% set x = 'De zonkracht is vandaag sterk.' %}
    {% elif states('sensor.current_uv_index') | float >= 8 %}	
      {% set x = 'De zonkracht is vandaag bijzonder sterk.' %}
    {% endif %}
    Op dit moment is het {{ states('sensor.knmi_thuis_omschrijving') }} met een temperatuur van {{ state_attr('weather.knmi_thuis', 'temperature') | float | round(1, "half") | replace('.0','') }} graden en een gevoelstemperatuur van {{ states('sensor.knmi_thuis_gevoelstemperatuur') | float | round (1, "half") | replace('.0','') }} graden. De voorspelling voor vandaag is {{ states('sensor.knmi_thuis_korte_dagverwachting') }}. {{ x }}. Het advies is om niet langer dan {{ states('sensor.skin_type_2_safe_exposure_time') }} minuten in de zon te zijn.
1 Like

Thanks for spotting it; I have corrected the original example.

The following version is more compact:

service: tts.cloud_say
data:
  entity_id: media_player.woonkamer
  message: >
    {% set x = '' %}
    {% set uv = states('sensor.current_uv_index') | float(0) %}
    {% if uv <= 2 %}
      {% set x = 'Er is vandaag vrijwel geen zonkracht.' %}
    {% elif 2 <= uv <= 4 %}	
      {% set x = 'De zonkracht is vandaag zwak.' %}
    {% elif 4 <= uv <= 6 %}	
      {% set x = 'De zonkracht is vandaag matig' %}
    {% elif 6 <= uv <= 8 %}	
      {% set x = 'De zonkracht is vandaag sterk.' %}
    {% elif uv >= 8 %}	
      {% set x = 'De zonkracht is vandaag bijzonder sterk.' %}
    {% endif %}
    Op dit moment is het {{ states('sensor.knmi_thuis_omschrijving') }} met een temperatuur van {{ state_attr('weather.knmi_thuis', 'temperature') | float | round(1, "half") | replace('.0','') }} graden en een gevoelstemperatuur van {{ states('sensor.knmi_thuis_gevoelstemperatuur') | float(0) | round (1, "half") | replace('.0','') }} graden.  De voorspelling voor vandaag is {{ states('sensor.knmi_thuis_korte_dagverwachting') }}. {{ x }} Het advies is om niet langer dan {{ states('sensor.skin_type_2_safe_exposure_time')