NMap-Tracker - iterieren durch die device_tracker.* entries

Hallo zusammen,
ich verwende die NMap Integration um eine bessere Übersicht in HA zu den Geräten im Netz zu bekommen.
NMap legt die Geräte in device_tracker ab, somit kann ich z.B. folgend nützliche Info ermitteln und ausgeben:

{{ state_attr('device_tracker.pollin_electronic_gmbh_01_00_01', 'mac')}}
{{ state_attr('device_tracker.pollin_electronic_gmbh_01_00_01', 'ip')}}
{{ state_attr('device_tracker.pollin_electronic_gmbh_01_00_01', 'last_time_reachable')}}
{{ state_attr('device_tracker.pollin_electronic_gmbh_01_00_01', 'reason')}}
{{ state_attr('device_tracker.pollin_electronic_gmbh_01_00_01', 'source_type')}}
{{ state_attr('device_tracker.pollin_electronic_gmbh_01_00_01', 'friendly_name')}}

Ich möchte aber über eine schleife z.B. nach IP sortiert alle Geräte ausgeben.
Bisher habe ich nichts gefunden, wie ich durch den device_tracker iterieren kann
Hat jemand ein Tipp?
Danke und VG
Jo

Eventuell so?

type: markdown
content: >-
  **Geräteinformationen**  

  {%- set output = namespace(device_tracker=[]) -%}

  {%- for state in states.device_tracker|selectattr("attributes.mac", 'defined')-%}
  {%- set ip = state_attr(state.entity_id, 'ip') -%}
  {%- set mac = state_attr(state.entity_id, 'mac') -%}
  {%- set last_time_reachable = state_attr(state.entity_id, 'last_time_reachable') -%}
  {%- set source = state_attr(state.entity_id, 'source') -%}
  {% set source_type = state_attr(state.entity_id, 'source_type') %}
  {% set friendly_name = state_attr(state.entity_id, 'friendly_name') %}  
  {%- set name = state.name -%}
  {%- set output.device_tracker = output.device_tracker + [{'ip': ip, 'mac':  mac, 'name': name, 'last_time_reachable': last_time_reachable, 'reason': reason,'source': source, 'friendly_name': friendly_name, 'source_type': source_type }] -%}
  {%- endfor -%}

  {%- set sorted_device_tracker = output.device_tracker|sort(attribute='ip') -%}
  {%- for device in sorted_device_tracker %}
  
      Name: {{ device.name }}
      IP: {{ device.ip }}
      MAC: {{ device.mac }}
      last_time_reachable: {{ device.last_time_reachable }}
      Source_Type: {{ device.source_type }}
      Source: {{ device.source }}
  ---
  {% endfor %}

Danke crypton für deinen complexen input.
Ich werde es nach Ende meiner Dienstreise gleich am Wochenende Testen.

Frage: Hast du einen Tipp wo ich die Philosophie von HA in Verbindung mit JINJA nachlesen kann? Z.B. set output = namespace(device_tracker=) verstehe ich von der Syntax grundsätzlich, ich wäre aber nie darauf gekommen weil mir das grundsätzliche Basiswissen fehlt.
Danke und beste Grüße
Jo

Ich schau meistens hier nach:
https://jinja.palletsprojects.com/en/3.0.x/templates/

