Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Blockly
  5. Anfängerfrage: Reihenfolge von Skriptausführung

NEWS

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    11
    1
    491

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.6k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.6k

Anfängerfrage: Reihenfolge von Skriptausführung

Geplant Angeheftet Gesperrt Verschoben Blockly
27 Beiträge 8 Kommentatoren 2.8k Aufrufe 4 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • CodierknechtC 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 Nicht stören
    T Nicht stören
    ticaki
    schrieb am zuletzt editiert von ticaki
    #13

    @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. :)

    Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

    Spenden

    CodierknechtC 1 Antwort Letzte Antwort
    0
    • T 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. :)

      CodierknechtC Online
      CodierknechtC Online
      Codierknecht
      Developer Most Active
      schrieb am zuletzt editiert von
      #14

      @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).

      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

      Proxmox 9.1.1 LXC|8 GB|Core i7-6700
      HmIP|ZigBee|Tasmota|Unifi
      Zabbix Certified Specialist
      Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

      1 Antwort Letzte Antwort
      0
      • arteckA Offline
        arteckA Offline
        arteck
        Developer Most Active
        schrieb am zuletzt editiert von arteck
        #15

        @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

        zigbee hab ich, zwave auch, nuc's genauso und HA auch

        1 Antwort Letzte Antwort
        0
        • W Wildbill

          @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 Offline
          H Offline
          Harald-ohne-Nummer
          schrieb am zuletzt editiert von
          #16

          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 Antwort Letzte Antwort
          0
          • H Harald-ohne-Nummer

            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 Nicht stören
            T Nicht stören
            ticaki
            schrieb am zuletzt editiert von ticaki
            #17

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

            Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

            Spenden

            paul53P 1 Antwort Letzte Antwort
            0
            • T 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 ....
              paul53P Offline
              paul53P Offline
              paul53
              schrieb am zuletzt editiert von
              #18

              @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

              Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
              Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

              T 1 Antwort Letzte Antwort
              0
              • paul53P paul53

                @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 Nicht stören
                T Nicht stören
                ticaki
                schrieb am zuletzt editiert von ticaki
                #19

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

                Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                Spenden

                H 1 Antwort Letzte Antwort
                0
                • T 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 Offline
                  H Offline
                  Harald-ohne-Nummer
                  schrieb am zuletzt editiert von
                  #20

                  Vielen Dank für Eure Rückmeldungen! Von Stil habe ich keine Ahnung :blush: , 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 Antwort Letzte Antwort
                  0
                  • H Harald-ohne-Nummer

                    Vielen Dank für Eure Rückmeldungen! Von Stil habe ich keine Ahnung :blush: , 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 Nicht stören
                    T Nicht stören
                    ticaki
                    schrieb am zuletzt editiert von ticaki
                    #21

                    @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

                    Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                    Spenden

                    H 1 Antwort Letzte Antwort
                    0
                    • T 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 Offline
                      H Offline
                      Harald-ohne-Nummer
                      schrieb am zuletzt editiert von
                      #22

                      @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 Antwort Letzte Antwort
                      0
                      • H Harald-ohne-Nummer

                        @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 Offline
                        A Offline
                        AXMLM
                        schrieb am zuletzt editiert von
                        #23

                        Ich grabe das hier mal aus, da das Problem das gleiche ist. Die Reihenfolge der Aktionen unter einem Trigger läuft nicht sequenziell ab.

                        Ich habe einen Berechnungsscript in Blockly gebaut. Hier scheint es zu sein, dass die Berechnungsreihenfolge durcheinander läuft und der Volumetracker dadurch Fehlermeldungen produziert.

                        0_userdata.0.Benutzervariablen.Strom.Wert_Gespart wurde scheinbar resetet! Reset von 874.13 nach 874.11 passe alle Startwerte an
                        

                        hier ist der Blockly Block.

                        982be6ea-a09b-4480-aa85-50dcf48226f5-image.png

                        kann ich irgendwie Blockly dazu zwingen die Berechnungen nacheinander zu machen, oder macht er das eh und der Fehler liegt woanders?

                        paul53P 1 Antwort Letzte Antwort
                        0
                        • A AXMLM

                          Ich grabe das hier mal aus, da das Problem das gleiche ist. Die Reihenfolge der Aktionen unter einem Trigger läuft nicht sequenziell ab.

                          Ich habe einen Berechnungsscript in Blockly gebaut. Hier scheint es zu sein, dass die Berechnungsreihenfolge durcheinander läuft und der Volumetracker dadurch Fehlermeldungen produziert.

                          0_userdata.0.Benutzervariablen.Strom.Wert_Gespart wurde scheinbar resetet! Reset von 874.13 nach 874.11 passe alle Startwerte an
                          

                          hier ist der Blockly Block.

                          982be6ea-a09b-4480-aa85-50dcf48226f5-image.png

                          kann ich irgendwie Blockly dazu zwingen die Berechnungen nacheinander zu machen, oder macht er das eh und der Fehler liegt woanders?

                          paul53P Offline
                          paul53P Offline
                          paul53
                          schrieb am zuletzt editiert von
                          #24

                          @axmlm sagte: kann ich irgendwie Blockly dazu zwingen die Berechnungen nacheinander zu machen

                          Ja, verwende Variablen für Werte, die später wieder verwendet werden, denn "aktualisiere" wird asynchron ausgeführt, ist also beim Wiedereinlesen noch nicht fertig.

                          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                          A 1 Antwort Letzte Antwort
                          0
                          • paul53P paul53

                            @axmlm sagte: kann ich irgendwie Blockly dazu zwingen die Berechnungen nacheinander zu machen

                            Ja, verwende Variablen für Werte, die später wieder verwendet werden, denn "aktualisiere" wird asynchron ausgeführt, ist also beim Wiedereinlesen noch nicht fertig.

                            A Offline
                            A Offline
                            AXMLM
                            schrieb am zuletzt editiert von AXMLM
                            #25

                            @paul53 said in Anfängerfrage: Reihenfolge von Skriptausführung:

                            @axmlm sagte: kann ich irgendwie Blockly dazu zwingen die Berechnungen nacheinander zu machen
                            Ja, verwende Variablen für Werte, die später wieder verwendet werden, denn "aktualisiere" wird asynchron ausgeführt, ist also beim Wiedereinlesen noch nicht fertig.

                            Meinst Du so?
                            ec8a0d0b-1484-4ad6-8142-ebe94ac4d43f-image.png
                            EDIT:

                            geht nicht:

                            
                            javascript.0	10:33:08.705	error	script.js.Strom.PV-Ertragswerte: getState has been called with id of type "number" but expects a string
                            javascript.0	10:33:08.706	error	script.js.Strom.PV-Ertragswerte: TypeError: Cannot read properties of undefined (reading 'val')
                            javascript.0	10:33:08.707	error	at Object.<anonymous> (script.js.Strom.PV-Ertragswerte:9:62)
                            
                            A 1 Antwort Letzte Antwort
                            0
                            • A AXMLM

                              @paul53 said in Anfängerfrage: Reihenfolge von Skriptausführung:

                              @axmlm sagte: kann ich irgendwie Blockly dazu zwingen die Berechnungen nacheinander zu machen
                              Ja, verwende Variablen für Werte, die später wieder verwendet werden, denn "aktualisiere" wird asynchron ausgeführt, ist also beim Wiedereinlesen noch nicht fertig.

                              Meinst Du so?
                              ec8a0d0b-1484-4ad6-8142-ebe94ac4d43f-image.png
                              EDIT:

                              geht nicht:

                              
                              javascript.0	10:33:08.705	error	script.js.Strom.PV-Ertragswerte: getState has been called with id of type "number" but expects a string
                              javascript.0	10:33:08.706	error	script.js.Strom.PV-Ertragswerte: TypeError: Cannot read properties of undefined (reading 'val')
                              javascript.0	10:33:08.707	error	at Object.<anonymous> (script.js.Strom.PV-Ertragswerte:9:62)
                              
                              A Offline
                              A Offline
                              AXMLM
                              schrieb am zuletzt editiert von
                              #26

                              jetzt läufts

                              a6453720-0a64-41fe-994b-94083bb0b97e-image.png

                              A 1 Antwort Letzte Antwort
                              0
                              • A AXMLM

                                jetzt läufts

                                a6453720-0a64-41fe-994b-94083bb0b97e-image.png

                                A Offline
                                A Offline
                                AXMLM
                                schrieb am zuletzt editiert von
                                #27

                                die Fehlermeldungen sind leider geblieben.

                                
                                valuetrackerovertime.0
                                2025-04-30 11:10:49.694	warn	0_userdata.0.Benutzervariablen.Strom.PV-Eigenverbrauch wurde scheinbar resetet! Reset von 3250.42 nach 3250.33 passe alle Startwerte an
                                
                                valuetrackerovertime.0
                                2025-04-30 11:10:49.693	warn	0_userdata.0.Benutzervariablen.Strom.Verbrauch_gesamt wurde scheinbar resetet! Reset von 9820.42 nach 9820.33 passe alle Startwerte an
                                
                                valuetrackerovertime.0
                                2025-04-30 11:10:49.691	warn	0_userdata.0.Benutzervariablen.Strom.Wert_Gewinn wurde scheinbar resetet! Reset von 1216.99 nach 1216.97 passe alle Startwerte an
                                
                                valuetrackerovertime.0
                                2025-04-30 11:10:49.689	warn	0_userdata.0.Benutzervariablen.Strom.Wert_Gespart wurde scheinbar resetet! Reset von 874.36 nach 874.34 passe alle Startwerte an
                                
                                valuetrackerovertime.0
                                2025-04-30 11:09:39.804	warn	0_userdata.0.Benutzervariablen.Strom.PV-Eigenverbrauch wurde scheinbar resetet! Reset von 3250.41 nach 3250.32 passe alle Startwerte an
                                
                                valuetrackerovertime.0
                                2025-04-30 11:09:39.801	warn	0_userdata.0.Benutzervariablen.Strom.Verbrauch_gesamt wurde scheinbar resetet! Reset von 9820.41 nach 9820.32 passe alle Startwerte an
                                
                                1 Antwort Letzte Antwort
                                0
                                Antworten
                                • In einem neuen Thema antworten
                                Anmelden zum Antworten
                                • Älteste zuerst
                                • Neuste zuerst
                                • Meiste Stimmen


                                Support us

                                ioBroker
                                Community Adapters
                                Donate

                                784

                                Online

                                32.5k

                                Benutzer

                                81.8k

                                Themen

                                1.3m

                                Beiträge
                                Community
                                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                ioBroker Community 2014-2025
                                logo
                                • Anmelden

                                • Du hast noch kein Konto? Registrieren

                                • Anmelden oder registrieren, um zu suchen
                                • Erster Beitrag
                                  Letzter Beitrag
                                0
                                • Home
                                • Aktuell
                                • Tags
                                • Ungelesen 0
                                • Kategorien
                                • Unreplied
                                • Beliebt
                                • GitHub
                                • Docu
                                • Hilfe