NEWS
Timerstop Javascript/Blockly bei Funktionsaufruf
-
Hallo Zusammen,
ich bräuchte bitte Hilfe bei meinem Problem. Ich wohne seid 2 Wochen in meinem Neubau und habe langsam angefangen zu coden. Problem ist : Javascript ist Neuland für mich.
Vielleicht kann mir ein etwas erfahrender Entwickler bei meinem Problem helfen.Erstmal zum Code:
/* Deklaration Timer */ var Jalousie_Timer_JaEs1; var Jalousie_Timer_JaEs2; /*Esszimmer2*/ on({id: "node-red.0.DI.3Wo1_3"/*node-red.0.DI.3Wo1_3*/, change: "gt"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; Jalousie(getState("node-red.0.DI.3Wo1_3").val, getState("node-red.0.DI.3Wo1_4").val, 'node-red.0.DO.JaEs2Ho', 'node-red.0.DO.JaEs2Ru', Jalousie_Timer_JaEs1); Jalousie(getState("node-red.0.DI.3Wo1_3").val, getState("node-red.0.DI.3Wo1_4").val, 'node-red.0.DO.JaEs3Ho', 'node-red.0.DO.JaEs3Ru', Jalousie_Timer_JaEs2); }); on({id: "node-red.0.DI.3Wo1_4"/*node-red.0.DI.3Wo1_4*/, change: "gt"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; Jalousie(getState("node-red.0.DI.3Wo1_4").val, getState("node-red.0.DI.3Wo1_3").val, 'node-red.0.DO.JaEs2Ru', 'node-red.0.DO.JaEs2Ho', Jalousie_Timer_JaEs1); Jalousie(getState("node-red.0.DI.3Wo1_4").val, getState("node-red.0.DI.3Wo1_3").val, 'node-red.0.DO.JaEs3Ru', 'node-red.0.DO.JaEs3Ho', Jalousie_Timer_JaEs2); });
var Jalousie_Eingang, Jalousie_Eingang_Sperren, Jalousie_Ausgang, Jalousie_Ausgang_Sperren, Jalousie_Timer; /** * Beschreibe diese Funktion … */ function Jalousie(Jalousie_Eingang, Jalousie_Eingang_Sperren, Jalousie_Ausgang, Jalousie_Ausgang_Sperren, Jalousie_Timer) { if (getState(Jalousie_Ausgang_Sperren).val != '1') { setStateDelayed(Jalousie_Ausgang, (getState(Jalousie_Ausgang).val == '1' ? '0' : '1'), false, parseInt(0, 10), false); console.log('Debug1'); (function () {if (Jalousie_Timer) {clearTimeout(Jalousie_Timer); Jalousie_Timer = null;}})(); Jalousie_Timer = setTimeout(function () { setStateDelayed(Jalousie_Ausgang, '0', false, parseInt(0, 10), false); console.log('Debug2'); (function () {if (Jalousie_Timer) {clearTimeout(Jalousie_Timer); Jalousie_Timer = null;}})(); }, 20000); } else { (function () {if (Jalousie_Timer) {clearTimeout(Jalousie_Timer); Jalousie_Timer = null;}})(); setStateDelayed(Jalousie_Ausgang_Sperren, '0', false, parseInt(0, 10), false); console.log('Debug3'); } }
Mit dem Code im 1. Schnippsel wird die Jalousiefunktion im 2. Schnippsel aufgerufen. Ein Timer wird gestartet. Wenn ich jetzt die Taster/Eingänge öfter hin und herschalte, kann ich an den Debug Variablen sehen, dass die Timer nicht gestoppt wurden sondern weitergelaufen sind. Ich habe heute schon etliche Zeit damit verbracht zu verstehen, warum ich vor diesem Problem stehe. Leider bin ich zu keiner Lösung gekommen und brauche deshalb hilfe.
Wäre eventuell jemand so nett von euch, mich auf den Fehler hinzuweisen?
Grüße
MJ -
@moskito_91 Kannst du auch bitte die Blockly-Variante zeigen, ist manchmal etwas schneller etwas zu erkennen. Danke.
-
@MCU
Hallo,
hier der Code:<xml xmlns="http://www.w3.org/1999/xhtml"> <variables> <variable type="" id="OcSb~h-|M}h^mcd?qV9s">Jalousie_Eingang</variable> <variable type="" id="9ak)aO0Dl0=g3X-sB/0e">Jalousie_Eingang_Sperren</variable> <variable type="" id="]xbhWAyPZt`9SaOn[1%[">Jalousie_Ausgang</variable> <variable type="" id="+hnMf#Jk=eutvR?Mh*VB">Jalousie_Ausgang_Sperren</variable> <variable type="undefined" id="Jalousie_Timer">Jalousie_Timer</variable> </variables> <block type="on" id=".|!7/K$7qOkO^DlH)$G0" x="53" y="51"> <field name="OID">node-red.0.JaRu</field> <field name="CONDITION">gt</field> <field name="ACK_CONDITION"></field> <statement name="STATEMENT"> <block type="procedures_callnoreturn" id="!|~Yx,.gc|2L]Z(ic(9h"> <mutation name="Jalousie"> <arg name="Jalousie_Eingang"></arg> <arg name="Jalousie_Eingang_Sperren"></arg> <arg name="Jalousie_Ausgang"></arg> <arg name="Jalousie_Ausgang_Sperren"></arg> </mutation> <value name="ARG0"> <block type="get_value" id="gP:Jt7Nt}zhmthu*euOf"> <field name="ATTR">val</field> <field name="OID">node-red.0.JaRu</field> </block> </value> <value name="ARG1"> <block type="get_value" id="Pd,BI5b8`H-mc$8!}Apj"> <field name="ATTR">val</field> <field name="OID">node-red.0.JaHo</field> </block> </value> <value name="ARG2"> <block type="field_oid" id="^Y%M$_).W,kcNi:D`20c"> <field name="oid">node-red.0.DO.JaKid1Ru</field> </block> </value> <value name="ARG3"> <block type="field_oid" id="_pgOIw!Wa=+?xPskwtjZ"> <field name="oid">node-red.0.DO.JaKid1Ho</field> </block> </value> </block> </statement> <next> <block type="on" id="g3U(K@HI}jpU/Jt`dCut"> <field name="OID">node-red.0.JaHo</field> <field name="CONDITION">gt</field> <field name="ACK_CONDITION"></field> <statement name="STATEMENT"> <block type="procedures_callnoreturn" id="L2c+_:0kb1s)-Jjr/MWS"> <mutation name="Jalousie"> <arg name="Jalousie_Eingang"></arg> <arg name="Jalousie_Eingang_Sperren"></arg> <arg name="Jalousie_Ausgang"></arg> <arg name="Jalousie_Ausgang_Sperren"></arg> </mutation> <value name="ARG0"> <block type="get_value" id="gahI/IyF~7q0L`?yJ/V."> <field name="ATTR">val</field> <field name="OID">node-red.0.JaHo</field> </block> </value> <value name="ARG1"> <block type="get_value" id="ge0zl/~$.lU?a)DL=t20"> <field name="ATTR">val</field> <field name="OID">node-red.0.JaRu</field> </block> </value> <value name="ARG2"> <block type="field_oid" id="nyr-!`CMD;K-+cEnG[b)"> <field name="oid">node-red.0.DO.JaKid1Ho</field> </block> </value> <value name="ARG3"> <block type="field_oid" id="{Md?XdYQa%MAJ/~V{B%D"> <field name="oid">node-red.0.DO.JaKid1Ru</field> </block> </value> </block> </statement> </block> </next> </block> <block type="procedures_defnoreturn" id=";wOA%a=5;3qoLrdh{6Y)" x="713" y="163"> <mutation> <arg name="Jalousie_Eingang" varid="OcSb~h-|M}h^mcd?qV9s"></arg> <arg name="Jalousie_Eingang_Sperren" varid="9ak)aO0Dl0=g3X-sB/0e"></arg> <arg name="Jalousie_Ausgang" varid="]xbhWAyPZt`9SaOn[1%["></arg> <arg name="Jalousie_Ausgang_Sperren" varid="+hnMf#Jk=eutvR?Mh*VB"></arg> </mutation> <field name="NAME">Jalousie</field> <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment> <statement name="STACK"> <block type="controls_if" id="]^gu;^w}Xx)#z(oGNj(X"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_compare" id="f63LVhMaW2hIgaIC(?fC"> <field name="OP">NEQ</field> <value name="A"> <block type="get_value_var" id="5qPy9UBV85gVcLPL4xy["> <field name="ATTR">val</field> <value name="OID"> <shadow type="text" id="@~/sj$5wAl=z@;Wm^)oQ"> <field name="TEXT"></field> </shadow> <block type="variables_get" id=")O5~;#f#byjP-UPNV:t$"> <field name="VAR" id="+hnMf#Jk=eutvR?Mh*VB" variabletype="">Jalousie_Ausgang_Sperren</field> </block> </value> </block> </value> <value name="B"> <block type="text" id="W$cyo}^Q_w)vrWUam-Zb"> <field name="TEXT">1</field> </block> </value> </block> </value> <statement name="DO0"> <block type="control_ex" id="HaZbwh_}9`Mx8{I,8m/P"> <field name="TYPE">false</field> <field name="CLEAR_RUNNING">FALSE</field> <value name="OID"> <shadow type="field_oid" id="y7eV4`(+,:Dz~z:38ZzG"> <field name="oid">Object ID</field> </shadow> <block type="variables_get" id="xmE*)C;/{MAW0G1#5of@"> <field name="VAR" id="]xbhWAyPZt`9SaOn[1%[" variabletype="">Jalousie_Ausgang</field> </block> </value> <value name="VALUE"> <shadow type="logic_boolean" id="}yYX8xX)4AP~`HT)Z`hY"> <field name="BOOL">TRUE</field> </shadow> <block type="logic_ternary" id="=D$_a}m;S/WDA*1KL.*c"> <value name="IF"> <block type="logic_compare" id="FSHcuQ1X-IQNHTP;mfho"> <field name="OP">EQ</field> <value name="A"> <block type="get_value_var" id="$|8TnVh(G!GYgjwtU8n."> <field name="ATTR">val</field> <value name="OID"> <shadow type="text" id="@~/sj$5wAl=z@;Wm^)oQ"> <field name="TEXT"></field> </shadow> <block type="variables_get" id="H]jR5}!23OSB~xUJlca."> <field name="VAR" id="]xbhWAyPZt`9SaOn[1%[" variabletype="">Jalousie_Ausgang</field> </block> </value> </block> </value> <value name="B"> <block type="text" id="z,s[XAi+1ZHo=,)}QcyJ"> <field name="TEXT">1</field> </block> </value> </block> </value> <value name="THEN"> <block type="text" id="ZFblK@at84?stG~`H-zP"> <field name="TEXT">0</field> </block> </value> <value name="ELSE"> <block type="text" id="e%e[A=Q[=d]jiAyb{,}P"> <field name="TEXT">1</field> </block> </value> </block> </value> <value name="DELAY_MS"> <shadow type="math_number" id="l-5Sc4Za$qD3p;PeQIuT"> <field name="NUM">0</field> </shadow> </value> <next> <block type="debug" id="OMebpu1++A.4$J,W;s)}"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id=")/4PQJK}3vdh([E?F7y^"> <field name="TEXT">test</field> </shadow> <block type="text_join" id="sGxe!xX1eB`P8BAm6zRD"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="Qnj1KjF3K@c3~AqmgX6D"> <field name="TEXT">Jal_O1: </field> </block> </value> <value name="ADD1"> <block type="get_value_var" id="PJxpTw=~*a]J0JDrDdjL"> <field name="ATTR">val</field> <value name="OID"> <shadow type="text" id="@~/sj$5wAl=z@;Wm^)oQ"> <field name="TEXT"></field> </shadow> <block type="variables_get" id=")AxD4=R,0c?,eBdbBiiA"> <field name="VAR" id="]xbhWAyPZt`9SaOn[1%[" variabletype="">Jalousie_Ausgang</field> </block> </value> </block> </value> </block> </value> <next> <block type="timeouts_cleartimeout" id="si:J.xTy53%|D^JofQ,^"> <field name="NAME">Jalousie_Timer</field> <next> <block type="timeouts_settimeout" id="^gGlQTQf:?vlzLQk;43%"> <field name="NAME">Jalousie_Timer</field> <field name="DELAY">20000</field> <field name="UNIT">ms</field> <statement name="STATEMENT"> <block type="control_ex" id="Hly2:B(b%z!x.TIh36tq"> <field name="TYPE">false</field> <field name="CLEAR_RUNNING">FALSE</field> <value name="OID"> <shadow type="field_oid" id="^s2ajcKCNd|^%b62Z(yK"> <field name="oid">Object ID</field> </shadow> <block type="variables_get" id="/pO!Fg3ORF$%N5}hECTD"> <field name="VAR" id="]xbhWAyPZt`9SaOn[1%[" variabletype="">Jalousie_Ausgang</field> </block> </value> <value name="VALUE"> <shadow type="logic_boolean" id="}yYX8xX)4AP~`HT)Z`hY"> <field name="BOOL">TRUE</field> </shadow> <block type="text" id="]xpPjeVOGnDLG/gTc?2u"> <field name="TEXT">0</field> </block> </value> <value name="DELAY_MS"> <shadow type="math_number" id="Sk$Y4QB!=TAJ)4`yU+w="> <field name="NUM">0</field> </shadow> </value> <next> <block type="debug" id="*[g5az{J5d$[v`by20RO"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="yzc}!wq~N,Td=VcmS2H0"> <field name="TEXT">test</field> </shadow> <block type="text_join" id="xXuOIvs=!jA3nYE_?yT#"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="A#%PFa)}vZLW.59{bP2R"> <field name="TEXT">Jal_O2: </field> </block> </value> <value name="ADD1"> <block type="get_value_var" id="Y@zmGys[7:-/KRL_/-OJ"> <field name="ATTR">val</field> <value name="OID"> <shadow type="text" id="@~/sj$5wAl=z@;Wm^)oQ"> <field name="TEXT"></field> </shadow> <block type="variables_get" id="](TcC%~`q`m%g*PIMuk+"> <field name="VAR" id="]xbhWAyPZt`9SaOn[1%[" variabletype="">Jalousie_Ausgang</field> </block> </value> </block> </value> </block> </value> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </statement> <statement name="ELSE"> <block type="timeouts_cleartimeout" id="ho_}%RKN9WKJKn!1B;$O"> <field name="NAME">Jalousie_Timer</field> <next> <block type="control_ex" id="84LbanBMGvM%2u6$HfgO"> <field name="TYPE">false</field> <field name="CLEAR_RUNNING">FALSE</field> <value name="OID"> <shadow type="field_oid" id="nbyg:8x)FA*-%_/51;ry"> <field name="oid">Object ID</field> </shadow> <block type="variables_get" id="JYRx?Wd/TOsCA-[NB0Pj"> <field name="VAR" id="+hnMf#Jk=eutvR?Mh*VB" variabletype="">Jalousie_Ausgang_Sperren</field> </block> </value> <value name="VALUE"> <shadow type="logic_boolean" id="tbqG+~gW+LIqHm~U{Y:W"> <field name="BOOL">TRUE</field> </shadow> <block type="text" id=",=*r](%-Tw?^Hu2`eU~o"> <field name="TEXT">0</field> </block> </value> <value name="DELAY_MS"> <shadow type="math_number" id="FYpds4u3.l9xI}S?|XfH"> <field name="NUM">0</field> </shadow> </value> <next> <block type="debug" id="*J_1D$?6yFZlmsZ.pn#c"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="]pHIRO/x#j?~TYIJ}_*|"> <field name="TEXT">test</field> </shadow> <block type="text_join" id="XEEnmBHk-1FjeEK@*)#4"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="SepE$o:uqd^^$],L{u|}"> <field name="TEXT">Jal_O3: </field> </block> </value> <value name="ADD1"> <block type="get_value_var" id="HTc?6x|Y+svKEG]VU-w|"> <field name="ATTR">val</field> <value name="OID"> <shadow type="text" id="@~/sj$5wAl=z@;Wm^)oQ"> <field name="TEXT"></field> </shadow> <block type="variables_get" id="/?tF?6WHe+BYY.gz$utg"> <field name="VAR" id="]xbhWAyPZt`9SaOn[1%[" variabletype="">Jalousie_Ausgang</field> </block> </value> </block> </value> </block> </value> </block> </next> </block> </next> </block> </statement> </block> </statement> </block> </xml>
-
@moskito_91 du übergibst der Funktion eine Variable für den Timer Namen. Allerdings gibst du den ggf. erzeugten Timer aus der Funktion nicht zurück, so das die Variablen
var Jalousie_Timer_JaEs1; var Jalousie_Timer_JaEs2;
nie eine wert bekommen - das Handle des Timers geht verloren.
Du musst
- die funktionsdefinition mit Rückgabe wert nutzen
- den wert der Variablen Jalousie_Timer zurück geben
- den rückgabewert der variable zuweisen die du als 4. Parameter der Funktion übergibst.
A.
-
@Asgothian
Geht sofort,
manchmal sieht man den Wald vor lauter Bäumen nicht.
Vielen vielen dank, brauch ich heute weniger Tempotücher!Gruß MJ
-
@asgothian
Hallo!
Ich bräuchte bitte nochmal Hilfe.
Es geht um folgenden Code:var Ausgang_SSR, Status_SSR, SSR1_Timeout, SSR1_Timeout2, Timer_Index, Timerlaenge_BM, Status_BM; /** var Timer_Aussen_Eingang={val:0} var Timer_Aussen_Garage_Tor={val:0} function Bewegungsmelder_Aussen_2(Status_BM,Ausgang_SSR, Status_SSR, Timer_Index,Timerlaenge_BM) { if (compareTime(getAstroDate("sunriseEnd", undefined, 0), getAstroDate("sunsetStart", undefined, 0), "not between", null)) { if (getState(Status_SSR).val != true) { setState(Ausgang_SSR,'1'); SSR1_Timeout = setTimeout(function () { setStateDelayed(Ausgang_SSR, '0', false, parseInt(0, 10), false); }, 300); } (function () {if (Timer_Index) {clearTimeout(Timer_Index); Timer_Index = null;}})(); if(getState(Status_BM).val != true) { Timer_Index = setTimeout(function () { if(getState(Status_SSR).val==true){ setState(Ausgang_SSR,'1'); SSR1_Timeout2 = setTimeout(function () { setStateDelayed(Ausgang_SSR, '0', false, parseInt(0, 10), false); }, 300); } }, Timerlaenge_BM); } } } on({id: 'node-red.0.DI.BM_Aussen_Eingang', change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; Timer_Aussen_Eingang.val=Bewegungsmelder_Aussen_2('node-red.0.DI.BM_Aussen_Eingang','node-red.0.DO.Aussen_Eingang','node-red.0.DI.Aussen_Eingang',Timer_Aussen_Eingang.val, 30000); Timer_Aussen_Garage_Tor.val=Bewegungsmelder_Aussen_2('node-red.0.DI.BM_Aussen_Eingang','node-red.0.DO.Aussen_Garage_Tor','node-red.0.DI.Aussen_Garage_Tor',Timer_Aussen_Garage_Tor.val, 30000); }); on({id: 'node-red.0.DI.BM_Aussen_Garage_Tor', change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; Timer_Aussen_Eingang.val=Bewegungsmelder_Aussen_2('node-red.0.DI.BM_Aussen_Garage_Tor','node-red.0.DO.Aussen_Eingang','node-red.0.DI.Aussen_Eingang',Timer_Aussen_Eingang.val, 30000); Timer_Aussen_Garage_Tor.val=Bewegungsmelder_Aussen_2('node-red.0.DI.BM_Aussen_Garage_Tor','node-red.0.DO.Aussen_Garage_Tor','node-red.0.DI.Aussen_Garage_Tor',Timer_Aussen_Garage_Tor.val, 30000); });
In meinem ersten Funktionsprototypen hatte ich nur die Werte einer Variablen übergeben.
Anschließend habe ich das Gefühl gehabt, dass jedes mal wenn die Funktion aufgerufen wird (auch von anderen Triggern), die Variable die im ersten Aufruf übergeben wurde, sprich der Timer resettet oder verändert wurde.Anschließend bin ich auf Cal-by-Value und Call-by-Reference gestoßen.
Manchmal bleibt bei mir leider ein Stromstoßrelais angezogen. Ich kann das Script nicht gut genug debuggen und kriege den besagten Status auch nicht selber provoziert. Er stellt sich irgendwann ein.Bei der Embedded Programmierung kann ich den Scedular direkt beeinflußen, hier ist das leider ein wenig schwerer. Außerdem fehlt mir KnowHow um an die richtige stelle zu schauen.
Bitte um Hilfe!
-
@moskito_91
Das kann ich mir erst heute Abend anschauen. Allerdings sind da auf jeden Fall mehrere Dinge unsauber oder sogar falsch - eine genauere Analyse kann ich noch nicht liefern:- Du hast Doppeldeutigkeiten bei Variablen und Funktionsparametern
- Du hast ein getState mit callback und Reaktion auf den zurück gegebenen Wert - ob das so geht bin ich nicht sicher
- Das GetState ist wenn ich das überblicke vollständig unnötig.
Aber wie gesagt - da kann ich erst heute Abend im Detail dran gehen.
A.
-
@asgothian
Hallo,
könntest du am WE mal über den Code schauen?
Gruß MJ -
Was genau soll der code tun ? Es geht so viel durcheinander das ich da nicht durch steige:
- Warum sind Timer_Aussen_Eingang und Timer_aussen_Garage_Tor Objekte ?
- Was willst du damit tun. Du weist denen am Anfang einmal Werte zu, veränderst diese aber nicht mehr - Deine Funktion gibt keinen Wert zurück.
- Du hast einen Konflikt mit der Variable Timer_Index und dem Parameter Timer_Index was dazu führt das die Variable wahrscheinlich nie gesetzt wird. Das gleiche gilt für die meisten anderen Variablen, allerdings macht das da nichts.
Du machst da viele seltsame Dinge. Das lässt sich ohne weitere Info nicht debuggen.
A
-
@asgothian
Hallo,
danke für deine Antwort.
Was ich machen möchte:
Jeder Bewegungsmelder hat einen eigenen Timer. Dieser Timer wird bei Ausschalten des Bewegungsmelders gestartet.
Wenn der Bewegungsmelder nochmal getriggert wird, wird der Timer resettet.Die Ausgänge sollen logischerweise das erste mal bei einem Signaleingang auf dem Bewegungsmelder auf 1 gesetzt werden. Hinter dem IObroker habe ich eine Eigenentwicklung hängen , die die Stromstoßrelais dort hinter schaltet.
Ich möchte, dass der jeweilige Timer bei Funktionsaufruf resettet wird.
Das Tor und der Eingang haben jeweils einen eigenen Bewegungsmelder. Beide Bewegungsmelder schalten aber die selben Ausgänge.Danke und Gruß
MJ