Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly mit Verzoegerung/timeout funktioniert nicht wie gewuenscht

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Blockly mit Verzoegerung/timeout funktioniert nicht wie gewuenscht

    This topic has been deleted. Only users with topic management privileges can see it.
    • N
      nibblerrick last edited by

      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

      1 Reply Last reply Reply Quote 0
      • rantanplan
        rantanplan last edited by

        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

        1 Reply Last reply Reply Quote 0
        • N
          nibblerrick last edited by

          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?

          1 Reply Last reply Reply Quote 0
          • N
            nibblerrick last edited by

            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

            1 Reply Last reply Reply Quote 0
            • rantanplan
              rantanplan last edited by

              @nibblerrick:

              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.

              @nibblerrick:

              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

              1 Reply Last reply Reply Quote 0
              • N
                nibblerrick last edited by

                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);
                });
                
                
                1 Reply Last reply Reply Quote 0
                • rantanplan
                  rantanplan last edited by

                  @nibblerrick:

                  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

                  1 Reply Last reply Reply Quote 0
                  • rantanplan
                    rantanplan last edited by

                    Ha.

                    Das Einsetzen einer Variablen in den Timer funktioniert nicht mehr!!!

                    Habe ich gerade ausprobiert.

                    War auch noch nie offiziell dokumentiert.

                    Grüße

                    1 Reply Last reply Reply Quote 0
                    • N
                      nibblerrick last edited by

                      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.

                      1 Reply Last reply Reply Quote 0
                      • rantanplan
                        rantanplan last edited by

                        @nibblerrick:

                        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.

                        @nibblerrick:

                        Wie setze ich denn dann am besten das um? `
                        Ich hatte Dir nen Link gezeigt 😉

                        @nibblerrick:

                        Ich glaube das mit der Variablen da drin habe ich auch irgendwo im Forum gefunden gehabt. `
                        Den Beitrag suche ich verzeifelt.

                        1 Reply Last reply Reply Quote 0
                        • N
                          nibblerrick last edited by

                          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?

                          1 Reply Last reply Reply Quote 0
                          • rantanplan
                            rantanplan last edited by

                            @nibblerrick:

                            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

                            1 Reply Last reply Reply Quote 0
                            • N
                              nibblerrick last edited by

                              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.

                              1 Reply Last reply Reply Quote 0
                              • rantanplan
                                rantanplan last edited by

                                @nibblerrick:

                                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

                                1 Reply Last reply Reply Quote 0
                                • AlCalzone
                                  AlCalzone Developer last edited by

                                  @rantanplan:

                                  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)

                                  1 Reply Last reply Reply Quote 0
                                  • rantanplan
                                    rantanplan last edited by

                                    @AlCalzone:

                                    Auf die Gefahr hin mich unbeliebt zu machen: `
                                    Da musst Du Dich aber mehr anstrengen. 😄

                                    @AlCalzone:

                                    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

                                    1 Reply Last reply Reply Quote 0
                                    • AlCalzone
                                      AlCalzone Developer last edited by

                                      @rantanplan:

                                      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. `

                                      1 Reply Last reply Reply Quote 0
                                      • N
                                        nibblerrick last edited by

                                        @AlCalzone:

                                        @rantanplan:

                                        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.

                                        1 Reply Last reply Reply Quote 0
                                        • N
                                          nibblerrick last edited by

                                          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@m930b}~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

                                          1 Reply Last reply Reply Quote 0
                                          • First post
                                            Last post

                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          744
                                          Online

                                          31.7k
                                          Users

                                          79.8k
                                          Topics

                                          1.3m
                                          Posts

                                          3
                                          19
                                          3376
                                          Loading More Posts
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                          The ioBroker Community 2014-2023
                                          logo