NEWS
If-Bedienungen…
-
Hallo Community,
ich möchte gerne mehrere Schließkontakte auf einer Ebene zusammenfassen um zu prüfen ob die Etage in meinem Haus abgeschlossen sind. Die Variablen habe ich zwar erzeugt, leider setzt der Iobroker sie nicht bei jeder Veränderung des Türzustandes und schon gar nicht so wie ich es will…
Ich hoffe einer von euch kann mir helfen. Meine Unfähigkeit hat mich diesen Abend schon wahnsinng gemacht
PS: ich habe die ID meiner geräte etwas unkenntlich gemacht, man weiß ja nie wer mitliest :P.
on({id: 'hm-rpc.0.OEQ143xxxx.1.STATE' || 'hm-rpc.0.NEQ088xxxx.1.STATE', change: "ne"}, function (obj) { if ('hm-rpc.0.OEQ143xxxx.1.STATE'== false && 'hm-rpc.0.NEQ088xxxx.1.STATE'== false) { setState('g_Verschluss_Keller', false); } else{ setState('g_Verschluss_Keller', true); } }); on({id: 'hm-rpc.0.OEQ143xxxy.1.STATE' || 'hm-rpc.0.OEQ143xxxz.1.STATE' , change: "any"}, function (obj) { if ('hm-rpc.0.OEQ143xxxy.1.STATE' == false && 'hm-rpc.0.OEQ143xxxz.1.STATE'== false) { setState('g_Verschluss_Dach', false); } else{ setState('g_Verschluss_Dach', true); } })
-
Kurzer Blick auf Deinen Code: Was auffällt - ich würde immer jede Abfrage in if… separat in Klammern setzen.
also das hier
if ('hm-rpc.0.OEQ143xxxx.1.STATE' == false && 'hm-rpc.0.OEQ143xxxx.1.STATE'== false) {
besser so
if ( ('hm-rpc.0.OEQ143xxxx.1.STATE' === false) && ('hm-rpc.0.OEQ143xxxx.1.STATE'=== false) )
Schafft Klarheit zur Isolation und vermeidet, dass hier Bedingungen falsch verbunden werden… Und gerne 3 "=" nehmen, also "===" statt "==".
Nun zum Inhalt des Scripts:
"hm-rpc.0.OEQ143xxxx.1.STATE" über obj.state.val abfragen. Denn sonst vergleichst Du nur den String-Inhalt.
Also z.B.
if(obj.state.val === true){
-
on({id: 'hm-rpc.0.OEQ143xxxx.1.STATE' || 'hm-rpc.0.NEQ088xxxx.1.STATE', `
Das funktioniert nicht. Mehrere Datenpunkte als Trigger mit Array[id1,id2] oder RegExp. Da aber auch die Zustände verknüpft werden sollen, macht man das besser mit globalen Skriptvariablen und einer Funktion.
@yron25:if ('hm-rpc.0.OEQ143xxxx.1.STATE'== false && 'hm-rpc.0.NEQ088xxxx.1.STATE'== false) { `
Was soll der Vergleich eines Strings mit false ergeben ? (immer false)Vorschlag:
const id1 = 'hm-rpc.0.OEQ143xxxx.1.STATE'; const id2 = 'hm-rpc.0.NEQ088xxxx.1.STATE'; const idAlle = 'g_Verschluss_Keller'; var kontakt1 = getState(id1).val; var kontakt2 = getState(id2).val; function alleKontakte() { if(kontakt1 || kontakt2) setState(idAlle, true, true); else setState(idAlle, false, true); } alleKontakte(); // Skriptstart on(id1, function(dp) { kontakt1 = dp.state.val; alleKontakte(); }); on(id2, function(dp) { kontakt2 = dp.state.val; alleKontakte(); });
-
Danke für die schnelle Hilfe, ihr rettet meinen Abend. Ich habe nicht gemerkt, dass 3 Kontakte den selben Namen haben, und ich hätte dazuschreiben können dass es sich um 2 Ebenen handelt. Wurde jetzt geändert.
@ Paul53:
Danke für das Skript. So sehen die also Professionell aus, mit den richtigen Konstanten geladen. Richtig gut.
Nur wegen des Verständnisses:
-
dp ist die Variable die er als true oder false deklariert
-
Mit id1 und id 2 trennst du bei meiner "oder" on-function in 2 auf
-
Was ist in deinem Skript das 2te true bei setState?
-
Wo änderst du im Skript die Variable g_Verschluss_Keller global. Mit idAlle gibst du es es ja nur im Skript zurück oder?
-
-
- dp ist die Variable die er als true oder false deklariert `
dp ist das Datenpunktobjekt, das ausgelöst(getriggert) hat. dp.state.val ist der Wert des auslösenden Datenpunktes
@yron25:
- Mit id1 und id 2 trennst du bei meiner "oder" on-function in 2 auf `
Durch getrennte Trigger ist klar, welcher Wert mit dp.state.val übergeben wird, so dass die richtige Variable (kontakt1 / kontakt2) diesen Wert erhält.
@yron25:
- Was ist in deinem Skript das 2te true bei setState? `
Das setzt ack = true (bestätigt), da ich davon ausgehe, dass der Wert nicht witer gesendet wird, sondern in ioBroker verwendet wird (VIS).
@yron25:
- Wo änderst du im Skript die Variable g_Verschluss_Keller global. Mit idAlle gibst du es es ja nur im Skript zurück oder? `
Der Wert des Datenpunktes mit der ID "g_Verschluss_Keller" wird in der Funktion alleKontakte() mit setState(idAlle, Wert, ack) gesetzt.
Die https://github.com/ioBroker/ioBroker.javascript/blob/master/doc/en/javascript.md kennst Du ?
- dp ist die Variable die er als true oder false deklariert `
-
Hey, danke nein kannte ich nicht.
Ich muss nochmal nachschauen. Dein Skript funktioniert leider auch nicht, er gibt den bei den Werte Kontakt1, Kontakt2= false den Wert für g_Verschluss_Keller true zurück.
Danke für die Hilfe, die Tipps haben mich auf jeden Fall weiter gebracht