List of all 'domains', 'entities',

This is ‘markdown’ + ‘script editor’:

1 Like

a yes, of course, forgot about that for a second… heavily into sensors, states and attributes this morning. sorry for that…
using it myself as a matter of fact, how could I forget.

19

lovely! thanks!

how did you manage to break down each integration coponents?

it all started here Template to display loaded components on HA instance?

this is the python_script currently:

##############################################################################################################
# python script to show the loaded components on a  Hassio instance, and order them alphabetically, grouping
# components that have sub components (attributes)
# this script gets its data from the rest_sensor:
#   - platform: rest
#     name: Hassio Rpi4 config
#     resource: !secret resource_hassio_rpi4_config
#     authentication: basic
#     value_template: >
#       {{ value_json.version }}
#     json_attributes:
#       - components
#       - unit_system
#       - config_dir
#     headers:
#       Content-Type: application/json
#       Authorization: !secret api_bearer_token
#       User-Agent: Home Assistant REST sensor

# https://community.home-assistant.io/t/template-to-display-loaded-components-on-ha-instance/114402/59
# @123 and @apop pointed to the rest sensor, and made that availabe in Lovelace
# @petro had a great hand in creating the script
# thanks for joining in on a great HA community!
# @mariusthvdb 20190504
##############################################################################################################
attributes = {}
components = hass.states.get('sensor.hassio_rpi4_config').attributes['components']
cnt = len(components)
components.sort()

# Make a dictionary of all main domains, add each sub domain to the main domain list.
compdict = {}
for component in components:
    if component.count('.') == 0 and component not in compdict:
        compdict[component] = []
    if component.count('.') == 1:
        domain, subdomain = component.split('.')
        compdict[domain].append(subdomain)

# Make the dictionary into a flat list of strings.

complist = []

for key, value in compdict.items():
    if value:
        value.sort()
        # Adding a domain & series of sub domains
        complist.append('- {}: \n --> {}'.format(key, ', '.join(value)))
    else:
        complist.append('- {}'.format(key))

# join each component with a carriage return
complist = '\n'.join(complist)

text = '{} Loaded Components:\n' \
       '{}'.format(cnt, complist)

attributes['friendly_name'] = 'Components'
attributes['icon'] = 'mdi:format-list-bulleted-type'
attributes['Components'] = cnt
attributes['---------------'] = '--------'

attributes['text'] = complist #text

hass.states.set('sensor.overview_components', cnt, attributes)

# hass.states.set('sensor.overview_components', cnt, {
#     'icon': 'mdi:format-list-bulleted-type',
#     'friendly_name': 'Components',
#     'text': text
#     })
##############################################################################################################
# first attempt, simply creating an unordered list of components
# components = hass.states.get('sensor.hassio_main_config').attributes['components']
# count = len(components)
# components.sort()
# list = ', '.join(components)
#
# text = '*========== {} Loaded Components ========\n' \
#         '+{}' \
#           .format(count,
#                   list)

left in some comments, might be interesting to see what’s happening.

2 Likes

One line version:

- {{ states|map(attribute='domain')|unique|list|join('\n- ') }}

Will print something like:

- air_quality
- alarm_control_panel
- automation
- binary_sensor
- camera
- climate
- cover
- device_tracker
- fan
- input_boolean
- input_number
- input_select
- light
- media_player
- persistent_notification
- person
- remote
- script
- sensor
- sun
- switch
- vacuum
- weather
- zone

For entities:

- {{ states|selectattr('state', 'ne', 'unavailable')|map(attribute='entity_id')|list|join('\n- ') }}

Will output all entities that are not “unavailable” (remove that selectattr if you want all unavailable as well).

7 Likes

Thanks for posting this. I’m having very rudimentary issues I think. I am new to python scripting, but I am getting the error below on this line.

components = hass.states.get('sensor.hassio_rpi4_config').attributes['components']

Logger: homeassistant.components.python_script.list_entities.py
Source: components/python_script/init.py:217
Integration: Python Scripts (documentation, issues)
First occurred: 5:16:38 PM (1 occurrences)
Last logged: 5:16:38 PM
Error executing script: ‘NoneType’ object is not subscriptable
Traceback (most recent call last):
File “/usr/src/homeassistant/homeassistant/components/python_script/init.py”, line 217, in execute exec(compiled.code, restricted_globals)
File “list_entities.py”, line 27, in File “/usr/local/lib/python3.8/site-packages/RestrictedPython/Eval.py”, line 35, in default_guarded_getitem return ob[index]
TypeError: ‘NoneType’ object is not subscriptable

1 Like

Did you setup the rest sensor which is described at the beginning of the script?

No, that must be the step I missed. Are the steps to do that in your other topic you linked to?

In the python script you copied from Marius, at the top are some lines describing the rest sensor and he also has an example right there:

