NEWS
Zwei-Punkt Regler (Hysterese)
-
Hallo zusammen,
ich habe einen Regensensor von mySensors an ioBroker angeschlossen und überführe den Status per JS in eine Variable "Regen_aktuell".
Bei einem Test habe ich nun festgestellt, dass der Regler im Übergang ziemlich oft zwischen "kein Regen" und "Regen" wechselt (digitaler Wert). Daher wollte ich nun per JS einen Zwei-Punkt Regler oder Hysterese einsetzten.
Bin nur ziemlich ratlos wie sowas in JS aussieht.
Viele Grüße
Trident
-
-
Hallo,
ich würde da anders skripten. Ein altes Beispiel aus dem Forum prüft, ob die letzte Sayit Ansage gerade eben oder schon länger her ist, um doppelte Ansagen zu vermeiden. Im Falle des Regensensors passt das, als ja keine Mengenwerte (Regenmenge oder so) gemessen werden, sondern nur die Ausgabe true/false etwas beruhigt werden soll.
Deshalb mein Vorschlag:
var idRegensensor = 'xxxxxxxxxxx'; // Objekt Regensensor, das true/false liefert, eintragen var updateZeit = 3; // Dauer in s, innerhalb der keine Updates angenommen werden var lastUpdate = null; on(idRegensensor, function(obj) { if (!lastUpdate || ((new Date()).getTime() - lastUpdate) > 1000 * parseInt(updateZeit, 10)) { lastUpdate = (new Date()).getTime(); log(obj.state.val); // ersetzen durch neuen Befehl zB setState(Variable für Regensensor, obj.state.val); } });
Ist keine echte Hysterese, hat aber den gleichen Effekt. Schließlich gibt es keinen Wert zwischen false und true.
Gruß
Pix
-
@pix:sondern nur die Ausgabe true/false etwas beruhigt werden soll. `
Dass es sich um einen binären Wert handelt, habe ich überlesen. Darauf kann natürlich keine Hysterese, sondern nur Verzögerung angewendet werden, wie pix beschrieben hat.Die Updatezeit würde ich allerdings anders auswerten:
var idRegensensor = 'xxxxxxxxxxx'; // Objekt Regensensor, das true/false liefert, eintragen var updateZeit = 3; // Dauer in s, innerhalb der keine Updates angenommen werden var lastUpdate = getState(idRegensensor).lc; on(idRegensensor, function(dp) { if (dp.state.lc - lastUpdate > updateZeit) { lastUpdate = dp.state.lc; setState(Variable für Regensensor, dp.state.val); } });
-
Danke euch für die Tipps! Werde es ausprobieren und berichten