🔹 Auto-entities - Automatically fill cards with entities

I wanted to share the progression that I made with one of my auto-entities cards. Special thanks goes out to @Mariusthvdb for pointing me in the right direction to get the card_mod to work in the final result and @Ildar_Gabdullin’s Entities card post in the card_mod thread.

This is what I started with using - entity_id: sensor.*_motion_detector_battery_level include:

Code
type: custom:auto-entities
card:
  type: entities
  title: Motion Detector Batteries
  card_mod:
    style: |
      ha-card {
        background: black;
        --primary-text-color: white;
      }
filter:
  include: 
    - entity_id: sensor.*_motion_detector_battery_level
  exclude:
    - options: {}
      state: unavailable
    - options: {}
      hidden_by: user
sort:
  method: state
  numeric: true
  reverse: true

I added card_mod to colorize the states and icons using the red-to-green scale template that I posted in Green-to-red icon color gradient template (battery percentage).

Code
type: custom:auto-entities
card:
  type: entities
  title: Motion Detector Batteries
  card_mod:
    style: |
      ha-card {
        background: black;
        --primary-text-color: white;
      }
filter:
  include:
    - entity_id: sensor.*_motion_detector_battery_level
      options:
        card_mod:
          style:
            hui-generic-entity-row $: |
              {% set percentage = states(config.entity) | int %}
              {% set r, g, b = 0, 0, 0 %}
              {% if (percentage <= 51) %}
                {% set r = 255 %}
                {% set g = (5.0 * percentage) | round | int %}
              {% else %}
                {% set g = 255 %}
                {% set r = (505 - 4.89 * percentage) | round | int %}
              {% endif %}
              {% set gradient = "#%0x" | format( r * 0x10000 + g * 0x100 + b * 0x1 ) %}
              .state { color: {{ gradient }} }
              state-badge { color: {{gradient}}; }  
  exclude:
    - options: {}
      state: unavailable
    - options: {}
      hidden_by: user
sort:
  method: state
  numeric: true
  reverse: true

I did not like how each entity had Motion Detector Battery Level in the name. To fix this, I knew I needed to be able to use a template to get the entities, replace the text, and still apply the card_mod. This is the end result.

Code
type: custom:auto-entities
card:
  type: entities
  title: Motion Detector Batteries
  card_mod:
    style: |
      ha-card {
        background: black;
        --primary-text-color: white;
      }
unique: entity
show_empty: true
filter:
  template: |
    {%- set device_list = states.sensor 
      | selectattr('entity_id', 'search', 'motion_detector_battery_level')
      | rejectattr('state' , 'in' , ['unknown','unavailable'])
      | map(attribute='entity_id')
      | list -%} 
    {%- for device in device_list -%}
      {{ { 
        'entity': device,
        'name': state_attr(device, "friendly_name") | regex_replace(find='Motion Detector Battery Level', replace='', ignorecase=true) ,
        'card_mod': 
          {'style':
            {'hui-generic-entity-row $': '
              {% set percentage = states(config.entity) | int %}
              {% set r, g, b = 0, 0, 0 %}
              {% if (percentage <= 51) %}
                {% set r = 255 %}
                {% set g = (5.0 * percentage) | round | int %}
              {% else %}
                {% set g = 255 %}
                {% set r = (505 - 4.89 * percentage) | round | int %}
              {% endif %}
              {% set gradient = "#%0x" | format( r * 0x10000 + g * 0x100 + b * 0x1 ) %}

              .state { color: {{ gradient }}; }
              state-badge { color: {{ gradient }}; }'
            }
          }
      } }},
    {%- endfor -%}
sort:
  method: state
  reverse: true
  numeric: true

The final template can be easily adapted to use a list of entities similar to the standard include: method where a complex template is not needed but can still utilize the rest of the code.

Code
{%- set device_list = [
  'sensor.s25_ultra_battery_level', 'sensor.watch5_battery_level',
  'sensor.tab_s7_fe_battery_level', 'sensor.ipad_battery_level'
] -%} 

UPDATE: This example shows how to find multiple strings to be removed from the displayed name. regex_replace(find='Battery Level|Door|Battery', replace='', ignorecase=true)

Code
type: custom:auto-entities
card:
  type: entities
  title: Sensor Batteries
  card_mod:
    style: |
      ha-card {
        background: black;
        --primary-text-color: white;
      }
unique: entity
show_empty: true
filter:
  template: |
    {%- set device_list = [
      'sensor.refrigerator_battery','sensor.freezer_battery',
      'sensor.living_room_door_battery_level','sensor.bathroom_door_battery_level',
      'sensor.hallway_closet_battery_level'
    ] -%} 
    {%- for device in device_list -%}
      {{ { 
        'entity': device,
        'name': state_attr(device, "friendly_name") | regex_replace(find='Battery Level|Door|Battery', replace='', ignorecase=true),
        'card_mod': 
        
          {'style':
            {'hui-generic-entity-row $': '
              {% set percentage = states(config.entity) | int %}
              {% set r, g, b = 0, 0, 0 %}
              {% if (percentage <= 51) %}
                {% set r = 255 %}
                {% set g = (5.0 * percentage) | round | int %}
              {% else %}
                {% set g = 255 %}
                {% set r = (505 - 4.89 * percentage) | round | int %}
              {% endif %}
              {% set gradient = "#%0x" | format( r * 0x10000 + g * 0x100 + b * 0x1 ) %}

              .state { color: {{ gradient }}; }
              state-badge { color: {{ gradient }}; }'

            }
          }
      } }},
    {%- endfor -%}
