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. SetState() nach createState() schreibt nichts?

NEWS

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

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

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

SetState() nach createState() schreibt nichts?

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
31 Beiträge 6 Kommentatoren 7.2k Aufrufe
  • Ä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.
  • apollon77A Offline
    apollon77A Offline
    apollon77
    schrieb am zuletzt editiert von
    #22

    ich hab da nur eine Idee, dass am Ende die "setStates" die beim ANlegen der States passieren ja auch asynchron sind und daher bei der Ausführung durchaus dann nach den "on"s ausgeführt werden könnten.

    Um das ggf rauszufinden wäre eine Idee das anlegen der subscriptions um 1-2 Sekunden zu verzögern … also ein "setTimeout(function ..., 2000) einzubauen. Das sollte/könnte den setStates genug Zeit geben um auch abgearbeitet zu sein.

    Dann sieht man ob es daran lag ...

    Oder Du baust eine "initDone" Variable ein die am Anfang "false" ist und nach Anlegen aller Subscriptions (ggf zeitverzögert) auf "true" geht und in deinem Subscription code prüfst Du ob die true ist und machst nur dann die Logik

    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 Antwort Letzte Antwort
    0
    • AlCalzoneA Offline
      AlCalzoneA Offline
      AlCalzone
      Developer
      schrieb am zuletzt editiert von
      #23

      setState hat auch eine callback-Methode. Man könnte das so handhaben (Pseudocode, => steht für Callback):

      createAllStates():
        für jeden State:
          createState => Alle States angelegt? Dann setAllStates()
      
      setAllStates():
        für jeden State:
          createState => Alle States gefüllt? Dann init()
      
      init():
        subscriptions anlegen
      

      @OP: Welche Node-Version verwendest du? Wenn es mindestens 4.X ist kannst du auch auf Promises gehen. Ich poste dir dann gerne Code. Dann würde sich die Initialisierung grob wie folgt gestalten inklusive Ablaufkontrolle:

      var createStates = [...]; // Array mit Promises füllen, die States anlegen
      var fillStates = [...]; // Array mit Promises füllen, die States füllen
      Promise.all(createStates)
        .then(function() {return Promise.all(fillStates)})
        .then(function() { /* Subscriptions und Skript initialisieren */ })
        ;
      
      

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

      1 Antwort Letzte Antwort
      0
      • apollon77A Offline
        apollon77A Offline
        apollon77
        schrieb am zuletzt editiert von
        #24

        Ich glaube er nutzt hier die Möglichkeit automatisch einen ersten Wert bei createState zu setzen … gerade nachgeschcut. Der clalback sollte dann erst aufgerufen werden wenn auch das setState durch ist ... Also komisch ists

        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 Antwort Letzte Antwort
        0
        • ruhr70R Offline
          ruhr70R Offline
          ruhr70
          schrieb am zuletzt editiert von
          #25

          @apollon77 und @AlCalzone: erst einmal herzlichenDank für Eure Gedanken und Mühe! :!: :)

          Vorweg der aktuelle Stand, gerade getestet:

          • das Problem ist nicht immer reproduzierbar :(

          • alle Versuche vorhin waren so, wie sie sein sollten

          Ich vermute, dass es ggf. an der Auslastung des Rechners liegt und dass das Setzen des initValue nicht im callback des createState() berücksichtigt ist.

          Also immer noch in Teilen asynchrone :?:

          @apollon77:

          ich hab da nur eine Idee, dass am Ende die "setStates" die beim ANlegen der States passieren ja auch asynchron sind und daher bei der Ausführung durchaus dann nach den "on"s ausgeführt werden könnten. `

          Du meinst, da ich das initialValue beim ersten Anlegen oder beim Überschreiben (nicht der normale Vorgang, nur wenn ich Änderungen in den Bezeichnungen durchgeführt habe) verwende, ruft der Javascript-Adapter innerhalb der Funktion createState() ein setState() auf und dieses ist im Callback von createState() noch nicht berücksichtigt?

          Ich habe mal in den Code vom Javascript-Adapter reingeschaut.

          Im createState gibt es u.a. diese Zeile:

          if (initValue !== undefined) {
              adapter.setState(name, initValue, callback);
          

          Ob das dann beim callback vom createState mit berücksichtig ist… da bin ich definitiv raus :o

          @apollon77:

          Um das ggf rauszufinden wäre eine Idee das anlegen der subscriptions um 1-2 Sekunden zu verzögern … also ein "setTimeout(function ..., 2000) einzubauen. Das sollte/könnte den setStates genug Zeit geben um auch abgearbeitet zu sein.

          Dann sieht man ob es daran lag ... `

          Hatte ich gemacht, bevor ich oben gepostet hatte. Hilft etwas… aber nicht immer.

          @apollon77:

          Oder Du baust eine "initDone" Variable ein die am Anfang "false" ist und nach Anlegen aller Subscriptions (ggf zeitverzögert) auf "true" geht und in deinem Subscription code prüfst Du ob die true ist und machst nur dann die Logik `

          Verstehe ich nicht ganz. Das Problem liegt doch vorher oder?

          Es sollten alles States gesetzt sein, bevor die Subscritions angelegt werden.

          @AlCalzone:

          setState hat auch eine callback-Methode. Man könnte das so handhaben (Pseudocode, => steht für Callback): `

          Das wäre die Variante, wenn das createState wirklich die dort enthaltenen setStates asynchrone aufruft?

          Also auf initialValue verzichten.

          Dann kommt hinzu, dass vorher geprüft werden muss, ob die Werte gesetzt werden müssen (nur beim ersten Start oder bei forcecreation)?

          @AlCalzone:

          @OP: Welche Node-Version verwendest du? Wenn es mindestens 4.X ist kannst du auch auf Promises gehen. Ich poste dir dann gerne Code. Dann würde sich die Initialisierung grob wie folgt gestalten inklusive Ablaufkontrolle: `

          Ich selbst verwende 4.x. Ich überlege, ob es sich lohnt das Skript als Prototype für einen Adapter zu verwenden.

          Denke da an die Abwärtskompatibelität…

          Da ich das mit den Callbacks() wohl nicht mehr so schnell in den Kopf bekomme, bietet es sich an doch mal Promises anzusehen ;-)

          Kann das direkt verwendet werden oder muss da noch was geladen werden?

          Aber prinzipiell würde ich gerne verstehen, woran es jetzt gerade das Problem ist ;-)

          Adapter: Fritzbox, Unify Circuit
          Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

          1 Antwort Letzte Antwort
          0
          • AlCalzoneA Offline
            AlCalzoneA Offline
            AlCalzone
            Developer
            schrieb am zuletzt editiert von
            #26

            @ruhr70:

            Da ich das mit den Callbacks() wohl nicht mehr so schnell in den Kopf bekomme, bietet es sich an doch mal Promises anzusehen ;-)

            Kann das direkt verwendet werden oder muss da noch was geladen werden? `
            Ab Node 4.x ist das eigentlich nativ unterstützt. Das Skript läuft dann aber nicht unter einer 0.10.x-Umgebung, das muss dir klar sein.

            Ich sehe zu, dass ich dir heute Abend mal ein bisschen Code bastele zum Testen.

            @ruhr70:

            Aber prinzipiell würde ich gerne verstehen, woran es jetzt gerade das Problem ist ;-) `
            Dass dein Problem nicht immer reproduzierbar ist, klingt für mich nach Timing-Problemen durch asynchronen Programmablauf. Wenn eine Aktion dann mal länger dauert, hakts woanders.

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

            1 Antwort Letzte Antwort
            0
            • apollon77A Offline
              apollon77A Offline
              apollon77
              schrieb am zuletzt editiert von
              #27

              Aber warte mal … vllt löst sich dein Problem bald von selbst:

              http://forum.iobroker.net/viewtopic.php?p=63889#p63889

              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 Antwort Letzte Antwort
              0
              • AlCalzoneA Offline
                AlCalzoneA Offline
                AlCalzone
                Developer
                schrieb am zuletzt editiert von
                #28

                Die Funktionen lassen sich vorübergehend sehr leicht "synchron" nachrüsten. Wie gesagt, Code liefere ich später :)

                Den dazu benötigten Nachrüst-Code kann man dann - wenn es soweit ist - wieder entfernen, die Logik funktioniert weiterhin.

                –-

                Edit: Anscheinend sind die neuen Methoden dann wirklich synchron, und nicht als Promises gekapselt wie angenommen.

                Musst du wissen @ruhr70 ob du jetzt was haben willst, oder noch ein bisschen warten kannst.

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

                1 Antwort Letzte Antwort
                0
                • ruhr70R Offline
                  ruhr70R Offline
                  ruhr70
                  schrieb am zuletzt editiert von
                  #29

                  @AlCalzone:

                  Edit: Anscheinend sind die neuen Methoden dann wirklich synchron, und nicht als Promises gekapselt wie angenommen.

                  Musst du wissen @ruhr70 ob du jetzt was haben willst, oder noch ein bisschen warten kannst. `

                  Beim Skript bin ich erst einmal im Reinen. Bei der Funktion. createState() synchron mit Callback und dann setTimeout für die Subscriptions.

                  Ist der schlimmste Spagetti-Code geworden… aber nun ja.

                  Ich kann also warten ;-). Das Promises Thema werde ich mir aber trotzdem mal ansehen. Nur die Adapter-Funktionen werden ja dann synchrone. Für das ganze drumherum braucht man dann auch eine Lösung... also Promises!?

                  Adapter: Fritzbox, Unify Circuit
                  Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

                  1 Antwort Letzte Antwort
                  0
                  • AlCalzoneA Offline
                    AlCalzoneA Offline
                    AlCalzone
                    Developer
                    schrieb am zuletzt editiert von
                    #30

                    Ich hatte Code versprochen…

                    Promise-Kapselung um eine Funktion mit Callback:

                    // Erwartet eine Funktion, die als letzten Parameter einen Node-JS-Callback annimmt.
                    function promisify(fn, context) {
                    	return function (args) {
                    		context = context || this;
                    		return new Promise(function (resolve, reject) {
                    			args.push(function (error, result) {
                    				if (error)
                    					return reject(error);
                    				else
                    					return resolve(result);
                    			});
                    			fn.apply(context, args);
                    		});
                    	};
                    }
                    
                    

                    setState und createState mit Promise-Kapselung:

                    	var 
                    		$setState = promisify(setState),
                    		$createState = promisify(createState)
                    		;
                    
                    

                    –-

                    Deine Programmlogik ist mir noch nicht 100% klar, aber ausgehend von dem Code http://forum.iobroker.net/viewtopic.php?p=63432#p63432, könntest du es mal so probieren:

                    	// Datenpunkte in ein Array aus Promises umwandeln
                    	var createDPs = datenpunkteArr.map(function(dp) {
                    		return $createState(dp.name, dp.initialValue, dp.forceCreation, dp.common);
                    	});
                    	// Auf Ausführung warten
                    	Promise.all(createDPs)
                    		.then(function() {
                    			// dann mit der Logik weitermachen, z.B. States füllen (geht ähnlich, siehe einer meiner früheren Posts)
                    			// oder Subscriptions starten
                    
                    			// TODO
                    		});
                    
                    

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

                    1 Antwort Letzte Antwort
                    0
                    • ruhr70R Offline
                      ruhr70R Offline
                      ruhr70
                      schrieb am zuletzt editiert von
                      #31

                      Puh… Danke!!!

                      na, da habe ich ja was zu tun ;-)

                      Adapter: Fritzbox, Unify Circuit
                      Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

                      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

                      788

                      Online

                      32.4k

                      Benutzer

                      81.5k

                      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