##############################################################################################################
# python script to show the loaded components on a  Hassio instance, and order them alphabetically, grouping
# components that have sub components (attributes)
# this script gets its data from the rest_sensor:
#   - platform: rest
#     name: Hassio Rpi4 config
#     resource: !secret resource_hassio_rpi4_config
#     authentication: basic
#     value_template: >
#       {{ value_json.version }}
#     json_attributes:
#       - components
#       - unit_system
#       - config_dir
#     headers:
#       Content-Type: application/json
#       Authorization: !secret api_bearer_token
#       User-Agent: Home Assistant REST sensor
1 Like

Oh man, I skipped right over the comments. My bad, thanks for not ripping me up on that. I’ll be more careful and read slower. :slight_smile:

This is a great way to display all entities!

Could somebody please help me with my attempt to list all entities and their corresponding friendly_names? Apparently, my alexa does not turn on bed room any longer (it reports that the device is not responding), and I assume this is due to multiple entities with the same name.


{%- for state in states -%}
- {{state.entity_id + state.name + "\n"}}
{%- endfor -%}

This will display all my entities and their set names. How can I display only those entities that have the same name (in my case, Schlafzimmer)?

UPDATE: I came up with this block below. Is this the right way, or is there a better/more sinsible method to achieve the same thing?


{%- for state in states -%}
  {% if state.name == "Schlafzimmer" %}
  - {{(state.entity_id + " => " + state.name + "\n")}}
  {% endif %}
{%- endfor -%}
1 Like

so because I recently noticed the Z-waveJS integration is displayed under many Domains, I would love to develop on this script, to list these multiple subdomains with their respective domains. Eg I now have

binary_sensor.zwave_js
climate.zwave_js
cover.zwave_js
fan.zwave_js
light.zwave_js
lock.zwave_js
number.zwave_js
sensor.zwave_js
switch.zwave_js
and finally zwave_js,

and I would love to have a template or python script creating an output like

zwave_js:

  • binary_sensor
  • climate
  • cover
  • fan
  • light
  • lock
  • number
  • sensor
  • switch

for all subdomains belonging to other domains.

This must be an easy reversal in the scripts logic, but all my thoughts on it lead to nothing… please have a look with me how to create that?
Thanks!

update

progress but nothing ripe for production just yet:

attributes = {}
components = hass.states.get('sensor.ha_rpi4_config').attributes['components']
cnt = len(components)
components.sort()

# Make a dictionary of all main domains, add each sub domain to the main domain list.
compdict = {}
subdict = {}
for component in components:
    if component.count('.') == 0 and component not in compdict:
        compdict[component] = []
    if component.count('.') == 1:
        domain, subdomain = component.split('.')
#        compdict[domain].append(subdomain)
        compdict.setdefault(domain, []).append(subdomain)
        if len(subdomain) > 1:
            subdict.setdefault(subdomain, []).append(domain)
# Make the dictionary into a flat list of strings.

complist = []

for key, value in compdict.items():
    if value:
        value.sort()
        # Adding a domain & series of sub domains
        complist.append('- {}: \n for: {}'.format(key, ', '.join(value)))
#     else:
#         complist.append('- {}'.format(key))

sublist = []
cntsub = 0
for key, value in subdict.items():
    if value:
        value.sort()
        # Adding a subdomain & series of domains
        sublist.append('- {}: \n for: {}'.format(key, ', '.join(value)))
        cntsub = cntsub + 1
    else:
        sublist.append('- {}'.format(key))

# join each component with a carriage return
complist = '\n'.join(complist)
sublist = '\n'.join(sublist)

#text = '{} Loaded Components:\n' \
#       '{}'.format(cnt, complist)

#subtext = '{} Multiple subdomains:\n' \
#       '{}'.format(cntsub, sublist)

attributes['friendly_name'] = 'Components'
attributes['icon'] = 'mdi:format-list-bulleted-type'
attributes['Components'] = cnt
attributes['---------------'] = '--------'

attributes['text'] = complist #text

