NEWS
Blockly Wert schreiben mit Verzögerung
-
Hallo zusammen,
Ich habe mir eine Regensensor gebaut, und möchte nun die Werte in einen Datenpunkt schreiben.
Soweit funktioniert der Sensor zuverlässig und meldet mir folgenden Status:
Wenn es regnet, liegt die Spannung bei 0 Volt, wenn er trocken ist, liefert er 10,6 Volt.
Mein Datenpunkt lautet "rain" und soll entweder "True" oder "false" sein.
Das ist mein dazugehöriges Blockly.
var timeout; on({ id: 'shelly.0.SHUNI-1#C8C9A31B3CCD#1.ADC.Power' /* Power Measurement */, change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; if ((obj.state ? obj.state.val : '') < 5) { (() => { if (timeout) { clearTimeout(timeout); timeout = null; }})(); setState('0_userdata.0.Regensensor.rain' /* rain */, true, true); } else { timeout = setTimeout(async () => { timeout = null; setState('0_userdata.0.Regensensor.rain' /* rain */, false, true); }, 1800000); } });
Die Verzögerung soll dazu dienen, das er nicht direkt wieder auf "false" springt, wenn der Regen mal für ein paar Minuten unterbrochen ist.
Das Problem ist, das wenn der Sensor abgetrocknet ist und innerhalb der 30 Min neuer Regen beginnt, meldet das Blockly trotzdem "false" nach 30 Minuten.
Wo liegt mein Fehler?
-
@feinfinger Moin,
bau doch mal ein Debug mit dem "Wert" ein, dann siehst du wann und mit welchem Wert er schaltet
zB
-
@feinfinger sagte in Blockly Wert schreiben mit Verzögerung:
Wo liegt mein Fehler?
Du stoppst den Timeout nur 1x, wenn der Wert unter 5V liegt.
Pendelt er um Werte >= 5V, startest Du mehrere Timer. Einer davon feuert dann und liefert die Meldung.Du darfst den Timeout nur 1x starten. Nämlich dann, wenn der Wert das erste Mal von < 5 auf >= 5 wechselt.
-
Also so?
-
@feinfinger sagte in Blockly Wert schreiben mit Verzögerung:
Also so?
Nein. Schau Dir mein Beispiel an.
Du stoppst den Timeout jetzt bei jeder Änderung. Die Wahrscheinlichkeit, dass der Wert bei >= 5 über eine halbe Stunde konstant bleibt, halte ich für ziemlich gering.
Du musst mit "vorheriger Wert" arbeiten und darfst ihn nur stoppen, wenn der (aktuelle) Wert unter 5V sinkt. -