NEWS
On ID Grundlage
-
Ich habe nachfolgendes Testscript erstellt. Die Meldung "OK" kommt bei Auslösung aber mehrfach. Auch wenn ein anderer Befehl eingegeben wird, wird Dieser auch mehrfach ausgeführt. Auch wenn ich "val:false" weglasse und bei change "lt" einsetze. Was mache ich falsch?
// Beispiel: //on({id: 'hm-rpc.0.OEQ0333XXX.1.STATE', change: 'any'}, function (obj) { // setState("hm-rpc.0.OEQ0816XXX.1.STATE",obj.state.val); //}); setInterval(abfrage,2000); function abfrage(){ on({id:'0_userdata.0.Logik.TestZustand'/*TestZustand*/,val:false,change: 'ne'}, function(){ console.log("OK"); }); }; // Ende function abfrage /* change: Wert Erklärung eq Der neue Wert muss gleich dem alten sein ne Der neue Wert muss nicht gleich dem alten sein (Standard) gt Neuer Wert muss größer als der alte Wert sein ge Neuer Wert muss größer oder gleich groß sein lt Neuer Wert muss kleiner als der alte sein le Neuer Wert muss kleiner oder gleich groß sein any Trigger wird immer ausgeführt */ -
H Homoran verschob dieses Thema von Einsteigerfragen am
-
Ich habe nachfolgendes Testscript erstellt. Die Meldung "OK" kommt bei Auslösung aber mehrfach. Auch wenn ein anderer Befehl eingegeben wird, wird Dieser auch mehrfach ausgeführt. Auch wenn ich "val:false" weglasse und bei change "lt" einsetze. Was mache ich falsch?
// Beispiel: //on({id: 'hm-rpc.0.OEQ0333XXX.1.STATE', change: 'any'}, function (obj) { // setState("hm-rpc.0.OEQ0816XXX.1.STATE",obj.state.val); //}); setInterval(abfrage,2000); function abfrage(){ on({id:'0_userdata.0.Logik.TestZustand'/*TestZustand*/,val:false,change: 'ne'}, function(){ console.log("OK"); }); }; // Ende function abfrage /* change: Wert Erklärung eq Der neue Wert muss gleich dem alten sein ne Der neue Wert muss nicht gleich dem alten sein (Standard) gt Neuer Wert muss größer als der alte Wert sein ge Neuer Wert muss größer oder gleich groß sein lt Neuer Wert muss kleiner als der alte sein le Neuer Wert muss kleiner oder gleich groß sein any Trigger wird immer ausgeführt */@Laser sagte: Was mache ich falsch?
Das Intervall erzeugt alle 2 s einen neuen Trigger, ohne die bestehenden Trigger zu beenden.
Entweder man verwendet einen Trigger, der auf Ereignisse reagiert, oder man fragt einen Wert zyklisch ab (Polling). -
@Laser sagte: im Millisekundenbreich wird "OK" ausgegeben.
Die vielen Trigger werden unmittelbar nacheinander ausgeführt.
Das Intervall erstellt die vielen Trigger. Die Callback-Funktion der Trigger wird beim Trigger-Ereignis ausgeführt.Ich schrieb: Entweder ein Trigger oder Polling!
-
Das Intervall benutze ich als Zeitbasis für Schaltvorgänge. Ich will einen Status von true nach false umschaltend, abfragen. Wie mache ich denn das nun richtig?
-
Danke, das funktioniert. Dann muß ich das on id / Flankenerkennung in eine extra Script auslagern.
-
Das funktioniert. Habe ich schon getestet. In dem Script mit dem "interval" werden aber auch die vielen Befehle im Millisekundenbereich erzeugt. Ich habe jetzt die "on id"in ein kurzes Script ausgelagert. Da brauche ich eben ein paar Variablen/Objekte mehr. Das macht dem Raspi aber nichts aus. Wie es aussieht.
-
Das Beispiel von @paul53 macht genau das.
val: false, change 'ne'
Der Wert muss false (val: false) sein, und geändert (change 'ne') worden sein.Wird er zwischendurch nicht auf true gesetzt, gibt es keine fallende Flanke.
-
-
Es funktionieren beide Varianten. Nur eben nicht in meinem Hauptscript mit "interval".
Im extra Script kein Problem.@Laser sagte: mit "interval".
Wenn nicht per Trigger, sondern per Polling auf die Flanke reagiert werden soll, benötigt man eine Hilfsvariable:
const id = '0_userdata.0.Logik.TestZustand'; var lastVal = getState(id).val; function abfrage() { const val = getState(id).val; if(!val && lastVal) { // Aktion bei Flanke true --> false } lastVal = val; } setInterval(abfrage,2000);