attributes['Subdomains'] = cntsub
attributes[**************'] = '--------'
attributes['subtext'] = sublist
hass.states.set('sensor.overview_components', cnt, attributes)

results in a listing like:

- xbox: 
 for: binary_sensor, media_player, remote, sensor
- zwave_js: 
 for: binary_sensor, climate, cover, fan, light, lock, number, sensor, switch
- buienradar: 
 for: camera, sensor, weather

but it has 2 major flaws just yet, in that it also lists the single subdomain entries. I thought I prevented that with

if len(subdomain) > 1:
            subdict.setdefault(subdomain, []).append(domain)

but apparently it doesn’t :wink:

Secondly, I would love to sort() the subdomains alphabetically. Right now, the list of domains (for: binary_sensor, media_player, remote, sensor) is sorted correctly, but the main listing isnt.

Hello everyone,
I was wondering, could the code posted here be modified in a way to only show entities that are part of a certain integration?
Reason behind this is I would like to use this code to maybe tell Recorder what to record. And I basically do not care about any system information and only want to record all the devices that I installed via Tasmota and Shelly integrations.

domains:
 
{%- set unique_domains = states | map(attribute='domain') |list | unique | list -%}
{%- for domain in unique_domains -%}
{{"\n"}}- {{domain}}
{%- endfor -%}
{{"\n"}}

entities:
 
{%- for state in states -%}
{{"\n"}}- {{state.entity_id}}
{%- endfor -%}
2 Likes

There is an integration_entities() function, for example:

{{expand(integration_entities('hue'))|selectattr('domain', 'eq', 'light')|map(attribute='entity_id')|list|join('\n- ') }}

Would get you all the lights in the hue integration

1 Like

Hi, using the code of @dariusz as follows:

{% for d in states | groupby('domain') %}
  {% if loop.first %} Domains: {{loop.length}}
  {% endif %} - {{ d[0] }} ({{ states[d[0]] | count }})
      - {{ states[d[0]] |map(attribute='entity_id')| list|join('\n      - ') }}
{% endfor %}

resulting in displayed in a ‘mark-down’ card:

Domains: 25
   - automation (11)
      - automation.001a_garage_2_auto_lights_on
      - ...

   - binary_sensor (49)
      - binary_sensor.bbq_flood_light_shelly1pm_06_overheating
      - ...

   - button (35)
      - button.bbq_flood_light_shelly1pm_06_ota_update
      - ...

   - camera (2)
      - camera.cam_stairwell_01_gf_ff_high
      - camera.cam_stairwell_02_ff_rf_high

   - climate (18)
      - climate.ff_bedroom_1_ac
      - climate.ff_bedroom_2_ac
      - ...

   - cover (43)
      - cover.ff_bathroom_1_window_1
      - ...

   - device_tracker (73)
      - device_tracker.ana_s_mobile
      - ...

   - group (66)
      - group.b1_covers
      - ...

   - input_boolean (8)
      - input_boolean.basement
      - ...

   - input_number (21)
      - input_number.diesel_tank_adc_offset
      - ...

   - input_select (1)
      - input_select.mode

   - light (180)
      - light.bathroom_1_light
      - light.bathroom_1_mirror
      - ...

   - media_player (11)
      - media_player.all_speakers
      - ...

   - number (6)
      - number.cam_stairwell_01_gf_ff_microphone_level
      - ...

   - persistent_notification (1)
      - persistent_notification.config_entry_discovery

   - person (5)
      - ...

   - remote (1)
      - remote.roku_yj002t616908

   - script (3)
      - script.call_hamza
      - script.call_the_guys
      - script.call_zaid

   - select (8)
      - select.cam_stairwell_01_gf_ff_infrared_mode
      - ...

   - sensor (285)
      - sensor.amman
      - sensor.ana_s_mobile_uptime
      - ...

   - sun (1)
      - sun.sun

   - switch (121)
      - switch.b1_guard_ufh_valve
      - switch.b1_ufh_pump
      - ...

   - update (9)
      - update.ha_scheduler_update
      - update.home_assistant_core_update
      - ....

   - weather (1)
      - weather.home

   - zone (1)
      - zone.home

I need help how I can make the display on a dashboard having:
a custom button with (name=domain name, value=number of entity_id(s)) and when pressed it displays the list of entities
Any advise is highly appreciated
RS

5 Likes

just so we’re understanding what you want: you try t create 25 buttons (for each domain) and the number of the entities in that domain? and then list only those entities in a popup?

seems a bit crowded tbh, and maybe you can have more compact solutions. like fold the listings in a fold-entity-row, or, simply scroll the list, like I do:

  - type: entities
    title: Domains and entities
    card_mod:
      class: class-header-margin
    entities:
      - type: custom:hui-element
        card_type: markdown
        card_mod:
          style: |
            ha-card.type-markdown {
              box-shadow: none;
              margin: 0px -16px -16px -16px;
              overflow-y: scroll;
              height: 450px;
            }
        content: >
          {% set x = ['unavailable','unknown'] %}
          {%- for d in states|groupby('domain') %}
          {% if loop.first %} ### Domains: {{loop.length}}{% endif %}
            **{{- d[0]}}:** *({{states[d[0]]
                                |rejectattr('state','in',x)
                                |list|count}})*
            {% for i in d[1] if i.state not in x -%}
            > {{i.name}}: *{{i.state}}*
            {% endfor %}
          {%- endfor -%}

2 Likes

Hi @Mariusthvdb
This is definitely better than mine and saved a lot of space :slight_smile: however, I noticed a difference in the count of buttons between my code and yours! :thinking:
Thanks anyway
RS

The count difference is due the extra filtering of unknowns and unavailable entities

Very nice, Thank you