Skip to content
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. [Problem] Berechnungen mit Variablen, warum klappt das nicht?

NEWS

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.8k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.0k

[Problem] Berechnungen mit Variablen, warum klappt das nicht?

[Problem] Berechnungen mit Variablen, warum klappt das nicht?

Scheduled Pinned Locked Moved Skripten / Logik
24 Posts 9 Posters 3.4k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • rantanplanR Offline
    rantanplanR Offline
    rantanplan
    wrote on last edited by
    #1

    Hallo JavaScriptler

    Ich bin auf ein Problem gestoßen, für das ich keine Lösung finde.

    Der folgende Code wurde von Blockly generiert.

    setState("javascript.0.varA"/*varA*/, 10);
    for (var count = 0; count < 10; count++) {
      setState("javascript.0.varB"/*varB*/, (getState("javascript.0.varA").val + 10));
      setState("javascript.0.varC"/*varC*/, (getState("javascript.0.varB").val + 10));
      setState("javascript.0.varD"/*varD*/, (getState("javascript.0.varC").val + 10));
    }
    
    

    Diese doch recht einfachen Rechenoperationen führen nicht zum richtigen Ergebnis.

    Kann mir jemand erklären woran das liegt.

    Grüße

    Rantanplan

    CCU3 / MS Server 2019(VM) / Scripten mit Blockly

    1 Reply Last reply
    0
    • T Offline
      T Offline
      tempestas
      wrote on last edited by
      #2

      Was gibt er denn aus?

      Nehme an, die 10 ist nur ein Beispiel?

      Variable A wird ja nur ienmal gesetzt. Damit läuft die For Schleife imho immer wieder aufs Gleiche raus. Wenn das so sein soll, warum 10x machen?

      Im Ergebnis setzt du doch

      A = 10

      Schleife:

      B = 20 (A + 10)

      C = 30 (B + 10)

      D = 40 (C+10)

      Dann wieder Schleife:

      B = 20 ( A + 10, wobei A eben einmalig mit 10 fixiert wurde)

      C = 30

      D = 40

      usw

      <size="85">ioBroker | 21 Adapter | Ubuntu Server | intel NUC | Homematic CCU2 | Hue | Osram Lightify| Sonos | 2x Instar Cam | Samsung Tab A 2016 im Holzrahmen| 3x Echo dot | 1x Echo | Neato Botvac D5</size>

      1 Reply Last reply
      0
      • rantanplanR Offline
        rantanplanR Offline
        rantanplan
        wrote on last edited by
        #3

        Hallo tempestas

        Alle Variablen auf 0

        Nach dem 1. Programmstart

        A=10

        B=10

        C=10

        D=10

        Nach dem 2. Programmstart

        A=10 (ok)

        B=20

        C=20

        D=20

        Und die Schleife läuft jedesmal 10x durch.

        Rantanplan

        CCU3 / MS Server 2019(VM) / Scripten mit Blockly

        1 Reply Last reply
        0
        • G Offline
          G Offline
          gst666
          wrote on last edited by
          #4

          > Was gibt er denn aus?
          Vermutlich Unfug.

          Wahrscheinlich werden die Befehle nicht in der Reihenfolge wie erwartet abgearbeitet. Folgendes Programm mag das verdeutlichen:

          setState("javascript.0.varA", 10);
          ... hier eine Pause in der Programmausführung ...
          setState("javascript.0.varA", 20);
          console.log(getState("javascript.0.varA").val);
          

          Das Programm kann entweder als Ergebnis 10 oder 20 ausgeben. Das hängt davon ab, ob das zweite setState schon abgeschlossen ist, bevor die Ausgabe kommt. Die Programmausführung wird bei setState fortgesetzt, bevor der eigentliche Schreibvorgang abgeschlossen ist. In dem Beispiel von rantanplan ist das Problem dasselbe, nur durch die Schleife noch verschärft.

          1 Reply Last reply
          0
          • rantanplanR Offline
            rantanplanR Offline
            rantanplan
            wrote on last edited by
            #5

            @gst666:

            Das hängt davon ab, ob das zweite setState schon abgeschlossen ist, bevor die Ausgabe kommt. Die Programmausführung wird bei setState fortgesetzt, bevor der eigentliche Schreibvorgang abgeschlossen ist. `
            Wie kann man das denn verhindern?

            Dieses Beispiel macht die Katastrophe noch deutliche.

            for (var count = 0; count < 10; count++) {
              setState("javascript.0.varA"/*varA*/, (getState("javascript.0.varA").val + 10));
              setState("javascript.0.varB"/*varB*/, (getState("javascript.0.varB").val + getState("javascript.0.varA").val + 10));
              setState("javascript.0.varC"/*varC*/, (getState("javascript.0.varC").val + getState("javascript.0.varB").val + 10));
              setState("javascript.0.varD"/*varD*/, (getState("javascript.0.varD").val + getState("javascript.0.varC").val + 10));
            }
            
            

            Grüße

            Rantanplan

            CCU3 / MS Server 2019(VM) / Scripten mit Blockly

            1 Reply Last reply
            0
            • T Offline
              T Offline
              tempestas
              wrote on last edited by
              #6

              setStateDelayed mit ansteigendne Intervallen, so dass auf jedenfall der State A geschrieben ist, bevor State B drauf zugreift und ihn für seinen eigenen Wert nutzt

              <size="85">ioBroker | 21 Adapter | Ubuntu Server | intel NUC | Homematic CCU2 | Hue | Osram Lightify| Sonos | 2x Instar Cam | Samsung Tab A 2016 im Holzrahmen| 3x Echo dot | 1x Echo | Neato Botvac D5</size>

              1 Reply Last reply
              0
              • rantanplanR Offline
                rantanplanR Offline
                rantanplan
                wrote on last edited by
                #7

                @tempestas:

                setStateDelayed mit ansteigendne Intervallen, so dass auf jedenfall der State A geschrieben ist, bevor State B drauf zugreift und ihn für seinen eigenen Wert nutzt `
                Da hat man mit Blockly aber schlechte Karten 😢

                Rantanplan

                CCU3 / MS Server 2019(VM) / Scripten mit Blockly

                1 Reply Last reply
                0
                • T Offline
                  T Offline
                  tempestas
                  wrote on last edited by
                  #8

                  und wenn du die Schleife nur mit Variablen abarbeiten lässt und erst am Ende die finalen Variablen in die States schreibst?

                  <size="85">ioBroker | 21 Adapter | Ubuntu Server | intel NUC | Homematic CCU2 | Hue | Osram Lightify| Sonos | 2x Instar Cam | Samsung Tab A 2016 im Holzrahmen| 3x Echo dot | 1x Echo | Neato Botvac D5</size>

                  1 Reply Last reply
                  0
                  • AlCalzoneA Offline
                    AlCalzoneA Offline
                    AlCalzone
                    Developer
                    wrote on last edited by
                    #9

                    setState hat einen Callback, der aufgerufen wird, sobald der State tatsächlich geschrieben wurde.

                    https://github.com/ioBroker/ioBroker.ja … d#setstate

                    Erst dann kannst du per getState den neuen Wert auslesen.

                    Ob das aber mit Blockly geht... puuuh. Du kannst höchstens in Skript-internen Variablen rechnen und die Ergebnisse per setState rausschreiben. Dann fällt das getState zum Weiterrechnen weg.

                    Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                    1 Reply Last reply
                    0
                    • rantanplanR Offline
                      rantanplanR Offline
                      rantanplan
                      wrote on last edited by
                      #10

                      @tempestas:

                      und wenn du die Schleife nur mit Variablen abarbeiten lässt und erst am Ende die finalen Variablen in die States schreibst? `
                      Habe ich auch schon dran gedacht. Elegant ist aber was anderes.

                      Und trotzdem ist so etwas eine böse Falle.

                      Wer kann sagen, wie lange so eine asynchrone Abarbeitung dauert.

                      Wie soll man so etwas Blockly Anfängern veranschaulichen.

                      Alles sehr unbefriedigend 😢

                      Grüße

                      Rantanplan

                      CCU3 / MS Server 2019(VM) / Scripten mit Blockly

                      1 Reply Last reply
                      0
                      • T Offline
                        T Offline
                        tempestas
                        wrote on last edited by
                        #11

                        @rantanplan:

                        @tempestas:

                        und wenn du die Schleife nur mit Variablen abarbeiten lässt und erst am Ende die finalen Variablen in die States schreibst? `
                        Habe ich auch schon dran gedacht. Elegant ist aber was anderes.

                        Und trotzdem ist so etwas eine böse Falle.

                        Wer kann sagen, wie lange so eine asynchrone Abarbeitung dauert.

                        Wie soll man so etwas Blockly Anfängern veranschaulichen.

                        Alles sehr unbefriedigend 😢

                        Grüße `

                        Ehrlich gesagt verstehe ich dich da nicht ganz.

                        Warum soll es "eleganter sein", wenn States im Milisekundentakt beschrieben und ausgelesen werden anstatt direkt nur mit Variablen zu Arbeiten? Es gibt doch eh nur ein (bzw vier in deinem Beispiel) Endergebnis(se).

                        Eleganz liegt ja eh im Auge des Betrachters. Was z.B. paul53 skripted ist für mich elegant.

                        <size="85">ioBroker | 21 Adapter | Ubuntu Server | intel NUC | Homematic CCU2 | Hue | Osram Lightify| Sonos | 2x Instar Cam | Samsung Tab A 2016 im Holzrahmen| 3x Echo dot | 1x Echo | Neato Botvac D5</size>

                        1 Reply Last reply
                        0
                        • inlineI Offline
                          inlineI Offline
                          inline
                          wrote on last edited by
                          #12

                          Ist aber schon klar, dass das Ändern von States potentiell den Update von x angeschlossenen vis GUI's, das Ausführen von Skripten und das Senden via mqtt usw triggert?

                          In so fern sollte man da wirklich etwas vorsichtig mit sein.

                          LG,

                          Ralf

                          Aufgrund technischer Beschränkungen befindet sich die Signatur auf der Rückseite

                          1 Reply Last reply
                          0
                          • uweklattU Offline
                            uweklattU Offline
                            uweklatt
                            wrote on last edited by
                            #13

                            Hallo,

                            sinnvoll bzw. hilfreich wäre ein zusätzlicher Parameter für setState() mit der Funktion synchrone/asynchrone Ausführung.

                            Dann könnte man sich das Rumgehampel mit Callbacks sparen und der Code macht das, was man erwartet.

                            Tschau

                            Uwe

                            Proxmox/LXC/Docker

                            1 Reply Last reply
                            0
                            • paul53P Offline
                              paul53P Offline
                              paul53
                              wrote on last edited by
                              #14

                              @uweklatt:

                              und der Code macht das, was man erwartet. `
                              …was Du erwartest.

                              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

                              1 Reply Last reply
                              0
                              • uweklattU Offline
                                uweklattU Offline
                                uweklatt
                                wrote on last edited by
                                #15

                                Hallo Paul,@paul53:

                                …was Du erwartest. ` Ja, und was die Mehrheit der "Laienprogrammierer" auch erwartet 😉

                                Tschau

                                Uwe

                                Proxmox/LXC/Docker

                                1 Reply Last reply
                                0
                                • apollon77A Online
                                  apollon77A Online
                                  apollon77
                                  wrote on last edited by
                                  #16

                                  Es ist korrekt das der JavaScript-Adapter an sich alles versucht synchron zu machen.

                                  Welche JS-Version ist im Einsatz?

                                  Wenn aktuell (mind 3.4.x) dann bitte GitHub Issue aufmachen dafür, sonst bitte updaten und neu versuchen

                                  Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

                                  • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
                                  • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
                                  1 Reply Last reply
                                  0
                                  • G Offline
                                    G Offline
                                    gst666
                                    wrote on last edited by
                                    #17

                                    States sind keine Variablen. Falls man wie rataplan rechnen will, so sollte man die States in eine Variable einlesen und dann wenn die Berechnungen abgeschlossen sind, kann man den Wert in einen State wieder zurückschreiben.

                                    Auch wenn es sich platt anhört. States sind keine Variablen.

                                    Wer sich mal gewundert hat, warum man beim auslesen der States am Ende .val angibt, mag folgendes ausprobieren:

                                    console.log(JSON.stringify(getState("obj")));
                                    

                                    obj durch einen gültigen State ersetzen.

                                    Wie man sieht, werden eine Reihe von Daten gespeichert und nicht nur der Wert des eigentlichen States. Bei zu häufiger Verwendung wird das System stark belastet.

                                    1 Reply Last reply
                                    0
                                    • rantanplanR Offline
                                      rantanplanR Offline
                                      rantanplan
                                      wrote on last edited by
                                      #18

                                      @tempestas:

                                      Ehrlich gesagt verstehe ich dich da nicht ganz.

                                      ….. Es gibt doch eh nur ein (bzw vier in deinem Beispiel) Endergebnis(se). `
                                      Das Beispiel ist auch nur zur Verdeutlichung und sonst ziemlich sinnlos.

                                      Das Problem tauchte bei einem "Hilfsprojekt" hier im Forum auf.

                                      Zudem lief es bei mir und bei dem User nicht.

                                      Da scheinen auch die Leistungsstärke des verwendeten System eine Rolle zu spielen.

                                      Erst ein "Stresstest" brachte mich auf die Fährte.
                                      @tempestas:

                                      …Warum soll es "eleganter sein", wenn States im Milisekundentakt beschrieben und ausgelesen werden anstatt direkt nur mit Variablen zu Arbeiten?... `
                                      Versetzt Dich mal bitte in einen Blockly-Anfänger.

                                      Grüße

                                      Rantanplan

                                      CCU3 / MS Server 2019(VM) / Scripten mit Blockly

                                      1 Reply Last reply
                                      0
                                      • rantanplanR Offline
                                        rantanplanR Offline
                                        rantanplan
                                        wrote on last edited by
                                        #19

                                        @apollon77:

                                        Welche JS-Version ist im Einsatz?

                                        Wenn aktuell (mind 3.4.x) dann bitte GitHub Issue aufmachen dafür, sonst bitte updaten und neu versuchen `
                                        3.4.5 ist bei mir im Einsatz.

                                        GitHub ist für mich leider immer noch eine Blackbox :oops:

                                        Werde es mal bei Trello versuchen.

                                        Grüße

                                        Rantanplan

                                        CCU3 / MS Server 2019(VM) / Scripten mit Blockly

                                        1 Reply Last reply
                                        0
                                        • apollon77A Online
                                          apollon77A Online
                                          apollon77
                                          wrote on last edited by
                                          #20

                                          Github issues anlegen ist simpel.

                                          Github.com , Account anlegen mit E-Mail. Dann im entsprechenden github Projekt (Adapter rechts beim Fragezeichen),dort auf issues und create issue. Text eingeben. Done

                                          Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

                                          • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
                                          • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          469

                                          Online

                                          32.4k

                                          Users

                                          81.3k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe