Coloring an image based on state

Now, the complete code:

type: 'custom:config-template-card'
entities: [light.extended_color_light_4]
style: []
card:
  type: picture-elements
  image: /local/floorplan/base.png
  elements:
    - type: image
      entity: light.extended_color_light_4
      state_image:
        "on": /local/floorplan/couch.png
        "off": /local/floorplan/empty.png
        "unavailable": /local/floorplan/empty.png
      style:
        top: 50%
        left: 50%
        width: 100%
        background-color: >-
          ${var light_rgb=states['light.extended_color_light_4'].attributes['rgb_color'].replace('{','').replace('}',''); 
            if (states['light.extended_color_light_4'].state == 'on') 'rgba('+light_rgb+',1)'; 
            else 'rgba(0,0,0,0)';}

If that works, the background color will be your light.extended_color_light_4 color when that’s on.

That doesn’t work: the card is empty again…

What do you get from {{ state_attr(‘light.extended_color_light_4’,‘rgb_color’) }} in the Template page with the color you set now?

blue

Ok, what about {{ state_attr(‘light.extended_color_light_4’,‘rgb_color’)[0] }} ?

blue

The attribute is actually a list, not text.

Change the background-color to this:

        background-color: >-
          ${var r=states['light.extended_color_light_4'].attributes['rgb_color'][0];
            var g=states['light.extended_color_light_4'].attributes['rgb_color'][1];
            var b=states['light.extended_color_light_4'].attributes['rgb_color'][2]; 
            if (states['light.extended_color_light_4'].state == 'on') 'rgba('+r+','+g+','+b+',1)'; 
            else 'rgba(0,0,0,0)';}

YES! some progress! that worked, the background is now the same color as the light.

Would you please share a screenshot to see what it looks like?

However, the card disappears when i turn off the light.

Would you copy and paste your code here so we can double check it? Screenshot does not show complete set of code.

type: 'custom:config-template-card'
entities:
  - light.extended_color_light_4
style: []
card:
  type: picture-elements
  image: /local/floorplan/base.png
  elements:
    - type: image
      entity: light.extended_color_light_4
      state_image:
        'on': /local/floorplan/couch.png
        'off': /local/floorplan/empty.png
        unavailable: /local/floorplan/empty.png
      style:
        top: 50%
        left: 50%
        width: 100%
        background-color: >-
          ${var
          r=states['light.extended_color_light_4'].attributes['rgb_color'][0];
            var g=states['light.extended_color_light_4'].attributes['rgb_color'][1];
            var b=states['light.extended_color_light_4'].attributes['rgb_color'][2]; 
            if (states['light.extended_color_light_4'].state == 'on') 'rgba('+r+','+g+','+b+',1)'; 
            else 'rgba(0,0,0,0)';}

I mean… i just copy yours… :slight_smile:

I can’t see any difference besides you don’t have quote around unavailable:


"unavailable": /local/floorplan/empty.png

Try adding quote around the word unavailable, just like on and off.

no change…

Try replacing all the empty.png with couch.png.

Same result…

Do you see the couch.png when light is off now?
If not, try refresh your browser couple of times, CSS sometimes need force refresh to show up.

For anyone interested, the couch.png was adjusted to not cover the whole base.png and re-positioned using the updated template to accord for undefined rga_color when light is off.


type: 'custom:config-template-card'
entities:
  - light.extended_color_light_4
style: []
card:
  type: picture-elements
  image: /local/floorplan/base.png
  elements:
    - type: image
      entity: light.extended_color_light_4
      state_image:
        'on': /local/floorplan/couch.png
        'off': /local/floorplan/empty.png
        unavailable: /local/floorplan/empty.png
      style:
        . . .
        background-color: >-
          ${if (states['light.extended_color_light_4'].state == 'on') 
             {var r=states['light.extended_color_light_4'].attributes['rgb_color'][0];
              var g=states['light.extended_color_light_4'].attributes['rgb_color'][1];
              var b=states['light.extended_color_light_4'].attributes['rgb_color'][2]; 
              'rgba('+r+','+g+','+b+',1)'; }
            else {'rgba(0,0,0,0)';};}

Basically it is not possible as of yet to do such filtering.
Filling in an empty image and using that as a light edge works, but does not represent the light properly (since light gets dimmer the farther it travels).

If anyone ever reads this: take a look at https://github.com/bradcrc/color-lite-card
This is exactly what I was looking for, it just lacks support for different white colors.

SIMPLE AIR COMFORT CARD Colour Change of SVG Image based on state.

 cards:
                - type: picture-elements
                  image: local/overlay.svg
                  card_mod:
                    style: |
                      ha-card {
                         {% if is_state('sensor.text_dewpoint_comfort_living','Dry Cold') %}
                         --ha-card-background: radial-gradient(circle, blue, black, black, blue) !important;
                         {% elif is_state('sensor.text_dewpoint_comfort_living','Dry Cool') %}
                         --ha-card-background: radial-gradient(circle, lightblue, black, black, lightblue) !important;
                         {% elif is_state('sensor.text_dewpoint_comfort_living','Pleasant') %}
                         --ha-card-background: radial-gradient(circle, lightgreen, black, black, lightgreen) !important;
                         {% elif is_state('sensor.text_dewpoint_comfort_living','Comfortable') %}
                         --ha-card-background: radial-gradient(circle, green, black, black, green) !important;
                         {% elif is_state('sensor.text_dewpoint_comfort_living','Sticky Humid') %}
                         --ha-card-background: radial-gradient(circle, yellow, black, black, yellow) !important;
                         {% elif is_state('sensor.text_dewpoint_comfort_living','Muggy') %}
                         --ha-card-background: radial-gradient(circle, orange, black, black, orange) !important;
                         {% elif is_state('sensor.text_dewpoint_comfort_living','Sweltering') %}
                         --ha-card-background: radial-gradient(circle, darkorange, black, black, darkorange) !important;
                         {% elif is_state('sensor.text_dewpoint_comfort_living','Stifling') %}
                         --ha-card-background: radial-gradient(circle, red, black, black, red) !important;
                         {% endif %}
                      }
                      ha-card {
                        --ha-card-border-width: 0px !important;
                        --ha-card-border-radius: 5px !important;
                        --box-shadow: none !important;
                      }