Übersicht über ausgelöste Automationen

Eigentlich wollte ich mir hier Hilfe holen, habe es dann aber doch selbst hingekriegt, deshalb stelle ich mein Miniprojekt mal hier ein. Ich wollte gern im Dashboard eine Übersicht über die zuletzt ausgelösten Automationen haben. Die Lösung besteht aus zwei Teilen, nämlich einer Reihe von Template-Sensoren:

      - name: "Letzte Auslösung Erinnerung Müllabfuhr"
        state: "{{ state_attr('automation.mullabfuhr_erinnerung', 'last_triggered') | as_local }}"
        device_class: timestamp
      - name: "Letzte Auslösung Benachrichtigung Dampfgarer"
        state: "{{ state_attr('automation.benachrichtigung_dampfgarer', 'last_triggered') | as_local }}"
        device_class: timestamp
      - name: "Letzte Auslösung Benachrichtigung Geschirrspüler"
        state: "{{ state_attr('automation.geschirrspuler_ende', 'last_triggered') | as_local }}"
        device_class: timestamp

(usw.)
und einer simplen Dashboard-Karte, die dann so aussieht:

6 „Gefällt mir“

Gute Idee. Habe ich direkt mal nachgebaut und kann jetzt sehen, dass ich seit 191 Stunden und 27 Minuten keine neue Rechnung im Briefkasten habe :grin:

4 „Gefällt mir“

Ich habe das über die custom:auto-entities Card gemacht

type: custom:auto-entities
filter:
  include:
    - domain: automation
      options: {}
  exclude:
    - attributes:
        last_triggered: null
    - name: Climate:*
show_empty: false
sort:
  method: last_triggered
  reverse: true
  count: 20
  ignore_case: false
  ip: false
  numeric: false
card:
  type: custom:battery-state-card
  title: Automationen
  icon: mdi:home-automation
  secondary_info: "{last_updated}"
  unit: null
  collapse: 5

Mit include bzw. exclude kann man das schön eingrenzen. 5 Automationen werden sofort angezeigt und weitere kann man aufklappen, sortiert nach zuletzt ausgelöst.

8 „Gefällt mir“

Das ist sehr gut! Mit welcher Card hast du das dann angezeigt? Was ist “battery-state-card” für eine? Kommt die aus HACS?

Mit der

Du musst dir dazu auto-entities installieren (HACS).

Die Auto-Entities Card habe ich. Aber bei dem Teil des Codes von Dir (siehe unten) in dem die Card ausgewählt wird, bekomme ich einen Fehler. Nehme ich statt dessen die HA Entities card geht es, aber da kann ich dann nicht die Zeit der letzten Änderung anzeigen lassen. Habe ich evtl. eine “alte” oder “andere” Auto entities card??

card:
  type: custom:battery-state-card
  title: Automationen
  icon: mdi:home-automation
  secondary_info: "{last_updated}"
  unit: null
  collapse: 5

PS: Ich habe offenbar Version 1.16.1 der Auto entities.

Weitere Möglichkeit wäre eine Markdown-Karte.

Code

        type: markdown
        content: |-
          <!-- Automationen in den letzten 24 Stunden -->

          <font size='4'>Automationen in den letzten 24 Stunden</font>

          *[—> Alle Automationen](/config/automation/dashboard)*

          <!-- WICHTIG: Zwischen den code tags muss sich je ein Absatz befinden! -->

          <!-- <details> </details> -->

          **Zeit &nbsp;&nbsp;&nbsp;&nbsp; Name**
          {% for state in (states.automation
            |selectattr('attributes.last_triggered', 'defined')
            | selectattr('attributes.last_triggered')
            | selectattr('state', 'ne', 'unavailable')
            | sort(attribute='attributes.last_triggered', reverse=true)) [0:10] -%}
            {% if state.attributes.last_triggered and (now() - state.attributes.last_triggered).total_seconds() < 86400 %}
              {%- set t = (as_timestamp(state.attributes.last_triggered) | timestamp_custom('%H:%M:%S', true)) -%}
                {{ t }} &nbsp;&nbsp; _[{{ state.name }}](/config/automation/edit/{{ state.attributes.id }})_
            {% endif -%}
          {% endfor %}

          <details>
          <summary markdown="span">mehr…</summary>

          **Zeit &nbsp;&nbsp;&nbsp;&nbsp; Name**
          {% for state in (states.automation
            |selectattr('attributes.last_triggered', 'defined')
            | selectattr('attributes.last_triggered')
            | selectattr('state', 'ne', 'unavailable')
            | sort(attribute='attributes.last_triggered', reverse=true)) [10:40] -%}
            {% if state.attributes.last_triggered and (now() - state.attributes.last_triggered).total_seconds() < 86400 %}
              {%- set t = (as_timestamp(state.attributes.last_triggered) | timestamp_custom('%H:%M:%S', true)) -%}
                {{ t }} &nbsp;&nbsp; _[{{ state.name }}](/config/automation/edit/{{ state.attributes.id }})_
            {% endif -%}
          {% endfor %}
          </details>