die Doku kenne ich, aber mir fehlt oft der Geistige Link zur HA Umgebung, also dass ich z.B. output = namespace(device_tracker=… nutze…

Jetzt konnte ich vom Zug aus weiter machen: Die erste Schleife läuft einwandfrei durch. Ich habe einen Zähler und eine Kontrollausgabe erweitert

  ....


  {%- set name = state.name -%}

  {%- set output.device_tracker = output.device_tracker + [{'ip': ip, 'mac': 

  mac, 'name': name, 'last_time_reachable': last_time_reachable, 'reason':
  reason,'source': source, 'friendly_name': friendly_name, 'source_type':
  source_type }] -%}
  device {{ctr.value}}= {{ip}} - {{ name }}
  {%- endfor -%}

und das Ergebnis ist wie erwartet:

device 435= None - Samsung Electronics 8E:02:DC
device 436= 192.168.177.40 - Samsung Electronics FA:6B:F1
device 437= 192.168.176.247 - shellydw2-AABEA5
device 438= 192.168.176.251 - shellyflood-B0C1CA

wenn ich jedoch die Zuweisung vor der zweiten Schleife einfüge, also

{%- set sorted_device_tracker = output.device_tracker|sort(attribute='ip') -%}
  

bzw. auch ohne sort

{%- set sorted_device_tracker = output.device_tracker -%}
  

hängt das Markdown und es erfolgt keine Ausgabe mehr.
Hast du eine Idee was da schieflaufen könnte?

Danke und beste Grüße
Jo

Verstehe nicht ganz was du meinst, bzw. erreichen möchtest.
Poste doch mal deinen geänderten YAML-Code.

Ich bin jetzt weiter gekommen. Ich habe knapp 500 devices.

Das bring in der Zeile

  {%- set sorted_device_tracker = output.device_tracker|sort(attribute='ip') -%}

produzierbar den HA zu Absturz. Keine Ahnung welche Komponente genau das Problem hat (Markdown / template / was auch immer). Der HA läuft in einer Oracle VM Box, ich habe 12 GB Speicher dem HA zugewiesen, dass muss locker reichen. Die Auslastung der VM liegt im schnitt bei 20-30%, also auch im grünen Bereich.

Wenn ich aber die Einträge auf z.B. 10 begrenze (sehe script unten) dann läuft es durch

type: markdown
content: |
  **Geräteinformationen** 

  {%- set ctr = namespace(value=0) -%}
  {%- set output = namespace(device_tracker=[]) -%}


  {%- for state in states.device_tracker|selectattr("attributes.mac",
  'defined')-%}

    {%- set ctr.value = ctr.value + 1 -%}

    {%- set ip = state_attr(state.entity_id, 'ip') -%}

    {%- set mac = state_attr(state.entity_id, 'mac') -%}

    {%- set last_time_reachable = state_attr(state.entity_id,
    'last_time_reachable') -%}

    {%- set source = state_attr(state.entity_id, 'source') -%}

    {% set source_type = state_attr(state.entity_id, 'source_type') %}

    {% set friendly_name = state_attr(state.entity_id, 'friendly_name') %}  

    {%- set name = state.name -%}

    {%- if ctr.value < 10 -%}

      {%- set output.device_tracker = output.device_tracker + [{'ip': ip, 'mac': 
      mac, 'name': name, 'last_time_reachable': last_time_reachable, 'reason':
      reason,'source': source, 'friendly_name': friendly_name, 'source_type':
      source_type }] -%}
      device {{ctr.value}}= {{ip}} - {{ name }}
    {%- endif -%}
    
  {%- endfor -%}

  {# xx = {{ output}} #}
  {# yy = {{ output.device_tracker}} #}


  {%- set sorted_device_tracker = output.device_tracker|sort(attribute='ip') -%}


  {%- for device in sorted_device_tracker %}
      Name: {{ device.name }}
      IP: {{ device.ip }}
      MAC: {{ device.mac }}
      last_time_reachable: {{ device.last_time_reachable }}
      Source_Type: {{ device.source_type }}
      Source: {{ device.source }}
  ---
  {% endfor %}

Ausgabe wie zu erwarten

Hat jemand Erfahrung, wie man bugs wie diesen am besten an die HA Entwickler kommunizieren kann? Gibt es eine andere Möglichkeit für die Dyn. Ausgabe außer Markdown?

Danke und beste Grüße

Jo

Also es werden in dem Template nur die Device_Tracker berücksichtigt, denke da wirst du ja keine 500 haben, oder?
In deinem neuen Template brauchst du die Variable ctr.value nicht, da es in Jinja die Variable loop.index gibt, die den aktuellen Durchlauf der Schleife angibt. Um zu testen, ob eventuell die Markdown-Karte das Problem ist, könntest du deinen Code mal so wie er ist (ohne die Begrenzung auf 10) im Template-Editor einfügen und sehen, ob HA dann auch abstürzt.

Hallo Crypton, danke für deine Antwort und deine Tipps. Die Nmap Tracker Integration bildet für alle WLAN Geräte einen Device Tracker ab. Soll ja auch so sein, da ich ja über diese Geräte die Übersicht haben möchte. Das sind derzeit ~500. Tendenz steigend… :upside_down_face:
Aber letztendlich ist es ja egal ob device tracker oder nicht, es sind ca. 500 WLAN Geräte in meinem HA eingebunden.

Gerade getestet: In den Entwicklerwerkzeugen “Template” sind keine Abstürze passiert. Allerdings habe ich festgestellt, dass die Operationen sehr CPU intensiv sind. Das führt dazu, dass andere Fenster “Verbindung getrennt… wird erneut verbunden” anzeigen. Das if zum Begrenzen habe ich noch drin gelassen. Ab ca. >150 im if … kommt die Fehlermeldung

TypeError: ‘<’ not supported between instances of ‘NoneType’ and ‘str’

Das könnte daran liegen, dass ein neuer Refresh in der Entwicklerumgebung des Templates passiert obwohl der vorige Durchlauf noch nicht abgeschlossen ist.

Noch gebe ich nicht auf, aber ich habe die Befürchtung, dass hier Grenzen des HAs erreicht sind

Beste Grüße

Jo