Newbie alert - How to parse a list returned by a sensor

I have 14 thermostats in my house and I am trying to write automation to manage them collectively, such as setting different temperature adjustments for day, night, twilight, away. And each thermostat can have its own baseline. What I need to create is a list from which I can extract the updated temperatures when any of the input variables change. I could write all the code for each thermostat, but I hoped to create a sensor to calculate all the new temperatures as a list and then loop through the list in an automation that detects that the sensor has changed.

My code for the sensor is below. I’ve copied it into the Template area under Developer Tools.

    thermostat_targets:
      unique_id: "thermostat_targets"
      friendly_name: "Thermostat Targets"
      value_template: >-
        {% set targets = [] %}
        {% set curr_state = states('sensor.thermostat_mode') %}
        {% set away = states('input_number.away_offset') | float(1) %}
        {% set day = states('input_number.day_offset') | float(1) %}
        {% set night = states('input_number.night_offset') | float(1) %}
        {% set twilight = states('input_number.twilight_offset') | float(1) %}
        {% if curr_state == 'away' %}
          {% set offset = away %}
        {% elif curr_state == 'sleep' %}
          {% set offset = night %}
        {% elif curr_state == 'home' %}
          {% set offset = day %}
        {% else %}
          {% set offset = twilight %}
        {% endif %}
        {% set targets = targets + [(states('input_number.basement_baseline') | float(1) + offset) ] %}
        {% set targets = targets + [(states('input_number.dining_room_baseline') | float(1) + offset) ] %}
        {% set targets = targets + [(states('input_number.downstairs_hall_baseline') | float(1) + offset) ] %}
        {% set targets = targets + [(states('input_number.entrance_hall_baseline') | float(1) + offset) ] %}
        {% set targets = targets + [(states('input_number.guest_bedroom_baseline') | float(1) + offset) ] %}
        {% set targets = targets + [(states('input_number.kitchen_baseline') | float(1) + offset) ] %}
        {% set targets = targets + [(states('input_number.living_room_baseline') | float(1) + offset) ] %}
        {% set targets = targets + [(states('input_number.master_bedroom_baseline') | float(1) + offset) ] %}
        {% set targets = targets + [(states('input_number.office_baseline') | float(1) + offset) ] %}
        {% set targets = targets + [(states('input_number.social_bedroom_baseline') | float(1) + offset) ] %}
        {% set targets = targets + [(states('input_number.upstairs_hall_baseline') | float(1) + offset) ] %}
        {% set targets = targets + [(states('input_number.guest_bathroom_baseline') | float(1) + offset) ] %}
        {% set targets = targets + [(states('input_number.social_bathroom_baseline') | float(1) + offset) ] %}
        {% set targets = targets + [(states('input_number.sunroom_baseline') | float(1) + offset) ] %}
        {{ targets }}

But when I try to extract the values from sensor.thermostat_targets they do not come out as a list, but rather as a string. But the sensor code creates the expected list when copied in the Template section under Developer Tools.

        {% set targets = [] %}
        {% set curr_state = states('sensor.thermostat_mode') %}
        {% set away = states('input_number.away_offset') | float(1) %}
        {% set day = states('input_number.day_offset') | float(1) %}
        {% set night = states('input_number.night_offset') | float(1) %}
        {% set twilight = states('input_number.twilight_offset') | float(1) %}
        {% if curr_state == 'away' %}
          {% set offset = away %}
        {% elif curr_state == 'sleep' %}
          {% set offset = night %}
        {% elif curr_state == 'home' %}
          {% set offset = day %}
        {% else %}
          {% set offset = twilight %}
        {% endif %}

        {% set targets = targets + [(states('input_number.basement_baseline') | float(0) + offset) ] %}
        {% set targets = targets + [(states('input_number.dining_room_baseline') | float(0) + offset) ] %}
        {% set targets = targets + [(states('input_number.downstairs_hall_baseline') | float(0) + offset) ] %}
        {% set targets = targets + [(states('input_number.entrance_hall_baseline') | float(0) + offset) ] %}
        {% set targets = targets + [(states('input_number.guest_bedroom_baseline') | float(0) + offset) ] %}
        {% set targets = targets + [(states('input_number.kitchen_baseline') | float(0) + offset) ] %}
        {% set targets = targets + [(states('input_number.living_room_baseline') | float(0) + offset) ] %}
        {% set targets = targets + [(states('input_number.master_bedroom_baseline') | float(0) + offset) ] %}
        {% set targets = targets + [(states('input_number.office_baseline') | float(0) + offset) ] %}
        {% set targets = targets + [(states('input_number.social_bedroom_baseline') | float(0) + offset) ] %}
        {% set targets = targets + [(states('input_number.upstairs_hall_baseline') | float(0) + offset) ] %}
        {% set targets = targets + [(states('input_number.guest_bathroom_baseline') | float(0) + offset) ] %}
        {% set targets = targets + [(states('input_number.social_bathroom_baseline') | float(0) + offset) ] %}
        {% set targets = targets + [(states('input_number.sunroom_baseline') | float(0) + offset) ] %}
        {{ targets }}
        
{{ states('sensor.thermostat_targets')  }}

{{ targets[0] }}
{{ states('sensor.thermostat_targets')[0]  }}

The code above returns the results below when run from the Templatre section.

[14.0, 13.0, 11.0, 11.0, 4.0, 11.0, 13.0, 11.0, 15.0, 4.0, 12.0, 4.0, -1.0, 14.0]
        
[14.0, 13.0, 11.0, 11.0, 4.0, 11.0, 13.0, 11.0, 15.0, 4.0, 12.0, 4.0, -1.0, 14.0]

14.0
[

What should I change?

States are always strings. If you’re storing a list in a sensor state, store it as a JSON string using |to_json and recover it as a list using |from_json.

Alternatively, store it in a sensor attribute, which can be a real object.

You should also try to use the modern format for template sensors if you’re starting out. See here:

1 Like