@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: Temperaturalarm
Wenn 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 starten
Jetzt 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)