NEWS
Mehrfachstart vom Script verhindern.
-
Hallo zusammen.
ich habe ein Script welches mein Badezimmerlicht per Xiaomi Tür sensor anschaltet und nach 20 min wieder automatisch aus schaltet.
Jetzt ist es so wenn innerhalb dieser Zeit die Tür mehrmals geöffnet und geschlossen wird geht das licht natürlich mehr mals an und aus. Sprich für jedes mal tür öffnen wird das licht einmal an und aus geschaltert.
WIe kann ich einen Mehrfachstart verhindern?
Hier mal die log aus dem Debugmodus:
! ````
08:20:47.288 [warn] javascript.0 script.js.common.Lichtschaltung_Bad_Yeelight: setForeignState(id=yeelight-2.0.color-0x0000000005e2899c.control.power, state=true) - was not executed, while debug mode is active
08:20:47.288 [warn] javascript.0 script.js.common.Lichtschaltung_Bad_Yeelight: setForeignState(id=yeelight-2.0.color-0x0000000005e2899c.control.color_mode, state=false) - was not executed, while debug mode is active
08:20:49.057 [warn] javascript.0 script.js.common.Lichtschaltung_Bad_Yeelight: setForeignState(id=yeelight-2.0.color-0x0000000005e2899c.control.power, state=true) - was not executed, while debug mode is active
08:20:49.058 [warn] javascript.0 script.js.common.Lichtschaltung_Bad_Yeelight: setForeignState(id=yeelight-2.0.color-0x0000000005e2899c.control.color_mode, state=false) - was not executed, while debug mode is active
08:20:51.161 [warn] javascript.0 script.js.common.Lichtschaltung_Bad_Yeelight: setForeignState(id=yeelight-2.0.color-0x0000000005e2899c.control.power, state=true) - was not executed, while debug mode is active
08:20:51.162 [warn] javascript.0 script.js.common.Lichtschaltung_Bad_Yeelight: setForeignState(id=yeelight-2.0.color-0x0000000005e2899c.control.color_mode, state=false) - was not executed, while debug mode is active
08:20:57.288 [warn] javascript.0 script.js.common.Lichtschaltung_Bad_Yeelight: setForeignState(id=yeelight-2.0.color-0x0000000005e2899c.control.power, state=false) - was not executed, while debug mode is active
08:20:58.554 [warn] javascript.0 script.js.common.Lichtschaltung_Bad_Yeelight: setForeignState(id=yeelight-2.0.color-0x0000000005e2899c.control.power, state=false) - was not executed, while debug mode is active
08:20:59.058 [warn] javascript.0 script.js.common.Lichtschaltung_Bad_Yeelight: setForeignState(id=yeelight-2.0.color-0x0000000005e2899c.control.power, state=false) - was not executed, while debug mode is active
08:21:00.468 [warn] javascript.0 script.js.common.Lichtschaltung_Bad_Yeelight: setForeignState(id=yeelight-2.0.color-0x0000000005e2899c.control.power, state=false) - was not executed, while debug mode is active
08:21:01.029 [warn] javascript.0 script.js.common.Lichtschaltung_Bad_Yeelight: setForeignState(id=yeelight-2.0.color-0x0000000005e2899c.control.power, state=false) - was not executed, while debug mode is active
08:21:03.309 [warn] javascript.0 script.js.common.Lichtschaltung_Bad_Yeelight: setForeignState(id=yeelight-2.0.color-0x0000000005e2899c.control.power, state=false) - was not executed, while debug mode is activeUnd hier mal das Script: >! ```` <block xmlns="http://www.w3.org/1999/xhtml" type="on" id="O!Nt:TG-7m1]E}YOQ/q`" x="-462" y="-362"><field name="OID">mihome.0.devices.magnet_158d00024367fc.state</field> <field name="CONDITION">ne</field> <statement name="STATEMENT"><block type="controls_if" id="X?jm3]+06ScU#u;XqB=f"><value name="IF0"><block type="logic_compare" id="cJ:g@@(4?}9vc13o;,]x"><field name="OP">EQ</field> <value name="A"><block type="get_value" id="_|3^~3:HeKf[yg%d2L)~"><field name="ATTR">val</field> <field name="OID">mihome.0.devices.magnet_158d00024367fc.state</field></block></value> <value name="B"><block type="logic_boolean" id="FG8(-!*4im|d=a0U#W(F"><field name="BOOL">TRUE</field></block></value></block></value> <statement name="DO0"><block type="control" id="o`B!sjT8bH9[gW9wr/zW"><mutation delay_input="false"></mutation> <field name="OID">yeelight-2.0.color-0x0000000005e2899c.control.power</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="logic_boolean" id="RHDXRX8m:RFk2=1Dw*{d"><field name="BOOL">TRUE</field></block></value> <next><block type="control" id="Oq*eMqqb.IMs9l(yQ6bD"><mutation delay_input="false"></mutation> <field name="OID">yeelight-2.0.color-0x0000000005e2899c.control.color_mode</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="logic_boolean" id="[@MzVtWsU5F-jMOro;qB"><field name="BOOL">FALSE</field></block></value></block></next></block></statement> <next><block type="timeouts_settimeout" id="b%rkn[Ok9!69u{H=?[+x"><field name="NAME">timeout</field> <field name="DELAY">10</field> <field name="UNIT">sec</field> <statement name="STATEMENT"><block type="control" id="wOz_(1@CVE4Zzti4(Q!L"><mutation delay_input="false"></mutation> <field name="OID">yeelight-2.0.color-0x0000000005e2899c.control.power</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="logic_boolean" id="V%Tex^uhmH#!tDgchEEy"><field name="BOOL">FALSE</field></block></value></block></statement></block></next></block></statement></block>
Wie kann ich das verhindern? Wenn mögloch bitte einfach erklären bin ein absoluter anfänger Danke
-
-
@J Riemann:blocklicht.jpeg `
Hi Danke. Kannst du das ganze auch etwas erklären. was du wieso machst?
-
Wenn die geöffnet Tür wird (Trigger-Block true) und in dem Moment das Licht aus ist (Falls Wert false..), dann schalte das Licht an (mache: Steuere Objekt true) und verzögert um 20 Minuten (Timeout) schalte das Licht aus (steuere innerhalb Timeout-Block).
Den "stop" Timeout habe ich eingebaut damit nicht aus irgendwelchen Gründen mehrere Instanzen des Timeout parallel gestartet werden (z.B. wenn Du nach 5 Min das Licht händisch ausschaltest und dann die Tür wieder öffnest. Wäre das jetzt der Fall wird das Licht wieder eingeschaltet und die 20 Min Verzögerung zum ausschalten laufen neu).
Alles befindet sich innerhalb des Triggerblocks weil eben dieser Ablauf nur abhängig vom Trigger ausgeführt werden soll.
-
Ok Danke . So klappt es bei mir jetzt auch.
Letzendlich ist nur das stop timeout relevant. Danke
-
Nein, nicht ganz, das "stop" wäre in diesem Fall nicht dringend erforderlich, ohne würde es auch laufen. Das "stop" deckt nur alle Eventualitäten ab.
Dein Skript hat immer fürs einschalten gesorgt, meins schaltet nur ein wenn das Licht aus ist.
Dein Timeout stand unter dem "Falls - mache" Block was dazu führt das bei jedem Skriptdurchlauf ein neuer Timeout gestartet wurde.
Bei mir wird nur ein Timeout gestartet wenn das Licht aus war und eingeschaltet wurde weil der Timeout sich innerhalb des "Falls - mache" befindet.
Dein Trigger lief auf "bei Änderung", darum wurde beim öffnen und auch beim schließen das Skript ausgeführt. Weil Timeout unten dran hing wurde Timeout bei jeden auslösen gestartet egal ob die Tür geöffnet oder geschlossen wurde. Bei mir läuft das Skript nur wenn die Tür geöffnet wurde.
Unter "Mache" hast Du das Licht eingeschaltet und sofort wieder ausgeschaltet und dann per Timeout nochmals ausgeschaltet.
Du siehst, optisch ganz wenige Änderungen mit großen Auswirkungen.
-
Ok jetzt bin ich wieder raus.
Aber naja es funktioniert erstmal so.. Der rest kommt hoffe ich step by step. Danke.