NEWS
Blockly mit Verzoegerung/timeout funktioniert nicht wie gewuenscht
-
Was will ich bezwecken?
Eine Lampengruppe soll 30 Minunten nach Sonnenuntergang eingeschaltet werden.
Nach der Haelfte der Zeit bis 0 Uhr soll eine zweite Lampengruppe eingeschaltet werden. 10 Minunten spaeter soll die erste Lampengruppe ausgeschaltet werden.
Nach den Logeintraegen zu urteilen hat das erste Schalten funktioniert.
Der timeout allerdings nicht. Was ich schon festegestellt habe ich, dass die Sachen innerhalb des Timeouts alle direkt ausgefuehrt werden, so dass mein Debug mit Lampengruppe_1_aus an der Stelle sinnfrei ist. Dadurch, dass der (Test-)Schaltvorgang aber auch im Log landet, habe ich gesehen, die 10 Minuten Verzoegerung haben funktioniert.
Das meiste geht also anscheinend, nur der timeout nicht. Wahrscheinlich setze ich hier irgendwas falsch ein mit der Variablen o.ae. oder ich habe den timeout-Block nicht verstanden.
Irgendwelche Tipps oder eine von Grund auf bessere Herangehensweise an die Umsetzung?
3803_chrome_2017-10-17_19-29-54.png -
Hallo nibblerrick
Ich will jetzt nicht nachrechnen. Welchen Wert bekommt denn Dein "halfway".
Setz doch mal ein "Debug-Output Wert von halfway".
Alternativ kannst Du Dir auch mal das anschauen.
http://forum.iobroker.net/viewtopic.php … tro#p48209
Da kannst Du beliebig viele Schaltpunkte vor und nach Sonnenaufgang/-untergang setzen.
Grüße
-
Ok, ich habe das auf eben gerade gesetzt. Da hat er "90" ins Log geschrieben. Das haut wohl nicht ganz hin. Ich bin mir aber nicht sicher warum.
Bei deinem angegebenen Script liegt der Vorteil doch nur, wenn ich Minuten bis Sonnen(auf|untergang) brauche, denn fuer danach kann ich doch direkt in dem Blocklyblock eine angeben, oder uebersehe ich da was?
-
Ich habe die Konvertierung entfernt und jetzt spuckt halfway einen sinnvolleren Wert aus. Trotzdessen scheint der Timeout nicht abgewartet zu werden sondern direkt ausgefuehrt zu werden (s. Logausgabe unten drunter).
3803_chrome_2017-10-17_21-24-05.png -
Ok, ich habe das auf eben gerade gesetzt. Da hat er "90" ins Log geschrieben. Das haut wohl nicht ganz hin. Ich bin mir aber nicht sicher warum. `
Na, dann stimmt Deine Berechnung nicht.Bei deinem angegebenen Script liegt der Vorteil doch nur, wenn ich Minuten bis Sonnen(auf|untergang) brauche, denn fuer danach kann ich doch direkt in dem Blocklyblock eine angeben, oder uebersehe ich da was? `
Hauptsächlich das "dynamische".
Wenn Du Deine Zeiten ändern willst muss das im Blockly tun.
Mit dem Beispiel kannst Du Variablen/Datenpunkte benutzen, die Du z.B. VIS ändern kannst.
Und die Berechnung funktioniert
Grüße
-
Ah, OK, an vis hatte ich noch nicht gedacht, dann ergibt das ganze natuerlich viel mehr Sinn.
wegen der 90: Meine andere Antwort ansehen, umgestellt, tut anscheinend dennoch nicht, selbst mit sinnvollerem Wert.
Noch was, wenn ich den Code anzeigen lasse dann ist bei der timeoutfunktion "NaN" zu sehen. Muss das so?
var halfway, timeout; schedule({astro: "sunset", shift: 172}, function () { halfway = (86400 - (new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds())) / 2; console.log(halfway); console.log((new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds())); setState("artnet.0.switch.1.switch"/*test switch*/, 0); console.log('Lampengruppe_1_an'); timeout = setTimeout(function () { setState("artnet.0.switch.1.switch"/*test switch*/, 0); console.log('Lampengruppe_2_an'); setStateDelayed("artnet.0.switch.1.switch"/*test switch*/, 0, 600000, false); console.log('Lampengruppe_1_aus'); }, NaN); });
-
Ich habe die Konvertierung entfernt und jetzt spuckt halfway einen sinnvolleren Wert aus. Trotzdessen scheint der Timeout nicht abgewartet zu werden sondern direkt ausgefuehrt zu werden (s. Logausgabe unten drunter). `
Lass mal "halfway" runden. Du dividierst auch ungerade Zahlen durch 2.
Mit 4717,5 Sekunden kann der Timer wohl nichts anfangen.
Grüße
-
Ha.
Das Einsetzen einer Variablen in den Timer funktioniert nicht mehr!!!
Habe ich gerade ausprobiert.
War auch noch nie offiziell dokumentiert.
Grüße
-
Ok, mein Test gerade auch mit ner ganzen Zahl hat auch nicht funktioniert.
Wie setze ich denn dann am besten das um? Ich glaube das mit der Variablen da drin habe ich auch irgendwo im Forum gefunden gehabt.
-
Ok, mein Test gerade auch mit ner ganzen Zahl hat auch nicht funktioniert. `
???? Kann ich gar nicht glauben.Stell doch mal einen Export von der aktuellen Version rein.
Wie setze ich denn dann am besten das um? `
Ich hatte Dir nen Link gezeigtIch glaube das mit der Variablen da drin habe ich auch irgendwo im Forum gefunden gehabt. `
Den Beitrag suche ich verzeifelt. -
Also mit ner Variablen mit ner ganzen Zahl drin. Nicht nur ne Zahl. Da es mit Variablen ja nicht mehr geht ist es ja logisch, dass es nicht funktioniert.
Den Beitrag finde ich auch gerade nicht wieder, ich hatte da gestern 30 Tabs offen wo ich gewuehlt habe, weil ich mir alles moegliche zu Blockly angeguckt habe.
Meinst du deinen Link? Wie kann ich denn da die halbe Zeit zwischen Sunset und 0 Uhr triggern?
-
Meinst du deinen Link? Wie kann ich denn da die halbe Zeit zwischen Sunset und 0 Uhr triggern? `
Du rechnest mit Sekunden, ich mit Minuten.1440 Min. (86400 Sek.)
Aber stell die Frage doch bitte in dem Beitrag.
Dann werden die Zusammenhänge auch für andere deutlicher.
Grüße
-
Ob mit Minuten oder Sekunden ist ja vom Prinzip her egal.
Ich will deinen Thread ja nicht zumuellen, wenn die Frage da sinnlos ist, ich sehe nur im Moment nicht, ob dein Blockly da weiterhilft, da ich ja zwar X Minuten/Sekunden nach Sonnenuntergang was steuern will, ich dieses X ja aber nicht kenne und berechnen muss und daher doch irgendwo eine Verzoegerung oder einen Trigger mit Variable haben muss.
Also geht das irgendwie? Wenn du sagst ja oder ja wahrscheinlich stelle ich die Frage da gerne.
-
Ob mit Minuten oder Sekunden ist ja vom Prinzip her egal.
Ich will deinen Thread ja nicht zumuellen, wenn die Frage da sinnlos ist, ich sehe nur im Moment nicht, ob dein Blockly da weiterhilft, da ich ja zwar X Minuten/Sekunden nach Sonnenuntergang was steuern will, ich dieses X ja aber nicht kenne und berechnen muss und daher doch irgendwo eine Verzoegerung oder einen Trigger mit Variable haben muss.
Also geht das irgendwie? Wenn du sagst ja oder ja wahrscheinlich stelle ich die Frage da gerne. `
Nun, eine Variable im Timeout hat sich ja erledigt.Also wird Deine geplante Lösung nicht funktionieren.
Das bedeutet altes Konzept vergessen und einen neuen Weg suchen.
Dazu müssen wir definieren was Du genau möchtest.
Ich habe das so verstanden.
1. 30 Minuten nach Sonnenuntergang –-> Lampe-A an
2. in der Hälfte der Zeit von Sonnenuntergang zu 0 Uhr ---> Lampe-B an.
3. in der Hälfte der Zeit von Sonnenuntergang zu 0 Uhr + 10 Min ---> Lampe-A aus
Wenn ich da richtig liege können wir im anderen Thread weitermachen.
Grüße
-
Nun, eine Variable im Timeout hat sich ja erledigt.
Also wird Deine geplante Lösung nicht funktionieren.
Das bedeutet altes Konzept vergessen und einen neuen Weg suchen. `
Auf die Gefahr hin mich unbeliebt zu machen:Mit "richtigem" JavaScript geht das. Mit dem konvertierten Blockly-Code gibts ja auch schon ne gute Grundlage, jetzt müsste man nur das fehlerhafte NaN durch die tatsächliche Variable ersetzen (umgerechnet in ms und gerundet)
-
Auf die Gefahr hin mich unbeliebt zu machen: `
Da musst Du Dich aber mehr anstrengen.Mit "richtigem" JavaScript geht das. Mit dem konvertierten Blockly-Code gibts ja auch schon ne gute Grundlage, jetzt müsste man nur das fehlerhafte NaN durch die tatsächliche Variable ersetzen (umgerechnet in ms und gerundet) `
Das wäre auch sehr schlecht wenn es mit dem "richtigen" JavaSript nicht gehen würde.Aber bei jeder Änderung immer die Konvertierung vornehmen finde ich nicht erstrebenswert.
Oder nibblerrick lernt JavaScript.
Oder er bleibt auf der dunklen Seite der Macht.
Grüße
-
Aber bei jeder Änderung immer die Konvertierung vornehmen finde ich nicht erstrebenswert. `
Ja das wäre doof, besser wäre ein Fix für Blockly. Oder…
@rantanplan:nibblerrick lernt JavaScript. `
-
Aber bei jeder Änderung immer die Konvertierung vornehmen finde ich nicht erstrebenswert. `
Ja das wäre doof, besser wäre ein Fix für Blockly. Oder…
@rantanplan:nibblerrick lernt JavaScript.
Ich habe mich schon gefragt, ob es klappt, wenn man die Variable da einsetzt. Ich bin programmieren nicht abgeneigt, aber ich setze es einfach zu selten ein, als dass ich, wenn ich es brauche, etwas in sinnvoller Zeit schaffe. Daher finde ich blockly ganz sexy. Ich probiere das nachher mal.
Und nein, mit so etwas macht man sich (zumindest bei mir) nicht unbeliebt. Also das ist Variante A zum ausprobieren.
Variante B ist in im anderen Thread weitermachen, da bin ich auch neugierig drauf, da schreibe ich gleich auch. Ich berichte dann hier, wenn ich mit Javascript gefailed habe oder nicht.
-
Also ich konnte endlich mal wieder einen Moment etwas ausprobieren. Bei "meiner" Version bin ich schon weitergekommen, und es laeuft auch soweit. Sogar mit Blockly.
Bei Blockly ist erstmal die Falle, dass, wenn man beim Timeout was anderes als ms nimmt es wohl umgerechnet wird. halfway sekunden ist dann halfway*1000 und das ergibt natuerlich nichts sinnvolles.
Ich habe das Ganze jetzt mal etwas eingekuerzt und mit Sekunden gerechnet, die dann in Millisekunden umgerechnet werden. Dafuer habe ich die Sekunden geteilt 0,002 genommen um die Haelfte der Zeit zu haben und dann mal 1000. Das ganze spuckt Blockly als Code so aus:
var halfway, timeout; schedule({astro: "sunset", shift: 30}, function () { // Durch 0.002 ist durch 2 und mal 1.000 (um von sec auf ms) zusammen. Da mal 1.000 sollte runden nicht noetig sein. halfway = (86400 - (new Date().getHours() * 3600 + new Date().getMinutes() * 60 + new Date().getSeconds())) / 0.002; sendTo("telegram", "send", { text: (String('Sunset +30min, halfway: ') + String(halfway)) }); timeout = setTimeout(function () { sendTo("telegram", "send", { text: (String('timeout halfway, halfway: ') + String(halfway)) }); }, halfway); });
Da fehlt jetzt natuerlich das Schalten der Lampen usw. drin, ist einfach mit Telegramnachricht zum ausprobieren.
Falls es wer brauchen kann, hier noch der Blocklyexport:
! <xml 1999/xmlns="<URL url=" http:/www.w3.org/xhtml"="">http://www.w3.org/1999/xhtml">
! <block type="astro" id="BDVm]m*]u8-9oS)YUzG}" x="-537" y="-337"><field name="TYPE">sunset</field>
! <field name="OFFSET">30</field>
! <statement name="STATEMENT"><block type="comment" id="P5Uk#qMCyE;AdRJGj|*"><field name="COMMENT">Durch 0.002 ist durch 2 und mal 1.000 (um von sec auf ms) zusammen. Da mal 1.000 sollte runden nicht noetig sein.</field> ! <next><block type="variables_set" id="6OoB{/SD;)^:PY]nnA_F"><field name="VAR">halfway</field> ! <value name="VALUE"><block type="math_arithmetic" id="V0@[w^.eJVrK?TF1f=qv"><field name="OP">DIVIDE</field> ! <value name="A"><shadow type="math_number" id="+S^QA7_Uj3?K[!1!9DPG"><field name="NUM">1</field></shadow> ! <block type="math_arithmetic" id=")QFb}^[cv.j3Ke=m+cV-"><field name="OP">MINUS</field> ! <value name="A"><shadow type="math_number" id=")vzB58fidSav(D[NfhsD"><field name="NUM">86400</field></shadow></value> ! <value name="B"><shadow type="math_number" id="_^6ua_]lB)_LXm9u6r=w"><field name="NUM">1</field></shadow> ! <block type="time_get" id="_tAL4t8RK5I_r(f,uX^!"><mutation format="false" language="false"></mutation> ! <field name="OPTION">sid</field></block></value></block></value> ! <value name="B"><shadow type="math_number" id="W~c@m
930b}~f;rMZGT!"><field name="NUM">0.002</field></shadow></value></block></value>
! <next><block type="telegram" id=";iOWfxo*jmH{A528@mV"><value name="MESSAGE"><shadow type="text" id="|yr}sZ_S1{NX*e^jX{fY"><field name="TEXT">Sonnenuntergang +30 Minuten</field></shadow> ! <block type="text_join" id="59}{V3Vo@HSYUk+oBm9
"><mutation items="2"></mutation>
! <value name="ADD0"><block type="text" id="SlQZrOB*A(?G;|lx1Nx"><field name="TEXT">Sunset +30min, halfway:</field></block></value> ! <value name="ADD1"><block type="variables_get" id="oNTXhHkdRffL5EjB}z=p"><field name="VAR">halfway</field></block></value></block></value> ! <next><block type="timeouts_settimeout" id="UI{;!tz0.iwt;|6=i{^
"><field name="NAME">timeout</field>
! <field name="DELAY">halfway</field>
! <field name="UNIT">ms</field>
! <statement name="STATEMENT"><block type="telegram" id="5DsYk[f%Y.z3P^uiSNfJ"><value name="MESSAGE"><shadow type="text" id="M=8ooc_#wpms1QR_*2NT"><field name="TEXT">Timeout halfway</field></shadow>
! <block type="text_join" id="%ybFeSdb_!Ul(j-~qJX7"><mutation items="2"></mutation>
! <value name="ADD0"><block type="text" id="eSu[Oj=d|2Z.zRYM|MDY"><field name="TEXT">timeout halfway, halfway:</field></block></value>
! <value name="ADD1"><block type="variables_get" id="Q?TJ/grVnlAiIlB3Y]aa"><field name="VAR">halfway</field></block></value></block></value></block></statement></block></next></block></next></block></next></block></statement></block>
! <block type="schedule" id="ZP7LZ,z0gDB-@[8zj+Z" x="-537" y="213"><field name="SCHEDULE">0 0 * * *</field> ! <statement name="STATEMENT"><block type="telegram" id="7r{9y2;T!f={^ZWjhRW0"><value name="MESSAGE"><shadow type="text" id="B-Jg1Lzf/
-Y~iu-LE/,"><field name="TEXT">Mitternacht Lampen aus</field></shadow></value></block></statement></block></xml>Jetzt muss ich noch mit der Variante im anderen Thread beschaeftigen, damit laeuft es noch nicht, aber ich bin mir noch nicht sicher ob es einfach ein PEBKAC ist.
3803_firefox_2017-11-08_14-58-17.png