NEWS
SOLVED ZigBee-Geräte überwachen
-
Hallo liebes Forum,
ich habe eine Frage: auf welche ich derzeit noch keine Antwort gefunden habe.
Ich würde sehr gerne alle meine Zigbeegeräte am Zigbeeadapter (via CC2531-Stick) überwachen.
Ich meine damit, dass ich gerne benachrichtigt werden würde, wenn eines der Geräte über einen längeren Zeitraum nicht erreichbar war.
Hat dafür jemand eine Lösung?Vielen herzlichen Dank im Voraus,
Liebe Grüße
Sebastian -
Für alle Interessierten:
Ich konnte mein Problem nun mit folgenden Skriptadaptierungen lösen:
createState('zigbeestatus.Anzahl_Geräte', 0, {type: 'number'}); createState('zigbeestatus.offline', 0, {type: 'number'}); createState('zigbeestatus.Gerät', " ", {type: 'string'}); const zigbee = $('zigbee.0*.link_quality'); const loggen = true; var arrOFFLINE; function offline(id){ var obj = getObject(id); arrOFFLINE.push(obj.common.name); if(loggen) log("Gerät: " + obj.common.name); } function countOffline() { var moeglicheOFFLINE = 0; arrOFFLINE =[]; zigbee.each(function (id, i){ if(Math.round((new Date() - new Date(getState(id).ts)) / 1000 / 60) > 60) offline(id); ++moeglicheOFFLINE; }); if(loggen) log("Text: "+arrOFFLINE.join(', ')); if(loggen) log("Anzahl Geräte: " + moeglicheOFFLINE + " // davon offline: " + arrOFFLINE.length); setState("zigbeestatus.Gerät", arrOFFLINE.join(',<br>')); setState("zigbeestatus.offline", arrOFFLINE.length); setState("zigbeestatus.Anzahl_Geräte", moeglicheOFFLINE); } countOffline();
Es werden nun die Geräte gezählt, bei denen der link_quality-Timestamp älter ist als 60 Minuten.
LG Sebastian
-
@sebastian0010
Es gibt dafür zwei einfache Möglichkeiten:- alle Objekte die „Router“ funktionalität haben besitzen einen datenpunkt „alive“ oder ähnlich (bin nicht zu Hause, kann nicht schauen)
- bei allen anderen Objekten kannst du den Zeitstempel der link-quality überwachen. Diese wird immer dann aktualisiert wenn mit dem Gerät kommuniziert wird,
A.
-
Vielen Dank für die rasche Antwort!
Das mit den Routern funktioniert schon perfekt!
Kannst du mir auch sagen, wo ich den Zeitstempel bei den andren Geräten bei lik-quality abrufen kann? Habe den Expertenmodus in den Objekten aktiv, kann diesbezüglich aber keine Infos anzeigen.Liebe Grüße
Sebastian -
Bzw. hat jemand von euch schon ein Skript, dass alle Datenpunkte link_quality unter Objekte ausliest und nach beliebiger Zeit alarmiert, wenn ein Datenpunkt nicht mehr geändert wurde?
LG
Sebastian -
Hi Sebastian,
beschäftigte dich mit JavaScript
Geht ganz einfach.Hier ein Beispiel, brauchst nur deinen Datenpunkt in der ersten Zeile eintragen:
const STATE_PATH = 'zigbee.0.xxxxxxxx.link_quality'; const DIFFERENCE_MIN = 60; // Mindest-Zeit in Minuten, die das Gerät nicht mehr erreichbar war. let stateDt = new Date(getState(STATE_PATH).ts); // Zeitstempel in Datums-Objekt umgewandelt log ('Letzte Änderung Datum/Uhrzeit:' + stateDt); // Log-Ausgabe log ('Letzte Änderung war vor ' + Math.round((new Date() - stateDt) / 1000 / 60) + ' Minuten.') if ( dateAddMinutes(stateDt, DIFFERENCE_MIN) < new Date() ) { log ('Letzte Änderung war vor länger als ' + DIFFERENCE_MIN + ' Minuten.') // Hier kannst du reagieren, da letzte Änderung länger als gewünschte Anzahl Minuten her war. } else { log ('Letzte Änderung war vor weniger als ' + DIFFERENCE_MIN + ' Minuten.') } /** * Add certain number of minutes to a given date/time. * @param {object} dateInp Date created with "new Date()". If you want the current date, use "new Date()" * @param {number} minutesInp Number of minutes to be added to the given date. * @return {object} New date with the minutes added */ function dateAddMinutes(dateInp, minutesInp) { return new Date(dateInp.getTime() + (minutesInp * 60000)); }
-
Vielen Dank euch beiden für die Infos!
Das mit dem Skript funktioniert schon wunderbar. Bei Javascript bin ich leider noch blutiger Anfänger.
Werde versuchen mir übers Wochenende ein Skript zu basteln, womit ich alle Zigbeegeräte automatisiert auslese und mir eine Info pushen lasse, falls - und wenn ja, welches - ein Gerät längere Zeit nicht reagiert hat. Mal schauen ob das klappt.Schönes Wochenende und Liebe Grüße!
-
Liebe Leute,
habe jetzt folgendes Skript anhand eines Batterieskriptes, welches ich vor längerer Zeit online gefunden habe versucht zu adaptieren, um den Timestamp auszulesen.
Es soll die Anzahl an Geräten die offline sind (Deshalb 3600000 als ms für 60min), sowie der Name der entsprechenden Geräte angezeigt werden - alle Zigbeegeräte durchgehen.
Prinzipiell werden mir hier zwar Geräte ausgespuckt, aber die Definition mit 3600000 passt anscheinend leider noch nicht genau.
Hat hier jemand Lösungsvorschläge?createState('zigbeestatus.Anzahl_Geräte', 0, {type: 'number'}); createState('zigbeestatus.offline', 0, {type: 'number'}); createState('zigbeestatus.Gerät', " ", {type: 'string'}); const zigbee = $('zigbee.0*.link_quality'); const loggen = true; var arrOFFLINE; function offline(id){ var obj = getObject(id); arrOFFLINE.push(obj.common.name); if(loggen) log("Gerät: " + obj.common.name); } function countOffline() { var moeglicheOFFLINE = 0; arrOFFLINE =[]; zigbee.each(function (id, i){ if(getState(id).ts > 3600000) offline(id); ++moeglicheOFFLINE; }); if(loggen) log("Text: "+arrOFFLINE.join(', ')); if(loggen) log("Anzahl Geräte: " + moeglicheOFFLINE + " // davon offline: " + arrOFFLINE.length); setState("zigbeestatus.Gerät", arrOFFLINE.join(',<br>')); setState("zigbeestatus.offline", arrOFFLINE.length); setState("zigbeestatus.Anzahl_Geräte", moeglicheOFFLINE); } countOffline();
Vielen Dank euch gleich im Voraus,
Liebe Grüße
Sebastian -
Habe heute noch mit
var time = getState('zigbee.0.xxxxxxxxxxx.link_quality').ts;
den Wert von ts geloggt, wobei dann Werte um 1600000000000 (also etwa 50 Jahre) angezeigt werden. Lt. Manual sollte es doch in ms ausgegeben werden (seit jetzt nehme ich mal an)? Mit dem tatsächlichen Datumswert stimmt der angegebene Wert in ms jedoch leider gar nicht ein.
Kann mir hier jemand helfen?Dank gleich mal,
Liebe Grüße
Sebastian -
Für alle Interessierten:
Ich konnte mein Problem nun mit folgenden Skriptadaptierungen lösen:
createState('zigbeestatus.Anzahl_Geräte', 0, {type: 'number'}); createState('zigbeestatus.offline', 0, {type: 'number'}); createState('zigbeestatus.Gerät', " ", {type: 'string'}); const zigbee = $('zigbee.0*.link_quality'); const loggen = true; var arrOFFLINE; function offline(id){ var obj = getObject(id); arrOFFLINE.push(obj.common.name); if(loggen) log("Gerät: " + obj.common.name); } function countOffline() { var moeglicheOFFLINE = 0; arrOFFLINE =[]; zigbee.each(function (id, i){ if(Math.round((new Date() - new Date(getState(id).ts)) / 1000 / 60) > 60) offline(id); ++moeglicheOFFLINE; }); if(loggen) log("Text: "+arrOFFLINE.join(', ')); if(loggen) log("Anzahl Geräte: " + moeglicheOFFLINE + " // davon offline: " + arrOFFLINE.length); setState("zigbeestatus.Gerät", arrOFFLINE.join(',<br>')); setState("zigbeestatus.offline", arrOFFLINE.length); setState("zigbeestatus.Anzahl_Geräte", moeglicheOFFLINE); } countOffline();
Es werden nun die Geräte gezählt, bei denen der link_quality-Timestamp älter ist als 60 Minuten.
LG Sebastian