7 „Gefällt mir“

hast du auch installiert?

Jetzt habe ich die Battery-state-card auch in HACS gefunden. Und schon funktioniert es. Danke!

Ich mache es auch über custom:auto-entities aber nur weil es schneller ging aber ich bin eigentlich eher Fan der Flexibilität über Jinja in einer Markdown Karte. Gespannt bin ich auch wie Du das mit den lesbaren Namen gemacht hast, sicher sind das nicht die originale sondern eine Art Mappingtabelle was aber eben auch heißen würde, man muß die bei neuen Automation immer pflegen, ein Vorteil der custom:auto-entities Karte. Magst Du Deinen Code teilen?

PS: Katze turnt :grinning: Was macht die Automatisation am Ende?

Sorry, hatte den Code vergessen einzufügen.
Das Original stammt von 123 aus dem internationalen Forum. Ich hab ihn nur angepasst.
Die Links führen zum Beabeitungsmodus der jeweiligen Automation (weil ich klickfaul bin, so spare ich mir, mich durchs Menü zu hangeln).

„Katze turnt“ lässt den Mediaplayer in der Küche miauen, dann weiß ich, dass jemand auf dem Schrank rumtappelt. Schränkt die Suche nach dem Katzengetier einkleines bisschen ein und läutet die Abendessenszeit langsam ein.

1 „Gefällt mir“

Schön :slight_smile: gefällt mir

EDIT1:
Der Code hat mich wirklich inspiriert. Diese Summary/Details Befehle kannte ich bisher nicht. Ich habe mir diese Karte erstellt und etwas individualisierbarer gemacht.

  • Anzahl Stunden
  • Anzahl Haupteinträge
  • Möglichkeit Namenskosmetik (z.B. finde “xyz” und ersetze durch “xxx”)
  • Möglichkeit bestimmte Aut. nicht anzuzeigen
  • Anzeige langer Namen begrenzen (besser auf Handy zu lesen)

Auch die Möglichkeit direkt in den Editor Modus und damit Trace zu gehen, hat richtig Charm.

Danke noch einmal für Idee und Code.

Zusammenfassung

HowTo: Markdownbkarte erstellen und diesen Code in den Inhalt kopieren.

{#
Version 2.1

Listet ausgeführte Automatisationen 
- der letzten xxx Stunden
- verschiebt ab xxx unter "mehr als" Teil
- kann Namenskosmetik vornehmen (ersetze "xyz" durch "xxx")
- kann bestimmte Automatisationen 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 = 8 -%}
<!-- Wieviel Haupteinträge (Rest über "mehr" Dialog) -->
{%- set show_always = 10 -%}
<!-- 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_aut_': '',
  'tech_': '',
  'draussen_': 'drau_',
  'unten_': 'unt_',
  'oben_': 'ob_'
} -%}
<!-- max. Zeichen Namensdarstellung -->
{%- set name_max = 30 -%}

<!-- Andere zentrale Variablen -->
{%- set ns = namespace(entries=[]) -%}
{%- set now_ts = as_timestamp(now()) -%}

<!--+++ Auslesen/Bearbeiten der Automatisationen+++ -->

{%- 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) -%}

  {# Zeitabgrenzung #}
  {%- if ts is number and (now_ts - ts < shown_last_hours * 60 * 60) -%}
    {%- set raw_name = state.name | string -%}
    {%- set name_ns = namespace(name=raw_name) -%}

    {# Ausschluß bestimmter Automatisationen #}
    {%- if (exceptions | select('in', raw_name) | list | count) == 0 -%}

      {# Ersetzen von Namensteilen #}
      {%- for old, new in name_replacements.items() -%}
        {%- set name_ns.name = name_ns.name | replace(old, new) -%}
      {%- endfor -%}
      {%- set cleaned_name = name_ns.name -%}
  
      {# Begrenzung Namenslänge #}
      {%- 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 = '' -%}
      {%- endif -%}
      {%- set ns.entries = ns.entries + [(t, cleaned_name, link)] -%}

    {%- endif -%}
  {%- endif -%}
{%- endfor -%}

<!--+++ Ausgabe: Ab hier mit Vorsicht HTML Konstrukte in Markdown sind fragil ("-%} = wichtig")+++ -->


### In den letzten {{ shown_last_hours }} Stunden
<table border=0>
  <!-- Gehe die Liste aller Automatisationen für die Hauptanzeige durch und zerlege in Zeit/Namen -->
  {%- for row in ns.entries[:show_always] -%}
    <tr>
      <td>{{ row[0] }}</td>
      <td>
        {%- if row[2] -%}
          <a href="{{ row[2] }}">{{ row[1] }}</a>
        {%- else -%}
          {{ row[1] }} <font color=gray>(ID fehlt)</font>
        {%- endif -%}
      </td>
    </tr>
  {%- endfor -%}
</table>

<!-- +++Ausgabe mehr als Einträge+++ -->
{%- if ns.entries | length > show_always -%}
<br>
<details>
  <summary><b>mehr als {{show_always}} Einträge zeigen</b></summary>
  <table border=0>
    {%- for row in ns.entries[show_always:] -%}
      <tr>
        <td>{{ row[0] }}</td>
        <td>
          {%- if row[2] -%}
            <a href="{{ row[2] }}">{{ row[1] }}</a>
          {%- else -%}
            {{ row[1] }} <font color=gray>(ID fehlt)</font>
          {%- endif -%}
        </td>
      </tr>
    {%- endfor -%}
  </table>
</details>
{%- endif -%}

EDIT2:
Nach Mittagsruhe und Kaffee nochmal den Code optiomiert/dokumentiert als Version 2.0

EDIT3:
" Uhr " wieder rausgenommen, führte tlw zu blöden Verzerrungen in der Tabelle.
Sry für Hin&Her

5 „Gefällt mir“

Ich filtere einfach die logs entsprechend. Das hat den Vorteil dass ich auch unerwartete Ereignisse sehr (Gerât wurde nicht verfügbar) allerdings gegenüber Euren Lösungen den Nachteil dass ich nicht erkennen kann, wenn eine Automatisation nicht ausgeführt wurde.

Herrlich der Briefkasten :rofl:

1 „Gefällt mir“

Toll, vielen Dank für das Teilen des Codes! Ich habe bei mir nur die Anzeige der Links rausgenomenn, weil ich sie nicht brauche, aber alles andere habe ich 1:1 übernommen. Eine Frage noch: Im Code steht ein Warnhinweis zu HTML in Markdown. Was bedeutet der konkret?

Danke, freu mich. Ich bin gerade im Urlaub und erfasse erstmals über die Karte schnell was die letzten Stunden auf Homeassi und Haus abging. Ich werde sie noch nach Rückkehr um Scripte erweitern.

Zu der Markdown und Html Warnung im Code: ich habe schon einige solcher Karten entworfen und auch im Forum veröffentlicht. Ein Leerzeichen zuviel kann so ein Layout kaputt machen, alles hängt vom Code Interpreter ab. Es ist eine Markdown Karte, die einige aber nicht alle HTML Befehle als Html interpretiert oder an den Browser weitergibt. Es gibt nur die Regel des Ausprobieren. Eine Tabelle und Font Befehle funktionieren recht gut.

Mega! Danke euch für den Code :slight_smile: Sieht gut aus und ist praktisch!

Hey, sieht von der Optik wirklich sehr cool aus.

Würdest du deinen Code evtl. sharen?

Da ist er….