NEWS
Licht: Bewegungsmelder & Schalter
-
Ich würde gerne ein Licht nach Bewegung schalten und zusätzlich über einen Schalter.
Mein Blockly Script sieht folgendermaßen aus:
var timeout; on({id: 'deconz.0.Sensors.3.presence', change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if ((obj.state ? obj.state.val : "") && compareTime(getAstroDate("sunriseEnd", undefined, 0), getAstroDate("sunsetStart", undefined, 0), "not between", null) && getState("shelly.0.SHSW-25#483FDA828AE1#1.Relay0.Switch").val == false) { (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); setState("shelly.0.SHSW-25#483FDA828AE1#1.Relay0.Switch"/*Switch*/, true); } else { timeout = setTimeout(function () { setState("shelly.0.SHSW-25#483FDA828AE1#1.Relay0.Switch"/*Switch*/, false); setState("shelly.0.SHSW-25#483FDA828AE1#1.Relay1.Switch"/*Switch*/, false); }, 20000); } });
Allerdings funktioniert dies nicht so wie es soll. Das Licht schaltet sich dennoch aus obwohl der Schalter umgelegt ist.
Edit:
Oder muss es eher so aussehen:
Lösung:
var manuell, timeout; on({id: 'shelly.0.SHSW-25#483FDA828AE1#1.Relay0.Switch', change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; manuell = (obj.state ? obj.state.val : "") && (obj.state ? obj.state.from : "") != 'system.adapter.javascript.0'; }); on({id: 'deconz.0.Sensors.3.presence', change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (compareTime(getAstroDate("sunriseEnd", undefined, 0), getAstroDate("sunsetStart", undefined, 0), "not between", null) && !manuell) { if ((obj.state ? obj.state.val : "")) { (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); setState("shelly.0.SHSW-25#483FDA828AE1#1.Relay0.Switch"/*Switch*/, true); } else { timeout = setTimeout(function () { setState("shelly.0.SHSW-25#483FDA828AE1#1.Relay0.Switch"/*Switch*/, false); setState("shelly.0.SHSW-25#483FDA828AE1#1.Relay1.Switch"/*Switch*/, false); }, 20000); } } });
-
@xadox
Du musst ne Erkennung einbauen, die sich merkt von wo das Licht eingeschaltet wurde.
Ich habe hier ein Blockly, das erkennt ob es der BWM war und das funktioniert ganz gut:
Der 9s Timeout enfernt auch die 10s Sperre der erneuten Erkennung des Xiomi BWMEs gibt aber auch den eleganten Ansatz über den Ursprung des Trigger zu arbeiten, sprich wird das über ein Script angeschaltet, wäre der Usprung "javascript.0" und darauf kannst auch abfragen.
-
@Jan1 Du schreibts dann einen Wert in eine Variable die du später dann wieder als Bedingung verwendest. Ok.
Ich verstehe nur nicht wie die beiden Trigger Elemente Arbeiten? Bisher habe ich immer nur einen Trigger pro Script gehabt.Würde es ggf. auch so funktionieren wie in meinem Edit Nachtrag?
-
@xadox
Dein Blockly ergibt nicht viel Sinn, da Du ne Bedingung hast, die nie erfüllt wird
Die erste FALLS prügt den WERT auf falsch und darin hast ne FALLS die den selben WERT auf TRUE prüft, was nie passieren wird. -
@Jan1 Hmm... wieso wird diese nie erfüllt? Ich beziehe mich auf den Nachtrag:
Der Schalter ist ja durchaus auch im Aus Zustand also auf false. -
@xadox
OK, stimmt, wobei das ganze etwas undurchsichtig ist wenn man die dazu gehörigen DPs nicht kennt.Du verwendest ein anderen BWM und somit auch andere DP, wobei das nur ne untergeordnete Rolle spielt. Du musst irgendwie den Schaltvorgang zuordnen können und wie das machbar ist, hatte ich oben geschrieben.
-
@Jan1 sagte in Licht: Bewegungsmelder & Schalter:
wenn man die dazu gehörigen DPs nicht kennt.
Was bitte ist Switch?
und welche möglichen Werte liefert presence.3.presence? -
@Homoran Switch ist ein Shelly 2.5:
Bewegungsmelder ist ein Xiaomi:
-
@xadox sagte in Licht: Bewegungsmelder & Schalter:
Switch ist ein Shelly 2.5:
und was macht der?
das Licht anschalten?@xadox sagte in Licht: Bewegungsmelder & Schalter:
Bewegungsmelder ist ein Xiaomi:
@Homoran sagte in Licht: Bewegungsmelder & Schalter:
welche möglichen Werte liefert presence.3.presence?
-
@xadox
Mit Tasmota? Wenn ja, dann hast Dir ins Knie geschossen, da ich ebenfalls Tasmota drauf habe und mich schon immer gefragt habe, was dieser DP überhaupt aussagt, da der immer egal wie Du schaltest auf "false" steht -
-
-
-
@xadox
Wenn es funktioniert mit der Erkennung des manuellen Schalten, dann ist das die einfachste Methode. Da geht bei mir leider nicht, deshalb der Umweg über die Erkennung, ob über BWM geschaltet wurde. Es ist dann auch egal, was man nimmt, wichtig ist einzig, dass man unterscheiden kann, was die Lampe angeschaltet hat. -
-
@paul53
Wo er sich bei seinem Blockly auf Deine Vorgabe bezogen hat, ist mir auch nicht klar, aber wenn es läuft ist auch schon mal gut. Hatte ja oben schon auf den Thread verlinkt.Zum Ursprung hätte ich aber auch noch ne Frage. Bei mir steht unter "geändert von" bei meinen Lampen die ich schalten immer "sonoff.0/admin" auch wenn der DP über Script vom BWM geschaltet wurde. Wo kann ich denn den Ursprung wirklich ablesen?
-
@Jan1 sagte:
Wo kann ich denn den Ursprung wirklich ablesen?
Der Ursprung ist nicht statisch: Nachdem der Wert per Script geändert wurde (ack: false), wird er von der Adapter-Instanz bestätigt (ack: true).
-
@paul53
OK und wie bekomme ich den genauen Namen raus wenn der gleich wieder verschwindet?
Im Beispiel sind wurde auch einmal "system.adapter.javascript.0" und einmal nur "javascript.0" angegeben. Ist das eine der volle Namen und der zweite der reicht um zu Prüfen? -
@Jan1 sagte:
wie bekomme ich den genauen Namen raus wenn der gleich wieder verschwindet?
Im Trigger loggen
log('Ursprung: ' + dp.state.from);
@Jan1 sagte in Licht: Bewegungsmelder & Schalter:
einmal "system.adapter.javascript.0" und einmal nur "javascript.0"
"system.adapter.javascript.0" ist richtig.
-
Ich verstehe momentan nur Bahnhof.
Was für ein Ursprung?Funktionieren tut das Script nicht. Nachdem durch Bewegung das Licht angeschaltet würde schaltet es nicht mehr aus.