NEWS
[erledigt] Blockly-Script - alle Lichter ausschalten nach "Doppelklick"
-
Hallo zusammen,
ich habe einen Sonoff Touch und mehrere Sonoff TH in einem Zimmer. Ich möchte jetzt, wenn der Sonoff Touch eingeschaltet ist, durch einen "Doppelklick" auf den Knopf (also schnelles aus- und wieder einschalten) alle Geräte im Zimmer ausschalten.
Habe dazu folgendes mit Blockly gebastelt:
var doubletap_off, timeout2, timeout3; doubletap_off = false; on({id: "sonoff.0.DVES_0447.POWER"/*DVES_0447 POWER*/, change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (doubletap_off == true) { setState("sonoff.0.DVES_0447.POWER"/*DVES_0447 POWER*/, false, true); setState("sonoff.0.DVES_5080.POWER"/*DVES_5080 POWER*/, false, true); setState("sonoff.0.DVES_5174.POWER"/*DVES_5174 POWER*/, false, true); timeout3 = setTimeout(function () { doubletap_off = false; }, 200); } if (doubletap_off == false) { if (getState("sonoff.0.DVES_0447.POWER").val == false) { doubletap_off = true; timeout2 = setTimeout(function () { doubletap_off = false; }, 300); } } });
(Grafik siehe Anhang).
DVES_0447 ist der Touch-Schalter, die anderen beiden sind die normalen Sonoff-Teile, die geschaltet werden sollen.
Wenn ich jetzt aber den Schalter zweimal drücke, macht er erst merkwürdige Geräusche, als wenn er ziemlich schnell hintereinander immer wieder schalten würde, schmiert dann ab, und auch der ioBroker reagiert nicht mehr vernünftig. Aber warum? Ich setze doch extra erst nach einem Timeout von 200ms den Wert auf "false" zurück, damit nicht die automatisierte Schaltung wieder was auslöst …
Gibt es in Blockly eine Möglichkeit a la "Schalte X, aber ohne irgendwelche Blockly-Trigger auszulösen"?
Leseratte10
5800_blockly.png -
Für Auswertung eines Double click ist es nicht sinnvoll, den Wert auszuwerten und zu(rück) zu setzen. Die Auswertung der Timervariablen sollte ausreichen, wenn man sie nach Zeitablauf zurück setzt (timeout = null).
-
Ist das schon der ganze Code? Da wird ja nirgendwo "timeout" mal auf irgendwas gesetzt.
Wenn ich vor das "Execute timeout in 300 ms" noch ein "set timeout to true" mache, habe ich wieder Dauerschalten (rappeln des Relais) im Touch und danach hängt alles.
EDIT: Anscheinend löst das automatische Setzen der drei Schalter (einschließlich meines "Trigger-Schalters) wieder irgendwas aus. Ich habe jetzt an den drei "control <schalter>with false" ein Delay von 350ms (also etwas länger als das Timeout unten) gesetzt und jetzt klappt alles. Danke für den Tipp.</schalter>
5800_bildschirmfoto_von__2018-02-10_10-37-10_.png -
Ist das schon der ganze Code? Da wird ja nirgendwo "timeout" mal auf irgendwas `
Ja, das ist der ganze Code. Die Timerobjektvariable timeout wird mit setTimeout() gesetzt. Klicke mal auf "Zeige Javascript", dann siehst Du es.