sort:
  method: state
  reverse: true
  numeric: true

At the risk of going off-topic, here’s how I’ve brought this all together. I use the /breakthestatic/swipe-card (which is a little more up-to-date than /bramkragten/swipe-card).
20250809-2231

Code
type: custom:swipe-card
start_card: 2
parameters:
  effect: cube
  loop: true
  freeMode: true
  speed: 4000
  autoplay:
    delay: 2500
    disableOnInteraction: false
    reverseDirection: false
    stopOnLastSLide: false
cards:
  - type: custom:auto-entities
    card:
      type: entities
      title: My Devices
      card_mod:
        style: |
          ha-card {
            background: black;
            --primary-text-color: white;
          }
    unique: entity
    show_empty: true
    filter:
      template: |
        {%- set device_list = [
          'sensor.s25_ultra_battery_level', 'sensor.watch5_battery_level',
          'sensor.tab_s7_fe_battery_level', 'sensor.dereks_ipad_battery_level'
        ] -%} 
        {%- for device in device_list -%}
          {{ { 
            'entity': device,
            'name': state_attr(device, "friendly_name") | regex_replace(find='Battery Level', replace='', ignorecase=true) ,
            'card_mod': 
            
              {'style':
                {'hui-generic-entity-row $': '
                  {% set percentage = states(config.entity) | int %}
                  {% set r, g, b = 0, 0, 0 %}
                  {% if (percentage <= 51) %}
                    {% set r = 255 %}
                    {% set g = (5.0 * percentage) | round | int %}
                  {% else %}
                    {% set g = 255 %}
                    {% set r = (505 - 4.89 * percentage) | round | int %}
                  {% endif %}
                  {% set gradient = "#%0x" | format( r * 0x10000 + g * 0x100 + b * 0x1 ) %}

                  .state { color: {{ gradient }}; }
                  state-badge { color: {{ gradient }}; }'

                }
              }
          } }},
        {%- endfor -%}
    sort:
      method: state
      reverse: true
      numeric: true
  - type: custom:auto-entities
    card:
      type: entities
      title: Motion Detector Batteries
      card_mod:
        style: |
          ha-card {
            background: black;
            --primary-text-color: white;
          }
    unique: entity
    show_empty: true
    filter:
      template: |
        {%- set device_list = states.sensor 
          | selectattr('entity_id', 'search', 'motion_detector_battery_level')
          | rejectattr('state' , 'in' , ['unknown','unavailable'])
          | map(attribute='entity_id')
          | list -%} 
        {%- for device in device_list -%}
          {{ { 
            'entity': device,
            'name': state_attr(device, "friendly_name") | regex_replace(find='Motion Detector Battery Level', replace='', ignorecase=true),
            'card_mod': 
            
              {'style':
                {'hui-generic-entity-row $': '
                  {% set percentage = states(config.entity) | int %}
                  {% set r, g, b = 0, 0, 0 %}
                  {% if (percentage <= 51) %}
                    {% set r = 255 %}
                    {% set g = (5.0 * percentage) | round | int %}
                  {% else %}
                    {% set g = 255 %}
                    {% set r = (505 - 4.89 * percentage) | round | int %}
                  {% endif %}
                  {% set gradient = "#%0x" | format( r * 0x10000 + g * 0x100 + b * 0x1 ) %}

                  .state { color: {{ gradient }}; }
                  state-badge { color: {{ gradient }}; }'

                }
              }
          } }},
        {%- endfor -%}
    sort:
      method: state
      reverse: true
      numeric: true
  - type: custom:auto-entities
    card:
      type: entities
      title: Sensor Batteries
      card_mod:
        style: |
          ha-card {
            background: black;
            --primary-text-color: white;
          }
    unique: entity
    show_empty: true
    filter:
      template: |
        {%- set device_list = [
          'sensor.refrigerator_battery','sensor.freezer_battery',
          'sensor.living_room_door_battery_level','sensor.bathroom_door_battery_level',
          'sensor.hallway_closet_battery_level'
        ] -%} 
        {%- for device in device_list -%}
          {{ { 
            'entity': device,
            'name': state_attr(device, "friendly_name") | regex_replace(find='Battery Level|Door|Battery', replace='', ignorecase=true),
            'card_mod': 
            
              {'style':
                {'hui-generic-entity-row $': '
                  {% set percentage = states(config.entity) | int %}
                  {% set r, g, b = 0, 0, 0 %}
                  {% if (percentage <= 51) %}
                    {% set r = 255 %}
                    {% set g = (5.0 * percentage) | round | int %}
                  {% else %}
                    {% set g = 255 %}
                    {% set r = (505 - 4.89 * percentage) | round | int %}
                  {% endif %}
                  {% set gradient = "#%0x" | format( r * 0x10000 + g * 0x100 + b * 0x1 ) %}

                  .state { color: {{ gradient }}; }
                  state-badge { color: {{ gradient }}; }'

                }
              }
          } }},
        {%- endfor -%}
    sort:
      method: state
      reverse: true
      numeric: true
5 Likes