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

Alles über Z-Wave. Und die unterschiedlichen Z-Wave Integrationen.


Antworten
Benutzeravatar
Osorkon
Administrator
Beiträge: 1953
Registriert: Sa 17. Jul 2021, 16:53
2
Wohnort: Langenargen
Has thanked: 61 times
Been thanked: 530 times
Kontaktdaten:

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

Beitrag von Osorkon »

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, einen 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)

Code: Alles auswählen

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

Einfach als Helfer (Template Sensor) anlegen. :D

Liste der betroffenen Geräte:

Code: Alles auswählen

{% 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.

Code: Alles auswählen

alias: System - Z-Wave Ping Dead Nodes
description: ""
trigger:
  - platform: numeric_state
    entity_id:
      - sensor.dead_z_wave_nodes
    above: 0
    for:
      hours: 0
      minutes: 0
      seconds: 30
condition: []
action:
  - service: 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
  - service: 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:
      - service: 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:
      - service: notify.xyz
        metadata: {}
        data:
          title: Z-WAVE
          message: "Alle Nodes sind wieder Alive. "
mode: single

EDIT:

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

Einer muss ja für Ordnung sorgen. :D
Antworten