There are a few topics that seem to be similar to this, but none of them are exactly answering my question.
Background: I have a bunch of sensors (and attributes) that represent text description of an icon. These icons are used on an lvgl weather display. I am running into memory issues in ESPHome so I want to offload the icon selection code to HA. I’ve successfully done this where the descriptor is a sensor state, but it fails when the descriptor is an attribute of a sensor.
For example this works:
- unique_id: weather_display_icon1
variables:
descriptor: "{{ states('sensor.rutherglen_icon_descriptor_1') }}"
state: &selecticon >
{% set icons = [
{ "condition": "clear", "icon": "\uF00D" },
{ "condition": "cloudy", "icon": "\uF013" },
{ "condition": "cyclone", "icon": "\uF0C1" },
{ "condition": "dust", "icon": "\uF082" },
{ "condition": "dusty", "icon": "\uF082" },
{ "condition": "fog", "icon": "\uF014" },
{ "condition": "frost", "icon": "\uF076" },
{ "condition": "haze", "icon": "\uF021" },
{ "condition": "hazy", "icon": "\uF021" },
{ "condition": "heavy_shower", "icon": "\uF008" },
{ "condition": "heavy_showers", "icon": "\uF008" },
{ "condition": "light_rain", "icon": "\uF01A" },
{ "condition": "light_shower", "icon": "\uF009" },
{ "condition": "light_showers", "icon": "\uF00A" },
{ "condition": "mostly_sunny", "icon": "\uF00C" },
{ "condition": "partly_cloudy", "icon": "\uF002" },
{ "condition": "rain", "icon": "\uF019" },
{ "condition": "rainy", "icon": "\uF019" },
{ "condition": "shower", "icon": "\uF009" },
{ "condition": "showers", "icon": "\uF009" },
{ "condition": "snow", "icon": "\uF01B" },
{ "condition": "snowy", "icon": "\uF01B" },
{ "condition": "storm", "icon": "\uF01E" },
{ "condition": "storms", "icon": "\uF01E" },
{ "condition": "sunny", "icon": "\uF00D" },
{ "condition": "tropical_cyclone", "icon": "\uF073" },
{ "condition": "wind", "icon": "\uF050" },
{ "condition": "windy", "icon": "\uF050" }
] %}
{% set weather_icons = icons | selectattr("condition", "equalto", descriptor) | list | first %}
{{ weather_icons.icon }}
- unique_id: weather_display_icon2
variables:
descriptor: "{{ states('sensor.rutherglen_icon_descriptor_2') }}"
state: *selecticon
This returns “unavailable”:
- unique_id: weather_display_hourly_icon0
variables:
descriptor: "{{ state_attr('sensor.weather_data', 'condition_0') }}"
state: &selectdaynight >
{% set icons = [
{ "condition": "clear", "icon": "\uF00D" },
{ "condition": "cloudy", "icon": "\uF013" },
{ "condition": "cyclone", "icon": "\uF0C1" },
{ "condition": "dust", "icon": "\uF082" },
{ "condition": "dusty", "icon": "\uF082" },
{ "condition": "fog", "icon": "\uF014" },
{ "condition": "frost", "icon": "\uF076" },
{ "condition": "haze", "icon": "\uF021" },
{ "condition": "hazy", "icon": "\uF021" },
{ "condition": "heavy_shower", "icon": "\uF008" },
{ "condition": "heavy_showers", "icon": "\uF008" },
{ "condition": "light_rain", "icon": "\uF01A" },
{ "condition": "light_shower", "icon": "\uF009" },
{ "condition": "light_showers", "icon": "\uF00A" },
{ "condition": "mostly_sunny", "icon": "\uF00C" },
{ "condition": "partly_cloudy", "icon": "\uF002" },
{ "condition": "rain", "icon": "\uF019" },
{ "condition": "rainy", "icon": "\uF019" },
{ "condition": "shower", "icon": "\uF009" },
{ "condition": "showers", "icon": "\uF009" },
{ "condition": "snow", "icon": "\uF01B" },
{ "condition": "snowy", "icon": "\uF01B" },
{ "condition": "storm", "icon": "\uF01E" },
{ "condition": "storms", "icon": "\uF01E" },
{ "condition": "sunny", "icon": "\uF00D" },
{ "condition": "tropical_cyclone", "icon": "\uF073" },
{ "condition": "wind", "icon": "\uF050" },
{ "condition": "windy", "icon": "\uF050" }
] %}
{% set weather_icons = icons | selectattr("condition", "equalto", descriptor) | list | first %}
{{ weather_icons.icon }}
Replacing the variable with the state_attr works and returns the correct icon:
] %}
{% set weather_icons = icons | selectattr("condition", "equalto", state_attr('sensor.weather_data', 'condition_0') ) | list | first %}
{{ weather_icons.icon }}
I assume this is something in how Python is handling these values in the background - any advice would be appreciated. I can workaround by templating the attributes into individual sensors but I thought I would ask first.