Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Unterschied timeout und pause in Blockly

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Unterschied timeout und pause in Blockly

    This topic has been deleted. Only users with topic management privileges can see it.
    • paul53
      paul53 @karsten089 last edited by

      @karsten089 sagte: Ich versuche eine Zeitschaltuhr mit Bewegungsmelder zu bauen

      Wie sieht der Versuch aus?

      K 1 Reply Last reply Reply Quote 0
      • K
        karsten089 @paul53 last edited by

        @paul53 Sorry Bild hatte gefehlt. Habe es eingefügt. 🙂

        paul53 1 Reply Last reply Reply Quote 0
        • paul53
          paul53 @karsten089 last edited by paul53

          @karsten089
          "Wiederhole solange" erzeugt eine Endlosschleife!

          @karsten089 sagte in Unterschied timeout und pause in Blockly:

          Wie kann ich das charmanter lösen?

          Blockly_temp.JPG

          1 Reply Last reply Reply Quote 0
          • Asgothian
            Asgothian Developer @RkcCorian last edited by

            @markus-2 sagte in Unterschied timeout und pause in Blockly:

            Hallo Zusammen,

            ich stelle mir auch gerade die Frage, ob ich das "bequemere" PAUSE oder doch lieber STEUERE mit Verzögerung verwenden soll. Ich habe mal ein paar Tests mit dem PAUSE-Block gemacht. Soweit ich es sehe wird diese eine Abarbeitung des Scripts über einen Trigger verzögert, hindert dennoch nicht, dass das Script mehrfach parallel getriggert wird und dann parallel mehrfach ausgeführt wird. Wenn ich es richtig sehe ist der Wesentliche Unterschied bzgl. STEUERE... will ich:

            • A Mein Skript, bzw. meine Befehle konsistent abarbeiten und "hart" mehrfach Steuerfehle hintereinander abschicken
            • B Meine Steuerbefehle ggf. über "löschen, falls läuft" direkt wieder zurück setzen lassen, bei konfliktionärer Steuerung

            Hab ich das richtig verstanden?

            Viele Grüße!

            Das hast du soweit richtig verstanden. Insbesondere das "Problem" der doppelten Ausführung des gleichen Skript Codes ohne einfache Möglichkeit da einzugreifen.

            Ich würde in der Situation immer zu Timeout / Intervall / Steuerbefehle mit Verzögerung und löschen falls läuft raten.

            A.

            R 1 Reply Last reply Reply Quote 2
            • Asgothian
              Asgothian Developer @karsten089 last edited by

              @karsten089 sagte in Unterschied timeout und pause in Blockly:

              Ich versuche eine Zeitschaltuhr mit Bewegungsmelder zu bauen, das klappt aber mit dem time out nicht. Verstehe ich richtig, dass mein Script immer weiter läuft, sprich von vorne anfängt, bis der Switch auf false ist, und nur der Check presence verzögert wird?

              Mit einer Pause funktioniert es, hier wird aber der Befehl false für den Switch mehrfach verschickt (wird mehrmals hintereinander grün in den Objekten, und irgendwann rot - was bedeutet rot?)

              Wie kann ich das charmanter lösen?

              5081F2EA-B02A-484A-9506-A00BB9BFFAC1.jpeg

              Das was Du im Bild gemacht hast hat mehrere Probleme. Die Lösung von @paul53 weiter oben im Thread ist eine saubere Umsetzung einer BWM Ansteuerung - wenn es auch nicht das abbildet was Du in Deinem Skript getan hast.

              Vorab: die Aussage von @paul53 das dein Skript eine Endlosschleife hat ist nicht korrekt. Die Schleife hat eine Abbruchbedingung die auch ausgelöst werden kann. Es gibt mehrere viel grössere Probleme die sich aus Deinem Ansatz ergeben.

              Als erstes Problem triggerst du auf "wurde aktualisiert". Das bedeutet das Dein Skript bei jeder Aktualisierung des Datenpunktes gestartet wird, unabhängig davon ob sich der Wert auch verändert hat.
              Das Zweite Problem ist das der Skript-teil im Trigger so lange läuft bis der Datenpunkt mit falsch Aktualisiert wird. Wenn der Datenpunkt also mit wahr aktualisiert wird ohne das er vorher auf falsch geht dann wird der der Skript-teil im Trigger ein zweites (drittes, viertes, fünftes) mal gestartet.
              Das Dritte Problem ist die Verwendung des Timeout. Der Baustein "Ausführen Timeout" fügt den im Timeout definierten Skript-Teil in eine Liste von zeitgesteuerten Skripten ein. Diese Aktion dauert ein paar Millisekunden. Die Solange Schleife läuft also mit voller Last so lange bis der Wert auf falsch fällt.
              Das Vierte Problem ist das der timeout nicht gelöscht wird. Zusammen mit dem was ich im Vorfeld geschrieben habe, und unter der Annahme das

              • der Schalter nach 10 sekunden auf falsch geht
              • das Eintragen in den Timeout 100 ms dauert (es geht schneller, aber das Ergebnis ist so schon ziemlich heftig)

              bekommst Du 100 5 Sekunden Timeouts die im 100ms Abstand den Wert des Präsenzsensors abfragen. Sollte in der Zeit der Wert mit Wahr aktualisiert werden kommen noch weitere Timeouts hinzu.

              Wenn du das Skript von @paul53 so anpasst wie im Screenshot unten dargestellt (den rot durchgestrichenen Block entfernen) dann sollte die Funktion so sein wie sie nach Deinem Skript (anscheinend) sein soll - Die Lampe wird automatisch 5 Sekunden nachdem der Präsenzmelder keine Präsenz mehr erkannt wird abgeschaltet. Einschalten ist weiterhin manuell notwendig.

              Screenshot 2021-05-27 at 10.19.07.png

              A.

              AlCalzone paul53 2 Replies Last reply Reply Quote 0
              • AlCalzone
                AlCalzone Developer @Asgothian last edited by

                Um die ursprüngliche Frage zu klären: pause ist hinter den Kulissen auch einfach nur ein setTimeout, mit dem Unterschied dass der Code für weniger JS-erfahrene Programmierer einfacher nachzuvollziehen ist.

                Wir haben diesen Block ergänzt als wir im Skript-Adapter intern async/await-Unterstützung eingebaut haben - der kann bedenkenlos genutzt werden, wenn es wirklich nur ums Warten geht.
                Soll aber die gleichzeitige Ausführung verzögerter Aktionen verhindert werden, führt aktuell kein Weg um die Kombination Timeout stoppen - Timeout erstellen.

                R 1 Reply Last reply Reply Quote 1
                • paul53
                  paul53 @Asgothian last edited by paul53

                  @asgothian sagte: Die Schleife hat eine Abbruchbedingung die auch ausgelöst werden kann.

                  Bis die Abbruchbedingung erfüllt ist, ist die Javascript-Instanz meist schon abgeschmiert.

                  @asgothian sagte in Unterschied timeout und pause in Blockly:

                  Einschalten ist weiterhin manuell notwendig.

                  Du hast recht: Das Skript sollte nur ausschalten:

                  Blockly_temp.JPG

                  Asgothian 1 Reply Last reply Reply Quote 0
                  • Asgothian
                    Asgothian Developer @paul53 last edited by

                    @paul53 sagte in Unterschied timeout und pause in Blockly:

                    Bis die Abbruchbedingung erfüllt ist, ist die Javascript-Instanz meist schon abgeschmiert.

                    Das Stimmt, allerdings liegt es meiner Meinung nach weniger an der fehlenden Abbruchbedingung und mehr an der großen Anzahl an Timeouts die vom Skript erzeugt werden. Wenn statt des "ausführen Timeout" einfach nur ein "mache irgendwas" im solange stehen würde müsste die JS Instanz durchlaufen.

                    A.

                    1 Reply Last reply Reply Quote 0
                    • R
                      RkcCorian @AlCalzone last edited by

                      @alcalzone Vielen Dank dafür! Da ich mehrere Geräte in ein definiertes Setting schalten möchte hilft das ungemein. Bei parallelen Anfragen könnten durch Nutzung von "Löschen falls läuft" undefinierte Zustände passieren. Durch die Pausen wird ein Befehl immer konsistent bearbeitet, wenngleich dies als Nachteil hat, dass manche Befehle hintereinander mehrfach geschickt werden ggü. "Löschen falls läuft".

                      1 Reply Last reply Reply Quote 0
                      • R
                        RkcCorian @Asgothian last edited by

                        @asgothian Vielen Dank für Deine Rückmeldung! Da ich mehrere Geräte in ein definiertes Setting schalten möchte ist es für meinen Use Case dennoch besser Pause zu nutzen. Bei parallelen Anfragen könnten durch Nutzung von "Löschen falls läuft" ansonsten undefinierte Zustände passieren. Durch die Pausen wird ein Befehl immer konsistent bearbeitet, wenngleich dies als Nachteil hat, dass manche Befehle hintereinander mehrfach geschickt werden ggü. "Löschen falls läuft". Aber gut zu wissen, dass es beide Alternativen gibt. Je nach Use Case werde ich diese einsetzen (können) 🙂

                        1 Reply Last reply Reply Quote 0
                        • K
                          karsten089 last edited by

                          Klasse, danke euch allen. Bin noch sehr am
                          Anfang und mache viel Trial&error… und dabei viel Error. 😉

                          1 Reply Last reply Reply Quote 1
                          • X
                            XWing last edited by XWing

                            Ich mache das hier mal wieder auf.
                            Hier mein Script:
                            2d67c7df-5024-43b5-98f9-7cf0d81aa4e7-grafik.png

                            Es soll die Pumpe meines Pools steuern. Dabei sollen folgende Parameter erfüllt sein:

                            1. Es liegt ein Stromüberschuß von mind 3kW an (PV und/ oder BHKW)
                            2. Es sollen max. 2,4kWh am Tag verbraucht werden.
                            3. Es soll eine Vorlauftemperatur von mind. 60°C anliegen.
                              Bei meinen ersten Versuchen habe ich ohne Timeout gearbeitet. Das funktioniert zwar sehr gut, aber nach kurzer Zeit tilt mein Shelly Schalter (auch wenn er nur ein Schütz steuert, ich muss dann jedes mal die Sicherung ab- und wieder anschalten, damit der Shelly wieder funktioniert), da es zu zu vielen Schaltvorgängen kommt. Für die Schwimmbadpumpe ist das sicher auch nicht förderlich.
                              Deswegen möchte ich, daß die Pumpe, nachdem sie eingeschaltet wurde mind. 5 Minuten laufen soll.
                              Ich hoffe ich habe den Thread soweit richtig verstanden und die Tips dort umgesetzt? Oder sind da noch Fehler drin?
                            Homoran paul53 2 Replies Last reply Reply Quote 0
                            • Homoran
                              Homoran Global Moderator Administrators @XWing last edited by Homoran

                              @xwing jedesmal wenn ein Wert > -3000 (2995, 29800, 2800) nacheinander kommt wird ein neuer timeout gestartet ohne dass der laufende gestoppt wird.
                              dadurch kann keiner der timeouts gestoppt werden

                              1 Reply Last reply Reply Quote 0
                              • paul53
                                paul53 @XWing last edited by paul53

                                @xwing sagte: Pumpe, nachdem sie eingeschaltet wurde mind. 5 Minuten laufen soll.

                                So werden bei Werten >= -3000 mehrere Timeout gestartet, die sich nicht mehr stoppen lassen. Ersetze sonst durch sonst falls vorheriger Wert < -3000, damit immer nur ein Timeout gestartet wird.
                                Besser: Bau eine Hysterese ein, die größer ist als die Leistungsaufnahme der Pumpe.

                                X 1 Reply Last reply Reply Quote 0
                                • X
                                  XWing @paul53 last edited by

                                  @paul53
                                  Also so?
                                  7b839060-dd99-4c5b-b57d-23eefa9707cd-grafik.png

                                  Das mit der Hysterese verstehe ich nicht. Die Pumpe braucht max 740W.

                                  paul53 Homoran 2 Replies Last reply Reply Quote 0
                                  • paul53
                                    paul53 @XWing last edited by

                                    @xwing sagte: Also so?

                                    Nein: sonst falls vorheriger Wert < -3000

                                    @xwing sagte in Unterschied timeout und pause in Blockly:

                                    Die Pumpe braucht max 740W.

                                    Dann passt eine Hysterese von 1000 W:

                                    Bild_2022-08-08_153602719.png

                                    X 1 Reply Last reply Reply Quote 0
                                    • Homoran
                                      Homoran Global Moderator Administrators @XWing last edited by

                                      @xwing sagte in Unterschied timeout und pause in Blockly:

                                      Das mit der Hysterese verstehe ich nicht. Die Pumpe braucht max 740W.

                                      in dem Moment wenn die Pumpe anspringt we7l du mehr als 3000W einspeist, fällt die Einspeisung sofort um die Leistungsaufnahme der Pumpe und das Skript würde die Pumpe sofort (nach timeout) wieder ausschalten.

                                      Das kann doch nicht gewollt sein.

                                      X 1 Reply Last reply Reply Quote 0
                                      • X
                                        XWing @Homoran last edited by XWing

                                        @homoran
                                        Das ist korrekt. Ich verstehe das Hysteresescript von paul53 jetzt und werde es umsetzen.
                                        Was mir da noch fehlt ist die Mindestlaufzeit der Pumpe. Meine Frau könnte ja den Teekocher, oder den Fön kurz anmachen und die Pumpe wird ausgeschaltet. Das möchte ich verhindern. Wenn die Pumpe einmal an ist, soll sie eine Mindestlaufzeit in diesem Zustand bleiben.

                                        Homoran 1 Reply Last reply Reply Quote 0
                                        • Homoran
                                          Homoran Global Moderator Administrators @XWing last edited by

                                          @xwing sagte in Unterschied timeout und pause in Blockly:

                                          Wenn die Pumpe einmal an ist, soll sie eine Mindestlaufzeit in diesem Zustand bleiben.

                                          das hattest du so nie im Skript drin.
                                          du möchtest also nicht 5 Minuten Mindestlaufzeit, was immer noch eine hohe Belastung für die Pumpe wäte, sondern nach 5 Minuten erneut überprüfen ob die Einspeisung zu gering ist, und dann erst abschalten.
                                          Solltexder Föhn dann wieder aus sein, soll die Pumpe weiterlaufen.

                                          ODER?

                                          X 1 Reply Last reply Reply Quote 0
                                          • X
                                            XWing @paul53 last edited by

                                            @paul53
                                            Danke,
                                            das hilft mir schonmal auf die Sprünge.
                                            Ich verstehe allerdings nicht was dieser Teil in Deinem Script macht:
                                            e1e8bbb1-34a0-4e89-b5c4-430d6af29a63-grafik.png

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate
                                            FAQ Cloud / IOT
                                            HowTo: Node.js-Update
                                            HowTo: Backup/Restore
                                            Downloads
                                            BLOG

                                            409
                                            Online

                                            31.9k
                                            Users

                                            80.1k
                                            Topics

                                            1.3m
                                            Posts

                                            pause timeout blockly
                                            9
                                            35
                                            11664
                                            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