Z-Wave JS - Dead Nodes - Erkennen und automatisch Ping absetzen

Seit der Z-Wave Firmware v7.21.0 für den Aeotec Z-Stick 7, habe ich leider immer wieder mit Dead Nodes zu kämpfen.
Repeater Geräte werden wirklich ohne System vereinzelt als Dead Node geführt. Mit der Folge, dass die Geräte als nicht verfügbar geführt werden und somit auch nicht bedienbar sind.
In der Regel reicht es aus, das betroffene Gerät einfach nur anzupingen und es wird wiederbelebt.

Hier mal ein paar Templates um die Dead Nodes zu erkennen, also Anzahl der Dead Nodes, eine Liste er Dead Nodes Geräte sowie einen einfache Automatisierung, die die Dead Nodes automatisch anpingt.

Template Zur Ermittlung der Anzahl (Dead Z-Wave Nodes)

{{ integration_entities('zwave_js') | select('match', 'sensor\..*node_status')| select('is_state', 'dead') | list | count }}

Einfach als Helfer (Template Sensor) anlegen. :grinning:

Liste der betroffenen Geräte:

{% set list = expand(integration_entities('Z-Wave JS') )
| selectattr("entity_id", "search", "node_status")
| selectattr('state', 'in', 'dead')
| map(attribute='name')
| list %}
{% for item in list %}
{{ "- " + item | replace("Node status", "") }}
{%- endfor %}

Ermittelt wird der Name des Sensors Node Status, mit dem Status dead . Der Name Sensor ist standardmäßig folgendermaßen aufgebaut „Geräte Name Node Status“
Die Liste der ermittelten Dead Nodes wird je Listeneintrag durchgegangen und „Node Staus“ wird durch „“ ersetzt. und einzeln pro Zeile ausgegeben.

Dieses Template verwende ich in einer Markdown Karte in Verbindung mit der conditional Karte. D.h diese wird nur angezeigt, wenn Anzahl Dead Nodes > 0 ist.

Für die Automatisierung wird der Template Sensor „Dead Z-Wave Nodes“ benötigt. dieser dient nämlich als Auslöser.

Wenn die Anzahl Dead Z-Wave Nodes für 30 s über 0 steigt.
Wird eine Benachrichtigung versendet mit der Liste der Dead Nodes
Im Anschluss wird der Service button.press ausgeführt. Mit der Liste der betroffenen Button Entitäten als Ziel.
Nach 30 s wird geprüft ob Anzahl Dead Z-Wave Nodes immer noch über 0 ist.
Und somit nicht alle Dead Nodes mit einem Ping wiederbelebt werden konnten.
Ansonsten geht die Benachrichtigung ras, dass Alle Nodes wieder Alive sind.

alias: System - Z-Wave Ping Dead Nodes
description: ""
triggers:
  - entity_id:
      - sensor.dead_z_wave_nodes
    above: 0
    for:
      hours: 0
      minutes: 0
      seconds: 30
    trigger: numeric_state
actions:
  - action: notify.xyz
    metadata: {}
    data:
      message: |
        Dead Node endekt:
        {% set list = expand(integration_entities('Z-Wave JS') )
        | selectattr("entity_id", "search", "node_status")
        | selectattr('state', 'in', 'dead')
        | map(attribute='name')
        | list %}
        {%- for item in list -%}
        {{ "- " + item | replace("Node status", "") }}
        {%- endfor -%}
      title: Z-WAVE
  - action: button.press
    metadata: {}
    data: {}
    target:
      entity_id: |
        {% set exclude_filter = ['sensor.z_stick_7_status'] %} {% set dead_node
        = expand(integration_entities('Z-Wave JS') ) | rejectattr("entity_id",
        "in", exclude_filter) | selectattr("entity_id", "search", "node_status")
        | selectattr('state', 'in', 'dead')  | map(attribute="object_id") |
        map('regex_replace', find='(.*)_node_status', replace='button.\\1_ping',
        ignorecase=False) | list %} 
        {{ dead_node }}
  - delay:
      hours: 0
      minutes: 0
      seconds: 30
      milliseconds: 0
  - if:
      - condition: numeric_state
        entity_id: sensor.dead_z_wave_nodes
        above: 0
    then:
      - action: notify.xyz
        metadata: {}
        data:
          message: |
            Leider gibt es immer noch diese Dead Nodes:
            {% set list = expand(integration_entities('Z-Wave JS') )
            | selectattr("entity_id", "search", "node_status")
            | selectattr('state', 'in', 'dead')
            | map(attribute='name')
            | list %}
            {%- for item in list -%}
            {{ "- " + item | replace("Node status", "") }}
            {%- endfor %}
            Ein Ping war leider nicht erfolgreich!
          title: Z-WAVE
    else:
      - action: notify.xyz
        metadata: {}
        data:
          title: Z-WAVE
          message: "Alle Nodes sind wieder Alive. "
mode: single
conditions: []

Damit die Automatisierung auch richtig funktioniert.
Bedarf es einer bestimmten Namenskonvention.
Das ist normalerweise out of the box gegeben, außer natürlich mann ändert diese manuell.

BSP:
sensor.alarm_gartenhaus_node_status
button.alarm_gartenhaus_ping
Es wird nach Sensoren gesucht mit dem String “node_status” im Namen und dem Status Dead
Dann wird “*node_status” gegen “*ping” ersetzt.

So wird aus sensor.alarm_gartenhaus_node_status
button.alarm_gartenhaus_ping als Entität für den Dienst button.press

Und die beiden Entitäten Node Status Sensor und der Ping Button dürfen nicht als versteckte Entitäten geführt werden.
Sondern müssen natürlich aktiviert sein.

Gruß Osorkon

1 „Gefällt mir“

Ein Hinweis für Nutzer dieser hilfreichen Codes:

Bei meiner Installation Ende August 2025 wurden die Gerätenamen automatisch um „Status des Knotens“ ergänzt. Beispiel:
sensor.rolllade_lothar_status_des_knotens

Mein Stick is noch auf der 7.20, sollte ich daher lieber das Update vermeiden? Die autom. werde ich trotzdem testen.

PS: genau wegen der Z-Wave Themen, habe ich mich hier wieder angemeldet. Vielen Dank dafür

Edit: ggf. wurde dein Problem in einer spätern FW behoben. Software Release Notes

Ich habe jetzt schon länger die Z-Station am Start mit
FW: v7.42
SDK: v7.21.3

Habe schon länger keine Probleme mehr mit Dead Nodes.
Am Wochenende soll der ZWA-2 ankommen. Mal schauen wie sich dieser so schlägt.

Gruß Osorkon

sehe gerade die Warnung.

Leider sehe ich keine Möglichkeit, den Stick per Z-Wave UI zu upgraden.

edit: Ok. ging nicht über die Node selbst, sondern direkt übers hauptmenü