Zigbee watchdog

Die Zigbee-Sensoren haben meistens Batterien inne. Es wäre wünschenswert, einen Watchdog-Skript zu haben, um zeitig zu alarmieren wenn die Batterie abfällt oder der Sensor nicht mehr online ist. Gibt es sowas bereits? Wenn nicht, wie kann man das am besten implementieren?

Servus
Suche nach dem Watchdog Modul. Damit kannst du überwachen ob eine Variable in einem definiertem Intervall aktualisiert wurde.
Batteriestatus: Trigger ein Script auf „Wert-kleiner-als“

gruß
bb

Ich mach das mit einer MySQL Datenbank und baue daraus eine HTML Tabelle auf. Ich verwende DeconZ und das entsprechende Modul. Aus der Configurator Instanz bekomme ich alle Informationen die ich brauche. Auch ob eine Batterie vorhanden ist oder nicht. Ob ich das Gerät in IPS verwende usw. Das hat den Vorteil, dass ich mich nicht darum kümmern muss, sollte mal ein neuer Sensor oder Taster dazukommen. Er wird einfach mit aufgenommen.
Ich kopier dir meinen Code hier mal rein. Das wird bei dir sicher nicht passen (schon alleine wegen MySQL) aber es sollte hoffentlich möglich sein, meine wirren Gedanken einigermaßen nachvollziehen zu können.

//Zigbee Statusupdate
$zigbeedevices=json_decode(IPS_GetConfigurationForm (22672),true); //Instanz vom ZigBee Configurator
$zigbeedevices=$zigbeedevices["actions"][0]["values"];
$sqlserver=getvalue(59311);
$user=getvalue(41755);
$password=getvalue(17356);
$database=getvalue(33225);
$dbhandler=mysqli_connect($sqlserver,$user,$password,$database);
//Tabelle löschen
mysqli_query($dbhandler,"truncate zigbee");
$zigbeeanzahl=0;
foreach ($zigbeedevices as $device)
{ 
    $zigbeeanzahl++;
    if (strpos($device["name"], "Gruppe") == false and $device["Manufacturer"] != "Phoscon")
    {
        $batterievorhanden=0;
        $batterie=0;
        $maxupdate=0;
        $instanzstatus=1;
        $inips=0;
        if ($device["instanceID"]>0)
        {
            $instanzid=$device["instanceID"];
            $inips=1;
            if (!Z2D_isReachable($device["instanceID"])) $instanzstatus=0;
            foreach(IPS_GetChildrenIDs($device["instanceID"]) as $variable)
            {
                $maxupdate=max(IPS_GetVariable($variable)['VariableUpdated'],$maxupdate);
                if (IPS_GetName($variable)=="Batterie")
                {
                    $batterie=getvalue($variable);
                    $batterievorhanden=1;
                }
            }
        }
        else
        {
            $instanzid=0;
            $instanzstatus=1;
            $inips=0;
        }
        mysqli_query($dbhandler,
        "insert into zigbee (instanzid,name,hersteller,modell,detailtyp,typ,batterievorhanden,batterie,status,lastupdate,inips,deviceid) values ('".
        $instanzid."','".
        $device["name"]."','".
        $device["Manufacturer"]."','".
        $device["modelID"]."','".
        $device["DetailType"]."','".
        $device["DeviceType"]."','".
        $batterievorhanden."','".
        $batterie."','".
        $instanzstatus."','".
        date("Y-m-d H:i:s",$maxupdate)."','".
        $inips."','".
        $device["DeviceID"].
        "')");
    }
}


$zigbeestatusfehler=false;
$zigbeebatteriewarnung=false;
$zigbeebatteriefehler=false;
$zigbeeanzahl=0;
if (getvalue(48670) != "")
{
    $where = "where name like '%".getvalue(48670)."%'";
}
else
{
    $where="";
}
$zigbeedevices= mysqli_query($dbhandler,"select * from zigbee ".$where." order by ".getvalue(55882)." ".getvalue(45530));
$Status_HTML="";
$Status_HTML=$Status_HTML."<table class=\"wwx\" border=\"1\" style=\"width:100%\">";
$Status_HTML = $Status_HTML."<tr>";
$Status_HTML = $Status_HTML."<thead class=\"blue\">
                             <th><center>Gerät</center></th>
                             <th><center>Hersteller</center></th>
                             <th><center>Modell</center></th>
                             <th><center>Typ</center></th>
                             <th><center>Detail</center></th>
                             <th><center>Batterie</center></th>
                             <th><center>Update</center></th>
                             </thead>";
