Wann wurde HA / Raspi die letzten Male vom Strom getrennt und neu gestartet?

Aktualisierter Code ersetzt den von oben

Moin
Es war am Wochenende mal wieder soweit. HA/Raspi stand still und konnte nur durch Strom ab- und anschalten reanimiert werden. Und ich dachte, guter Test für obige Automatisation … aber es wurde kein Strombedingter HA Neustart erkannt, hm.

Also, nochmal Code überarbeitet und diesmal mit Software-reboot und auch wenn es weh tat mit Strom im laufendem Betrieb abgeschaltet.

Automatisation (startet vor dem HA Herunterfahren und nach dem Hochfahren)

Zusammenfassung
alias: om_aut_tech_ha_strom_aus_neustart_time_recording
description: >-
  ## Speichert und liest das Datum/Zeit des letzten Neustarts und vergleicht
  Zeiten


  - Eigentlich liefert sensor.system_monitor_last_boot bereits diese Information
  aber ältere Info überlebt recorder purge nicht

  - Sofern system_monitor_last_boot vorhanden, werden Zeiten verglichen

  - Ansonsten wird geprüft ob ein normales Herunterfahren vor dem Neustart
  innerhalb von 2 Min stattfand
triggers:
  - event: shutdown
    trigger: homeassistant
    id: NormalesHerunterfahren
  - event: start
    trigger: homeassistant
    id: Hochfahren
conditions: []
actions:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - NormalesHerunterfahren
        sequence:
          - action: input_datetime.set_datetime
            metadata: {}
            data:
              datetime: "{{now()}}"
            target:
              entity_id: input_datetime.ha_zeit_von_normalem_herunterfahren
          - action: notify.gmxolaf3
            metadata: {}
            data:
              title: >-
                {{states.sensor.uhrzeit_momentan_formatiert_hh_mm.state}} HA
                normal heruntergefahren (Zeit weurde gespeichert)
              message: >-
                {{states.sensor.uhrzeit_momentan_formatiert_hh_mm.state}} HA
                normal heruntergefahren (Zeit weurde gespeichert)
      - conditions:
          - condition: trigger
            id:
              - Hochfahren
        sequence:
          - if:
              - condition: template
                value_template: >
                  {#

                  True = normales Herunterfahren

                  False = Stromausfall bedingtes Herunterfahren

                  #}

                  {% set time_for_restart_sec = 120 | int %}

                  {% set shutdown_normal =
                  as_local(as_datetime(states('input_datetime.ha_zeit_von_normalem_herunterfahren')))
                  %}

                  {% set ha_start =
                  as_local(as_datetime(states('sensor.uptime'))) %}

                  {% set hw_raw = states('sensor.system_monitor_last_boot') %}

                  {% set valid_hw_starttime = (hw_raw |
                  as_datetime(default=false)) is not false %}


                  {# System_monitor_last_boot ist valide #}

                  {% if valid_hw_starttime %}
                    {% set ha_start_hw = as_local(as_datetime(hw_raw)) %}
                    {% set is_normal_restart = (ha_start_hw < shutdown_normal < ha_start) %}
                  {# 

                  System_monitor_last_boot ist nicht valide aber shutdown_normal
                  ist < ha_start < 120 s

                  Annahme: Es wurde normal gestartet

                  #}

                  {% else %}
                    {% set is_normal_restart = (
                        (ha_start - shutdown_normal).total_seconds() | int < time_for_restart_sec
                    ) %}
                  {% endif %}

                  {{ is_normal_restart }}
            then:
              - action: notify.gmxolaf3
                metadata: {}
                data:
                  title: >-
                    {{states.sensor.uhrzeit_momentan_formatiert_hh_mm.state}} HA
                    gestartet nach normalem Herunterfahren
                  message: >-
                    {{states.sensor.uhrzeit_momentan_formatiert_hh_mm.state}} HA
                    gestartet nach normalem Herunterfahren
            else:
              - action: notify.gmxolaf3
                metadata: {}
                data:
                  title: >-
                    {{states.sensor.uhrzeit_momentan_formatiert_hh_mm.state}} HA
                    gestartet nach Stromausfall !!!
                  message: >-
                    {{states.sensor.uhrzeit_momentan_formatiert_hh_mm.state}} HA
                    gestartet nach Stromausfall
              - action: input_text.set_value
                metadata: {}
                data:
                  value: >-
                    {#speichert 10 Zeitstrings im Format "2025-10-10 10:10;"#}

                    {% set number_of_entries = 10 %} {#achte auf 255
                    Beschränkung#}

                    {% set raw = states('input_text.homeassi_hardware_starts')
                    %}

                    {% set new_entry =
                    as_local(as_datetime(states('sensor.system_monitor_last_boot'))).strftime('%Y-%m-%d
                    %H:%M') %}

                    {% if not raw or raw == '' %}
                      {{ new_entry ~ ';' }}
                    {% else %}
                      {% set existing = raw.split(';') | reject('equalto', '') | list %}
                      {% if existing | length >= number_of_entries %}
                        {% set existing = existing[1:] %}
                      {% endif %}
                      {{ (existing + [new_entry]) | join(';') ~ ';' }}
                    {% endif %}
                target:
                  entity_id: input_text.homeassi_hardware_starts
                enabled: true
mode: single

  • Zeit Helfer input_datetime.ha_zeit_von_normalem_herunterfahren muß angelegt werden
  • Text Helfer input_text.homeassi_hardware_starts muß angelegt werden
  • Die Email Benachrichtigungen könnt Ihr rausnehmen, ist ein Art Debugging für mich

Markdown-Karte

Zusammenfassung
type: markdown
content: >
  {% set raw = states('input_text.homeassi_hardware_starts') -%}

  {% set eintraege = raw.split(';') -%}

  {% set eintraege = eintraege | map('trim') | select('string') |
  reject('equalto', '') | reverse | list -%}

  {% for eintrag in eintraege[-10:] -%}
    {% set ts = strptime(eintrag, '%Y-%m-%d %H:%M') -%}
    {% set diff = (now().replace(tzinfo=None) - ts).days -%}
  - {{ ts.strftime('%d.%m um %H:%M Uhr') }} (vor {{ diff }} Tag{{ 'en' if diff
  != 1 else '' }})

  {% endfor %}
title: Die letzten 10 Strom-Aus Neustarts

1 „Gefällt mir“