NEWS
Datetime für VIS auswerten
-
Servus,
ich benötige mal wieder eure Hilfe. Ich habe für meine Zigbee Geräte ein Skript laufen, welches den Zeitpunkt der letzten Änderung in einem Datenpunkt speichert. Nun würde ich gern in meinem VIS farblich darstellen, wenn der letzte Änderungszeitpunkt der Temperaturfühler länger als bspw. 8h zurück liegt.
Wie würdet ihr da ran gehen? Ich habe versucht im Alias Adapter über die Konvertierungsfunktion einen Datenpunkt "Valid" zu erzeugen, der "true" ist, wenn der Zeitpunkt passt. Leider ohne Erfolg.
Ich stehe auf dem Schlauch. Es gibt bestimmt unzählige Lösungen, aber die die mir einfallen gelingen mir nicht. Entweder als weiteren Datenpunkt, oder direkt in VIS. -
@init5 Ich halte nichts davon über Zeitstempel zu rechnen. Ich würde lieber in Deiner Logikmaschine einen Trigger starten, wenn eine Änderung vorkommt und Alarm zu schlagen, wenn keine Änderung/Aktualisierung vorkommt. In Node-Red machst Du das mit dem Trigger - gibt aber auch Blocklies mit Timern.
-
@init5 sagte: wenn der letzte Änderungszeitpunkt der Temperaturfühler länger als bspw. 8h zurück liegt.
Vorschlag:
-
@paul53 Sorry für die späte Antwort. Ich habe immer ein Problem mit diesen Skripten. Ich weiß nicht wie ioBroker damit umgeht, aber für meine Verständnis laufen dann die Skripte über die gesamte Dauer. Das erscheint mit nicht sehr effizient. Macht das dem System nichts aus, wenn mehrere dieser Skripte laufen? Ich habe bisher immer versucht meine Skripte kurz zu halten. Also Start --> prüfen --> Ende.
-
@init5 sagte in Datetime für VIS auswerten:
Also Start --> prüfen --> Ende.
skripte lauern immer im Hintergrund auf die Trigger.
-
@thomas-braun Wie verhält sich das Skript bei einem Neustart? Wird das Timeout dann unterbrochen, oder läuft es beim nächsten Triggerzeitpunkt weiter, wenn das System dann gestartet ist?
-
@init5 sagte in Datetime für VIS auswerten:
Wie verhält sich das Skript bei einem Neustart?
Neustart von was?
-
@init5 sagte: Wie verhält sich das Skript bei einem Neustart?
Das Timeout wird gelöscht und beim nächsten Trigger neu gestartet.
-
@init5 said in Datetime für VIS auswerten:
@paul53 Sorry für die späte Antwort. Ich habe immer ein Problem mit diesen Skripten. Ich weiß nicht wie ioBroker damit umgeht, aber für meine Verständnis laufen dann die Skripte über die gesamte Dauer.
Normale Skripte laufen nur 1 Mal...nämlich beim Starten des Brokers. z.B. zum Initialisieren von irgendwelchen Werten o.ä.
Wenn Du jedoch einen "Trigger" einbaust, dann meldet sich Dein Skript am System bei einem Eventhandler an und sagt diesem: "Starte meine angegebene Callback-Funktion und übergieb dieser bestimmte Daten , wenn ein bestimmtes Ereignis eingetreten ist. (z.B. eine Wertänderung bei einem Knoten oder Ablauf eines Timers). Das eigentliche Skript läuft also nicht weiter sondern wartet im Hintergrund darauf, dass es vom Eventhandler erneut aufgerufen wird (nicht das komplette Skript sondern nur die jeweis übergebene Callback-Funktion).Nur als kleines Beispiel:
on({id: "mqtt.0.esp32.temperature", change: "ne"}, async function (obj) { var value = obj.state.val; // hier können weitere Anweisungen innerhalb der Callback-Funktion stehen } );
bedeutet
on {(Ereignis}, rufe meine asynchrone Funktion "function(obj)" auf und übergieb ihr als Parameter das Objekt, in dem das Ereignis stattfand.})
Auf dieses Objekt kann man dann innerhalb der Funktion problemlos zugreifen
var value = obj.state.value;Jetzt zu Deinem eigentlichen Problem mit der Überprüfung des Temperatursensors:
Wie oben gerade gesagt, reagieren die Trigger nur bei "Veränderungen" (welcher Art auch immer) und rufen entsprechende Routinen (callback-Funktionen) auf. Aber genau das hast Du ja eben nicht! Es verändert sich ja nichts...
Du bräuchtest also quasi so eine Art "timeout" Funktion, die aufgerufen wird, wenn sich ein Meßwert z.B. über 8 Std nicht verändert (bzw aktualisiert) hat.Ich selber beschäftige mich jetzt erst ein paar Wochen mit dem Broker und weiß nicht, ob das Developer Team sowas evtl bereits umgesetzt (programmiert) hat
Daher würde ich für so eine Überwachung auf einen Timer zurückgreifen, der alle paar Minuten überprüft, ob meine Meßdaten aktualisiert wurden oder ob z.B. ein Meßfühler ausgefallen ist.
Je nach Wichtigkeit könnte dann sogar eine Alarmmeldung rausgeschickt werden (z.B. e-mail oder Telegram o.a.)
Damit das aber auch im VIS angezeigt wird, würde ich mir einen User-definierten Alarm-Knoten einrichten, der nur true oder false enthält.Bsp:
Neues Objekt hinzufügen: 0_userdata.0.Temperaturalarm
parent: 0_userdata.0
Typ: Datenpunkt
Zustandstyp: boolean
Name: TemperaturalarmWenn man diesen neuen Knoten anlegt, bekommt er vom System sofort den default-Wert: false...
In diesem Knoten wird dann vom Timer regelmäßig abgelegt, ob der Messfühler noch aktiv ist (Alarm=false) ...wenn nicht, wird der Wert "true" gesetzt, was einem Alarm gleichkommt.
Der Timer:
interval = setInterval(async function () {}, 60000); //alle 60000 ms = 1 Min startenJetzt nur noch die Funktion "füllen":
Das Script sieht dann später so aus:var interval; // Describe this function... async function getTimeDiffMin() { var aktDateTime= new Date(); return (aktDateTime.getTime() - getState("mqtt.0.esp32.temperature").ts)/1000/60; } interval = setInterval(async function () { if (await getTimeDiffMin() >= 1) { setState("0_userdata.0.Temperaturalarm"/*Temperaturalarm*/, true, true); } else { setState("0_userdata.0.Temperaturalarm"/*Temperaturalarm*/, false, true); } }, 60000);
oder das Blockly:
Somit kann man im Blocly einstellen, in welchem Intervall geprüft wird und wie groß die 'Zeitspanne maximal sein darf... (jeweils in Minuten)