$Status_HTML = $Status_HTML."</tr>";
while($device = mysqli_fetch_object($zigbeedevices))
{
    $zigbeeanzahl++;
    $Status_HTML = $Status_HTML."<tr>";
    if ($device->status == 1)
    {
        $Farbe="green";
    }
    else
    {
        $Farbe="red";
        $zigbeestatusfehler=true;
    }
    $Status_HTML = $Status_HTML."<td style=\"background-color:".$Farbe."\"><center>".$device->name."</center></td>";
    
    if ($device->inips == 1) $Farbe="blue";
    else $Farbe="";
    $Status_HTML = $Status_HTML."<td style=\"background-color:".$Farbe."\"><center>".$device->hersteller."</center></td>";
    
    $Status_HTML = $Status_HTML."<td><center>".$device->modell."</center></td>";
    $Status_HTML = $Status_HTML."<td><center>".$device->typ."</center></td>";
    $Status_HTML = $Status_HTML."<td><center>".$device->detailtyp."</center></td>";
    $batterievorhanden=$device->batterievorhanden == 1;
    if ($device->batterievorhanden == 1)
    {
        if ($device->batterie>=0 and $device->batterie<=10)
        {
            $Farbe="red";
            if (!$zigbeebatteriefehler) $zigbeebatteriefehler=true;
        }
        if ($device->batterie>=11 and $device->batterie<=40)
        {
            $Farbe="orange";
            if (!$zigbeebatteriewarnung) $zigbeebatteriewarnung=true;
        }
        if ($device->batterie>=41 and $device->batterie<=100)
        {
            $Farbe="green";
        }
    }
    if ($batterievorhanden) $Status_HTML = $Status_HTML."<td style=\"background-color:".$Farbe."\"><center>".$device->batterie."%</center></td>";
    else $Status_HTML = $Status_HTML."<td><center>Dauerstrom</center></td>";
    
    if ($device->inips == 1) $lastupdate=date("d.m.Y H:i:s",strtotime($device->lastupdate));
    else $lastupdate="";
    $Status_HTML = $Status_HTML."<td ><center>".$lastupdate."</center></td>";
    $Status_HTML = $Status_HTML."</tr>";
}
$Status_HTML=$Status_HTML."</table>";
setvalue(24262/*Statusvariable für die Anzeige*/,$Status_HTML);
IPS_SetName(11169,"Gerätestatus ".$zigbeeanzahl." Geräte");
mysqli_close($dbhandler);

Oder der Variablenüberwachung. :smiley:
Jetzt neu in der Beta mit Aktionen.
Werbung Ende :laughing:

Michael

Nutze im Moment noch das Watchdog-Modul, werde mir aber mal gerne die Variablen-Überwachung ansehen.

Nutze zur Überwachung die Aktualisierung der Sendestärke bei den einzelnen Aktoren. Habe festgestellt, dass das für mich zuverlässiger funktioniert. In IPSStudio hab ich es dann so verarbeitet:



(Sind in dem Fall Aktoren, die ich nach nem kompletten Neustart von z2m neu anlernen muss, also nicht meckern. :rofl:

Gruß
Burkhard

Hi,
ich würde WatchDog nicht aber Batterie ansetzen denn da geschehen merkwürdige Sachen. Bei mir haben Sensoren schon nicht mehr funktioniert obwohl der letzte Stand der Batterie bei 43% war. Ich würde Verbindungsqualität nehmen denn die wird regelmäßig aktualisiert und ändert sich im Normalfall auch.

Z2M, falls Du das benutzt, hat auch eine Überwachungsmöglichkeit Device-Availability | Zigbee2MQTT aber damit habe ich mich noch nicht beschäftigt.

Ralf

@HarmonyFan

Mit der Device-Availability Funktion wäre ich vorsichtig. Wenn ic das für alle Batterie-Geräte bei mir aktiviere, verlangsamt das die Zigbee2mqtt Kommunikation bis hin zum Stillstand (worauf Koen auch hinweist).

Wie Du schon schreibst, auch bei mir nutze ich die Verbindungsqualität (Sendestärke, Sendeleistung,etc.) und fahre damit sehr gut. Das Phänomen der unberechenbaren Batterie-Meldung war da auch bei mir der Grund.

Gruß
Burkhard

Ja, das die Batteriestand Meldungen fürn Kübel sind unterschreibe ich auch für zWave.
Kompletter Quatsch der Wert.
Mal ist angeblich leer, der Node arbeitet aber noch wochenlang. Mal war die letzte Meldung 70%, dann ist der Node weg.

Besser ist den Watchdog auf Variablenaktualisierung zu setzen. Das läuft gut.

gruß
bb

Hi,
je nach Modul kann Variablenaktualisierung auch daneben gehen. Es gibt Module die schauen ob sich was geändert hat und erst dann wird geschrieben, d.h. Änderung und Aktualisierung sind dann gesetzt. Dieses Vorgehen hat auch einen Sinn denn Lesen/Vergleichen ist deutlich schneller als Schreiben wenn sich der Wert nicht so oft ändert.

Ralf

Wie häufig soll die Aktualisierung typischerweise erfolgen?

Wie oft aktualisiert wird hängt wohl von deinen Geräten ab.
Wenn di zb. einen Türsensor hast, aber niemand zu Hause ist so wird sich die Statusvariable auch nicht aktualisieren.
Andererseits gibt es Geräte welche in festen Zeitabständen Daten senden, und wieder andere senden wenn sie abgefragt werden.
Bei mir (zWave) hat sich das 3-5 fache des typischen Aktualisierungsintervalls pro Gerätegruppe bewährt.

gruß
bb

1 „Gefällt mir“

ich komme mir sehr dumm vor - aber ich sehe keine Variable „Signalintensität“. Das Zigbee-Modul kreiert nur das bei mir:

Dann nimm doch einfach die Temperatur-Variable und achte auf Aktualisierung. Wie oft aktualisiert er denn die Temperatur? Und daraus den Zeitraum errechnen (meinetwegen, er sendet alle 10 Minuten, dann würde ich den Watchdog z.B. auf 30 Minuten setzen).

Gruß
Burkhard

Das hängt vielleicht auch vom Sensor ab, was siehst du denn im Z2M?

Bei mir liefern eigentlich alle Sensoren LQI bzw. Verbindungsqualität, wobei die teilweise (sehr) selten aktualisiert wird.
grafik

Allerdings hat der Wassermeldung am 09.08.22 das letzte Mal Daten geliefert. Scheinbar also alle 7 Tage, falls ich morgen um 16:07 wieder mal Daten bekomme :see_no_evil:.

Ich nutze aber auch das Zigbee2MQTT Modul von KaiS. Du nutzt scheinbar die andere Variante Z2D…, die möglicherweise nicht alle Daten im Symcon auswertet. Dazu müsste dann @Silberstreifen etwas sagen.

Ich verstehe das Problem leider noch nicht…
Das Modul zeigt den Batteriestatus an und, wenn du es möchtest, auch den Onlinestatus. Was brauchst du mehr?

wenn ich richtig verstehe, meinen einige Diskussionsteilnehmer, dass der Batteriestatus unzuverlässig ist und dass die Signalstärke besser mit dem Leistungsabfall der Batterie korreliert. Ich habe keine direkte Erfahrung damit, ich lasse mich von Euch ja beraten.

Ich nutzen nicht den Conbee-Stick mit Dekonz, von daher kann ich nicht sagen, ob Deconz den LQI mit sendet.

Bei zigbee2mqtt wird der LQI mitgesendet, der sich regelmäßig über die Exposes aktualisiert. Das ist zuverlässsiger, als die Batterie-Meldung. Bei dem Screenshot von @aag ist der LQI aber nicht enthalten. Somit kann er ihn natürlich auch nicht für den Watchdog nutzen.
Bei zigbee2mqtt wird der LQI als Variable angegeben und ist damit abgreifbar:
image

Darum geht es hier gerade.

Gruß
Burkhard

ok, danke für die Erklärung. Habe ich dich richtig verstanden? Die Verbindungsqualiät wird von DeConz nicht gesendet? Das Problem liegt also nicht in meinem Modul? Ansonsten mir einfach den empfangenen String aus dem Debug schicken. Dann gucke ich mir das an.
Grüße
Jürgen

Kann ich nicht beantworten, da ich DeConz nicht nutze. Das müsste wer machen, der Deconz nutzt.

Gruß
Burkhard

ich habe deconz, weil ich nicht wusste dass es eine Alternative gibt. Soweit ich sehen kann gibt Deconz keine Feldstärke an, auch nicht in der Phoscon Web-App.