Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Anfängerfrage: Reihenfolge von Skriptausführung

    NEWS

    • [erledigt] 15. 05. Wartungsarbeiten am ioBroker Forum

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Anfängerfrage: Reihenfolge von Skriptausführung

    This topic has been deleted. Only users with topic management privileges can see it.
    • W
      Wildbill @Harald-ohne-Nummer last edited by

      @harald-ohne-nummer Es gibt da bei Blockly/Javascript kein von oben nach unten. Alle Trigger laufen quasi gleichzeitig ab. Ebenso wie alle Scripte, die parallel gestartet sind.
      Du musst Dir also schon von Anfang an Gedanken machen, was genau wann passieren soll und dann für dieses wann eben den passenden Trigger verwenden. Das kann zeitbasiert sein, eine Reaktion auf einen Melder (Fensterkontakt, Lichtschalter), ein eigens angelegter Datenpunkt, was auch immer.
      Du kannst auch 10x den geichen Trigger in 10 verschiedenen Scripten nehmen, die werden dann eben zeitgleich ausgelöst.

      Gruss, Jürgen

      1 Reply Last reply Reply Quote 0
      • H
        Harald-ohne-Nummer @Thomas Braun last edited by

        @thomas-braun So zum Beispiel (hat keinen tieferen Sinn, ist nur Test für mich). Die Blöcke außerhalb der Trigger werden bei Skript-Start einmal durchlaufen, dann nicht mehr. Die Trigger sind aber immer beide aktiv. Ich dachte wegen der graphischen Gestaltung (Puzzle), dass da eine Abfolge wäre.

        2023-08-23_Trigger-Reihenfolge.jpg

        Thomas Braun 1 Reply Last reply Reply Quote 0
        • W
          Wildbill last edited by

          @harald-ohne-nummer Jeder Trigger ist immer aktiv und reagiert, sobald seine Bedingung erfüllt ist, egal wo Du ihn in Blockly hinsetzt oder im Javascript-code hinschreibst. Ebenso wird alles, was außerhalb eines Triggers steht genau einmal bein Starten des Scripts (oder des ganzen JS-Adapters) ausgeführt.

          Gruss, Jürgen

          H 1 Reply Last reply Reply Quote 0
          • Thomas Braun
            Thomas Braun Most Active @Harald-ohne-Nummer last edited by

            @harald-ohne-nummer

            Du könntest den zweiten Triggerblock auch rechts neben den ersten Teil setzen.

            Javaskript ist Ereignis-gesteuert, eintretende Ereignisse lösen also immer weiteres aus.

            H 1 Reply Last reply Reply Quote 0
            • H
              Harald-ohne-Nummer @Thomas Braun last edited by

              @thomas-braun @Wildbill

              Vielen Dank!!! Für die Antworten und die Geschwindigkeit der Antworten, das hilft mir!

              W T 2 Replies Last reply Reply Quote 0
              • W
                Wildbill @Harald-ohne-Nummer last edited by

                @harald-ohne-nummer Wie Thomas schon schrieb ist das bei Javascript generell so. Ist also keine iobroker-Eigenheit, sondern gilt generell überall wo Javascript oder Blockly Verwendung findet.

                Gruss, Jürgen

                1 Reply Last reply Reply Quote 0
                • T
                  ticaki Developer @Harald-ohne-Nummer last edited by

                  @harald-ohne-nummer
                  Möchte noch anmerken, das nichts gleichzeitig abläuft, sondern immer nacheinander. Auch wenns so schnell ist, dass es nur für deinen Code/Blöcke einen Unterschied macht.

                  1 Reply Last reply Reply Quote 2
                  • paul53
                    paul53 @Harald-ohne-Nummer last edited by

                    @harald-ohne-nummer sagte: wenn beide Blöcke den selben Trigger verwenden, werden dann beide gleichzeitig durchlaufen?

                    Nur "gefühlt" gleichzeitig. Tatsächlich unmittelbar nacheinander, wobei man nicht vorhersagen kann, welcher zuerst.

                    W 1 Reply Last reply Reply Quote 1
                    • W
                      Wildbill @paul53 last edited by

                      @paul53 @ticaki @Harald-ohne-Nummer Das ist eben wie beim Multitasking auf jedem Rechner. Jeder laufende Prozess schein zeitgleich mit den anderen laufenden Prozessen zu laufen. In Wahrheit laufen da je nach Anzahl der Prozessorkerne nur ein paar parallel und das wechselt immer durch. Da es aber erstens für den User nicht vorhersehbar ist, was als nächstes an die Reihe kommt und das so blitzschnell passiert, dass man es eh nicht mitbekommt, ist es für den User quasi gleichzeitig. Also ja, für Dich ist es beim Erstellen eines Blockly oder direkt Javascripts so, dass alle Trigger zeitgleich ablaufen. Das klitzekleine Nacheinander kannst Du weder beeinflussen, noch bekommst Du es mit.

                      Gruss, Jürgen

                      1 Reply Last reply Reply Quote 0
                      • Codierknecht
                        Codierknecht Developer Most Active last edited by Codierknecht

                        @harald-ohne-nummer
                        Löse Dich von dem Gedanken einer prozeduralen Abarbeitung!

                        Jeder Trigger ist ein "Abonnement" auf ein Ereignis. Hast Du zwei Trigger auf das gleiche Event, werden beide auch (mehr oder weniger) gleichzeitig bearbeitet. Dabei ist die Reihenfolge nicht steuerbar.

                        Wenn Du auf ein bestimmtes Event in einer von Dir gewünschten Reihenfolge reagieren willst, darfst Du auch nur einen einzigen Trigger auf das entsprechende Event setzen.
                        Und selbst dann ist die Reihenfolge der Abarbeitung nicht in jedem Fall steuerbar, da vieles in ioBroker asynchron abläuft.

                        Nehmen wir mal ein ganz simples Beispiel:
                        8a13cb54-3ecc-4874-bfbc-67487e9a4c03-image.png
                        Das erste setState in Zeile 2 könnte - aus welchen Gründen auch immer - etwas länger dauern.
                        Du kannst Dich also nicht zu 100% darauf verlassen, dass Zeile 2 bereits ausgeführt wurde, wenn Zeile 3 abgearbeitet wird.
                        Es könnte also passieren, dass das getState in Zeile 3 noch einen alten Wert liest.

                        T 1 Reply Last reply Reply Quote 0
                        • T
                          ticaki Developer @Codierknecht last edited by ticaki

                          @codierknecht
                          mal abgesehen von dem schlechten Stil und dem hohen Ressourcenverbrauch(im Vergleich zu Variablen), wenn man einen Wert schreibt und unmittelbar wieder liest.

                          Bei 2000 Durchläufen war setState(wertA) == getState(wertA)

                          setState schreibt das afaik nur in den Cache und getState liest es daraus, oder? Das wirkliche schreiben läuft dann async ab.

                          offtopic: Womit hast du den screenshot gemacht, der gefällt mir. 🙂

                          Codierknecht 1 Reply Last reply Reply Quote 0
                          • Codierknecht
                            Codierknecht Developer Most Active @ticaki last edited by

                            @ticaki sagte in Anfängerfrage: Reihenfolge von Skriptausführung:

                            Womit hast du den screenshot gemacht, der gefällt mir

                            SnagIt von TechSmith.
                            Ist aber nicht gerade billig (sponsored by company).

                            1 Reply Last reply Reply Quote 0
                            • arteck
                              arteck Developer Most Active last edited by arteck

                              @ticaki sagte in Anfängerfrage: Reihenfolge von Skriptausführung:

                              Bei 2000 Durchläufen war setState(wertA) == getState(wertA)

                              bei eigen angelegten ja...

                              bei Geräten nicht.. da wird auf ack gewartet.. da kann schon mal passieren das das Gerät noch nicht das ok gesendet hat und du schon den mit getState abholst...

                              dafür gibts die

                              setStateAsync
                              getStateAsync

                              1 Reply Last reply Reply Quote 0
                              • H
                                Harald-ohne-Nummer @Wildbill last edited by

                                Ich muss das Thema nochmal aufmachen. So ganz egal scheint die Anordnungs-Reihenfolge doch nicht zu sein.

                                Ich habe eine ZigBee-Steckdose. Diese sendet zyklisch irgendwelche Statusmeldungen (z.B. "LinkQuality") über ZigBee. Auf dem KNX-Bus will ich die Info haben, ob die ZigBee Steckdose grds. "da" ist, d.h. aktiv im ZigBee sendet. Das habe ich so gelöst wie unten dargestellt. Das klappt auch. Alle 10 Minuten kommt ein Telegram auf den KNX-Bus. Und wenn binnen der 10 Minuten von der ZigBee-Steckdose ein Signal gesendet wurde, ist das KNX-Telegram "wahr", sonst "falsch".

                                Wenn ich aber den Trigger und die Endlosschleife in Blocky tausche, wird zyklisch ein "falsch"-Telegram auf den KNX-Bus gesendet. Der Trigger wird nie ausgelöst, es gibt auch keinen Debug-Output.

                                Wenn in Blockly/Javascript die Anordnungs-Reihenfolge aber egal ist, dürfte das Verhalten doch nicht verschieden sein?

                                2023-08-25_Blockly-Reihenfolge.jpg

                                T 1 Reply Last reply Reply Quote 0
                                • T
                                  ticaki Developer @Harald-ohne-Nummer last edited by ticaki

                                  @Harald-ohne-Nummer

                                  Für Ereignisse und Zeitplan stimmt das alles, aber natürlich wird bei
                                  a= 3+2
                                  a = a * 3
                                  die Reihenfolge eingehalten.

                                  Dein while(1) blockiert alles was danach kommt und ist ganz schlechter Stil. Nimm dafür Zeitplan oder Intervall

                                  Alles was du unter Trigger/Timeout findest läuft asynchron alles andere* synchron.

                                  *Funktionen(Reiter Funktionen) ohne Rückgabe sind asynchron, die mit synchron

                                  Aber natürlich laufen nur Programmfunktionen die aufgerufen werden und wenn du mit while (1) oder ähnlichem die Ausführung stoppst, werden sie nie gestartet.

                                  Einfaches Beispiel:

                                  1. Wenn es klingelt öffne die Tür
                                  2. Warte bis die Tür sich öffnet und dann tue ...

                                  jetzt drehe die unumstößlichen Befehle rum 🙂

                                  Da wäre es doch besser:

                                  1. Wenn es klingelt öffne die Tür
                                  2. Wenn die Tür sich öffnet tue ....
                                  paul53 1 Reply Last reply Reply Quote 0
                                  • paul53
                                    paul53 @ticaki last edited by

                                    @ticaki sagte: ist ganz schlechter Stil. Nimm dafür Zeitplan oder Intervall

                                    Auch eine zyklische Abfrage ist kein guter Stil. Besser prüft man, ob mind. alle 10 Minuten getriggert wird:

                                    Blockly_temp.JPG

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

                                      @paul53
                                      Als Ersatz ist das guter Stil.

                                      Auf das Problem bezogen würde ich bei Erstellung des Telegramms prüfen, ob einer der Zeitstempel jünger als now() -10 Minuten ist. Hätte ich die Zeit vom letzten Telegram würde ich between prüfen. Mit der jetzigen Version sollte die Erstellung oder Versand des Telegrams den Wert auf false setzen und nicht ein Timer.

                                      H 1 Reply Last reply Reply Quote 0
                                      • H
                                        Harald-ohne-Nummer @ticaki last edited by

                                        Vielen Dank für Eure Rückmeldungen! Von Stil habe ich keine Ahnung 😊 , aber auf Basis Eurer Infos habe ich jetzt zwei Varianten, die beide funktionieren...

                                        2023-08-25_ZigBee-Aktualisierung_a.jpg

                                        oder

                                        2023-08-25_ZigBee-Aktualisierung_b.jpg

                                        Das ist dann beides ok?

                                        T 1 Reply Last reply Reply Quote 0
                                        • T
                                          ticaki Developer @Harald-ohne-Nummer last edited by ticaki

                                          @harald-ohne-nummer
                                          Ich hab damit nur ein Problem die Zeitlinie:

                                          0:00 Telegram nachricht
                                          0:01 Skript check
                                          0:08 Zigbee hat sich seit 10 Minuten nicht gemeldet
                                          0:10 Telegammnachricht
                                          0:01 Skript registriert Zigbee
                                          0:20 Telegrammnachricht 12 Minuten zu spät.

                                          nur zur Info: ein/dein Interval startet das erste mal nach 10 minuten und dann alle 10 Minuten

                                          H 1 Reply Last reply Reply Quote 0
                                          • H
                                            Harald-ohne-Nummer @ticaki last edited by

                                            @ticaki Für meinen Anwendungsfall ist es egal, ob der "Funkausfall" ein paar Minuten früher oder später bemerkt wird. Das ist ein Ereignis, das ohnehin nicht oder nur sehr selten vorkommen sollte und dessen Auswirkungen nicht kritisch sind. D.h. es reicht, wenn ich das dann ggf. ein paar Minuten "zu spät" bemerke.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            659
                                            Online

                                            31.6k
                                            Users

                                            79.5k
                                            Topics

                                            1.3m
                                            Posts

                                            8
                                            27
                                            1066
                                            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