Im Post Übersicht über ausgelöste Automationen wurden einige Ideen diskutiert und ich hatte mich mit einer Markdownkarte eingebracht.
Diese hatte ich für den Urlaub auf der HA Startseite platziert. Es war einfach super, um auf einen Blick die letzten Aktionen zu sehen und bei Bedarf direkt in die Automatisation zu springen. Was mir fehlte, waren die Auflistung von gestarteten Scripten.
Genau das habe ich heute nachgeholt und stelle den Code für Nachbauer zur Verfügung.
Im Jinja Code der Markdownkarte läßt sich folgendes Verhalten konfigurieren.
- Anzahl Stunden
- Anzahl Haupteinträge
- Sollen nur Automatisationen oder Scripte oder beides gelistet werden
- Möglichkeit Namenskosmetik (z.B. finde “xyz” und ersetze durch “xxx”)
- Möglichkeit bestimmte Automatisationen oder Scripte nicht anzuzeigen
- Anzeige langer Namen begrenzen (besser auf Handy zu lesen)
- Möglichkeit direkt in den Editor Modus der entsperechenden Aut. bzw. Scriptes zu springen
HowTo
- Markdownkarte erstellen
- Im Inhalt diesen Code hineinkopieren
- Variablen anpassen
Zusammenfassung
{#
Version 2.2
Listet getriggerte Automatisationen und/oder Scripte
- der letzten xxx Stunden
- verschiebt ab xxx unter "mehr als" Teil
- kann wahlweise Automatisationen und/oder Scripte berücksichtigen
- versieht Namen der Automatisation mit Präfix "a_" sowie Scripte mit "s_"
- kann Namenskosmetik vornehmen (ersetze "xyz" durch "xxx")
- kann bestimmte Automatisationen/Scripte ignorieren
- Kann auf bestimmte Namenslänge reduzieren (z.B. für bessere Lesbarkeit auf Handy)
#}
<!--+++ Individuelle Konfiguration +++-->
<!-- Wieviel Stunden soll zurückgegangen werden -->
{%- set shown_last_hours = 24 -%}
<!-- Wieviel Haupteinträge (Rest über "mehr" Dialog) -->
{%- set show_always = 10 -%}
<!-- Sollen Automatisationen und/ oder Scripte angezeigt werden -->
{%- set show_autom = true -%}
{%- set show_script = true -%}
<!-- Ausschluß von Automatisationen mit diesen Namensteilen werden nicht angezeigt -->
{%- set exceptions = ['ping_custom', 'xxxxx'] -%}
<!-- Diese Namensteil werden ersetzt z.B. "om_aut" durch "" (case sensitive) -->
{%- set name_replacements = {
'om_scr_': '',
'om_aut_': '',
'tech_': '',
'draussen_': 'drau_',
'mitte_': 'mitt_',
'unten_': 'unt_',
'oben_': 'ob_'
} -%}
<!-- max. Zeichen Namensdarstellung -->
{%- set name_max = 40 -%}
<!-- Andere zentrale Variablen -->
{%- set now_ts = as_timestamp(now()) -%}
{%- set ns = namespace(entries=[]) -%}
<!--+++ Auslesen/Bearbeiten der Automatisationen +++-->
{% if show_autom -%}
{%- for state in states.automation
| selectattr('attributes.last_triggered', 'defined')
| rejectattr('attributes.last_triggered', 'equalto', none)
| sort(attribute='attributes.last_triggered', reverse=true) -%}
{%- set ts = as_timestamp(state.attributes.last_triggered) -%}
{%- if ts is number and (now_ts - ts < shown_last_hours * 3600) -%}
{%- set raw_name = state.name | string -%}
{# Ausschluß bestimmter Automatisationen #}
{%- if (exceptions | select('in', raw_name) | list | count) == 0 -%}
{# Ersetzen von Namensteilen + Präfix "a_" #}
{%- set name_ns = namespace(name=raw_name) -%}
{%- for old, new in name_replacements.items() -%}
{%- set name_ns.name = name_ns.name | replace(old, new) -%}
{%- endfor -%}
{%- set prefix = 'a_' -%}
{%- set cleaned_name = prefix ~ name_ns.name -%}
{%- if cleaned_name | length > name_max -%}
{%- set cleaned_name = cleaned_name[:name_max] ~ '…' -%}
{%- endif -%}
{%- set t = ts | timestamp_custom('%H:%M:%S', true) -%}
{# nur mit der ID läßt sich in den Editor Modus springen #}
{%- if 'id' in state.attributes -%}
{%- set link = '/config/automation/edit/' ~ state.attributes.id -%}
{%- else -%}
{%- set link = '/config/automation/edit/' ~ state.entity_id | replace('automation.', '') -%}
{%- endif -%}
{%- set ns.entries = ns.entries + [(ts, t, cleaned_name, link)] -%}
{%- endif -%}
{%- endif -%}
{%- endfor -%}
{%- endif -%}
<!--+++ Auslesen/Bearbeiten der Scripte +++-->
{# Ohne weitere Kommentare da sehr ähnlich zu obigen Automatisationsblock #}
{% if show_script -%}
{%- for state in states.script
| selectattr('attributes.last_triggered', 'defined')
| rejectattr('attributes.last_triggered', 'equalto', none)
| sort(attribute='attributes.last_triggered', reverse=true) -%}
{%- set ts = as_timestamp(state.attributes.last_triggered) -%}
{%- if ts is number and (now_ts - ts < shown_last_hours * 3600) -%}
{%- set raw_name = state.name | string -%}
{%- if (exceptions | select('in', raw_name) | list | count) == 0 -%}
{%- set name_ns = namespace(name=raw_name) -%}
{%- for old, new in name_replacements.items() -%}
{%- set name_ns.name = name_ns.name | replace(old, new) -%}
{%- endfor -%}
{%- set prefix = 's_' -%}
{%- set cleaned_name = prefix ~ name_ns.name -%}
{%- if cleaned_name | length > name_max -%}
{%- set cleaned_name = cleaned_name[:name_max] ~ '…' -%}
{%- endif -%}
{%- set t = ts | timestamp_custom('%H:%M:%S', true) -%}
{%- if 'id' in state.attributes -%}
{%- set link = '/config/script/edit/' ~ state.attributes.id -%}
{%- else -%}
{%- set link = '/config/script/edit/' ~ state.entity_id | replace('script.', '') -%}
{%- endif -%}
{%- set ns.entries = ns.entries + [(ts, t, cleaned_name, link)] -%}
{%- endif -%}
{%- endif -%}
{%- endfor -%}
{%- endif -%}
<!--+++ Ausgabe: Ab hier mit Vorsicht ändern. HTML Konstrukte in Markdownkarte sind fragil ("-%} = wichtig") +++-->
### In den letzten {{ shown_last_hours }} Stunden
{% if show_autom or show_script -%}
{%- set sorted = ns.entries | sort(attribute=0, reverse=true) -%}
<table border=0>
{%- for row in sorted[:show_always] -%}
<tr>
<td>{{ row[1] }}</td>
<td><a href="{{ row[3] }}">{{ row[2] }}</a></td>
</tr>
{%- endfor -%}
</table>
{%- if sorted | length > show_always -%}
<br>
<details>
<summary><b>mehr als {{show_always}} Einträge zeigen</b></summary>
<table border=0>
{%- for row in sorted[show_always:] -%}
<tr>
<td>{{ row[1] }}</td>
<td><a href="{{ row[3] }}">{{ row[2] }}</a></td>
</tr>
{%- endfor -%}
</table>
</details>
{%- endif -%}
{%- else -%}
Laut Deiner Konfiguration der Variablen sollen weder Automatisationen noch Scripte angezeigt werden.
{%- endif -%}
Viel Spaß beimn Probieren und bitte publiziert nützliche Änderungen.
Und wenn es Fehler gibt, unbedingt auch diese.



