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. JavaScript
  5. Problem mit await setStateAsync()

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    22
    1
    1.1k

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.4k

Problem mit await setStateAsync()

Geplant Angeheftet Gesperrt Verschoben JavaScript
8 Beiträge 3 Kommentatoren 1.7k Aufrufe 5 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.
  • F Offline
    F Offline
    fastfoot
    schrieb am zuletzt editiert von fastfoot
    #1

    Hallo,
    jetzt dachte ich, dass ich es verstanden habe, aber es funktioniert nicht wie von mir erwartet. Wenn ich await setStateAsync() aufrufe, sollte doch ein anschliessendes getState() korrekte Werte liefern, oder liege ich da falsch?
    Ohne zusätzliches wait() in Zeile 12 wirft JSON.parse() in Zeile 13 einen Fehler, weil die Werte wohl noch nicht fertig geschrieben sind. Mit funktioniert alles

    Edit: Nach einem Neustart des Systems war es wesentlich schneller, so dass ich das gezeigte mit den wenigen zu schreibenden Daten im Beispiel nicht mehr nachvollziehen kann. Mit den Originaldaten(>1000 Datensätze) bleibt das Beschriebene aber

    (JS-Adapter: 4.9.7, Node: 14.15.0, NPM: 6.14.8)

    async function getData() {
        await setStateAsync('0_userdata.0.example_state', '');
        await setStateAsync('0_userdata.0.example_state', '{"A":1,"B":2}');
        return true;
    }
    
    async function main(refresh = false) {
        if(refresh){
            if(!await getData()) return log('No data');
        }
        //ohne wait() Fehler bei JSON.parse(getState())
        //await wait(100);
        let x = JSON.parse(getState('0_userdata.0.example_state').val);
        log(x)
    }
    
    main(true);
    
    14:08:42.588	info	javascript.0 (12740) Start javascript script.js.Aktiv.tst
    14:08:42.593	info	javascript.0 (12740) script.js.Aktiv.tst: registered 0 subscriptions and 0 schedules
    14:08:42.643	error	javascript.0 (12740) script.js.Aktiv.tst: SyntaxError: Unexpected end of JSON input
    14:08:42.644	error	javascript.0 (12740) at b (script.js.Aktiv.tst:13:18)
    

    iobroker läuft unter Docker auf QNAP TS-451+
    SkriptRecovery: https://forum.iobroker.net/post/930558

    liv-in-skyL AlCalzoneA 2 Antworten Letzte Antwort
    0
    • F fastfoot

      Hallo,
      jetzt dachte ich, dass ich es verstanden habe, aber es funktioniert nicht wie von mir erwartet. Wenn ich await setStateAsync() aufrufe, sollte doch ein anschliessendes getState() korrekte Werte liefern, oder liege ich da falsch?
      Ohne zusätzliches wait() in Zeile 12 wirft JSON.parse() in Zeile 13 einen Fehler, weil die Werte wohl noch nicht fertig geschrieben sind. Mit funktioniert alles

      Edit: Nach einem Neustart des Systems war es wesentlich schneller, so dass ich das gezeigte mit den wenigen zu schreibenden Daten im Beispiel nicht mehr nachvollziehen kann. Mit den Originaldaten(>1000 Datensätze) bleibt das Beschriebene aber

      (JS-Adapter: 4.9.7, Node: 14.15.0, NPM: 6.14.8)

      async function getData() {
          await setStateAsync('0_userdata.0.example_state', '');
          await setStateAsync('0_userdata.0.example_state', '{"A":1,"B":2}');
          return true;
      }
      
      async function main(refresh = false) {
          if(refresh){
              if(!await getData()) return log('No data');
          }
          //ohne wait() Fehler bei JSON.parse(getState())
          //await wait(100);
          let x = JSON.parse(getState('0_userdata.0.example_state').val);
          log(x)
      }
      
      main(true);
      
      14:08:42.588	info	javascript.0 (12740) Start javascript script.js.Aktiv.tst
      14:08:42.593	info	javascript.0 (12740) script.js.Aktiv.tst: registered 0 subscriptions and 0 schedules
      14:08:42.643	error	javascript.0 (12740) script.js.Aktiv.tst: SyntaxError: Unexpected end of JSON input
      14:08:42.644	error	javascript.0 (12740) at b (script.js.Aktiv.tst:13:18)
      
      liv-in-skyL Offline
      liv-in-skyL Offline
      liv-in-sky
      schrieb am zuletzt editiert von
      #2

      @fastfoot

      wie sieht es damit aus

         if(!(await getData())) return log('No data');
      

      nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

      F 1 Antwort Letzte Antwort
      0
      • F fastfoot

        Hallo,
        jetzt dachte ich, dass ich es verstanden habe, aber es funktioniert nicht wie von mir erwartet. Wenn ich await setStateAsync() aufrufe, sollte doch ein anschliessendes getState() korrekte Werte liefern, oder liege ich da falsch?
        Ohne zusätzliches wait() in Zeile 12 wirft JSON.parse() in Zeile 13 einen Fehler, weil die Werte wohl noch nicht fertig geschrieben sind. Mit funktioniert alles

        Edit: Nach einem Neustart des Systems war es wesentlich schneller, so dass ich das gezeigte mit den wenigen zu schreibenden Daten im Beispiel nicht mehr nachvollziehen kann. Mit den Originaldaten(>1000 Datensätze) bleibt das Beschriebene aber

        (JS-Adapter: 4.9.7, Node: 14.15.0, NPM: 6.14.8)

        async function getData() {
            await setStateAsync('0_userdata.0.example_state', '');
            await setStateAsync('0_userdata.0.example_state', '{"A":1,"B":2}');
            return true;
        }
        
        async function main(refresh = false) {
            if(refresh){
                if(!await getData()) return log('No data');
            }
            //ohne wait() Fehler bei JSON.parse(getState())
            //await wait(100);
            let x = JSON.parse(getState('0_userdata.0.example_state').val);
            log(x)
        }
        
        main(true);
        
        14:08:42.588	info	javascript.0 (12740) Start javascript script.js.Aktiv.tst
        14:08:42.593	info	javascript.0 (12740) script.js.Aktiv.tst: registered 0 subscriptions and 0 schedules
        14:08:42.643	error	javascript.0 (12740) script.js.Aktiv.tst: SyntaxError: Unexpected end of JSON input
        14:08:42.644	error	javascript.0 (12740) at b (script.js.Aktiv.tst:13:18)
        
        AlCalzoneA Offline
        AlCalzoneA Offline
        AlCalzone
        Developer
        schrieb am zuletzt editiert von
        #3

        @fastfoot sagte in Problem mit await setStateAsync():

        sollte doch ein anschliessendes getState() korrekte Werte liefern, oder liege ich da falsch?

        Probier es bitte mal mit await getStateAsync statt getState. Nicht auszuschließen, dass der Cache im Skript-Adapter hier auf die Parade regnet.

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

        F 1 Antwort Letzte Antwort
        0
        • liv-in-skyL liv-in-sky

          @fastfoot

          wie sieht es damit aus

             if(!(await getData())) return log('No data');
          
          F Offline
          F Offline
          fastfoot
          schrieb am zuletzt editiert von
          #4

          @liv-in-sky sagte in Problem mit await setStateAsync():

          @fastfoot

          wie sieht es damit aus

             if(!(await getData())) return log('No data');
          

          Im Original habe ich es tatsächlich so wie von dir gezeigt, und denke mittlerweile auch dass das so richtig ist.

          iobroker läuft unter Docker auf QNAP TS-451+
          SkriptRecovery: https://forum.iobroker.net/post/930558

          1 Antwort Letzte Antwort
          0
          • AlCalzoneA AlCalzone

            @fastfoot sagte in Problem mit await setStateAsync():

            sollte doch ein anschliessendes getState() korrekte Werte liefern, oder liege ich da falsch?

            Probier es bitte mal mit await getStateAsync statt getState. Nicht auszuschließen, dass der Cache im Skript-Adapter hier auf die Parade regnet.

            F Offline
            F Offline
            fastfoot
            schrieb am zuletzt editiert von
            #5

            @AlCalzone sagte in Problem mit await setStateAsync():

            @fastfoot sagte in Problem mit await setStateAsync():

            sollte doch ein anschliessendes getState() korrekte Werte liefern, oder liege ich da falsch?

            Probier es bitte mal mit await getStateAsync statt getState. Nicht auszuschließen, dass der Cache im Skript-Adapter hier auf die Parade regnet.

            Danke, das funktioniert zuverlässig! Es verwirrt mich allerdings ziemlich :-(

            Was mich etwas 'stört' an dieser ganzen async/await Sache, gefühlt steht jetzt überall await vor den Funktionen. Ist das meinem Programmierverhalten in herkömmlichen Sprachen geschuldet und sollte ich das ändern, damit es besser zu der Asynchronizität von JS passt? Zur Zeit habe ich etwas das Gefühl dass ich JS dadurch nicht voll in seinen Möglichkeiten ausschöpfe?

            Noch etwas ist mir aufgefallen und hat mich viel Zeit gekostet: Mit getState() kann ich id-Akürzungen für States in z.B. javascript.0 benutzen, also getState('test'), mit getStateAsync() muss ich zwingend getStateAsync('javascript.0.test') benutzen. Scheint dass das jetzt zukünftig meine BestPractice wird :-)

            Ausserdem muss man scheinbar Klammern nutzen, um einen Wert bei getStateAsync() zu erhalten also let x = (await getStateAsync(id)).val. Ist das korrekt?

            iobroker läuft unter Docker auf QNAP TS-451+
            SkriptRecovery: https://forum.iobroker.net/post/930558

            AlCalzoneA 1 Antwort Letzte Antwort
            0
            • F fastfoot

              @AlCalzone sagte in Problem mit await setStateAsync():

              @fastfoot sagte in Problem mit await setStateAsync():

              sollte doch ein anschliessendes getState() korrekte Werte liefern, oder liege ich da falsch?

              Probier es bitte mal mit await getStateAsync statt getState. Nicht auszuschließen, dass der Cache im Skript-Adapter hier auf die Parade regnet.

              Danke, das funktioniert zuverlässig! Es verwirrt mich allerdings ziemlich :-(

              Was mich etwas 'stört' an dieser ganzen async/await Sache, gefühlt steht jetzt überall await vor den Funktionen. Ist das meinem Programmierverhalten in herkömmlichen Sprachen geschuldet und sollte ich das ändern, damit es besser zu der Asynchronizität von JS passt? Zur Zeit habe ich etwas das Gefühl dass ich JS dadurch nicht voll in seinen Möglichkeiten ausschöpfe?

              Noch etwas ist mir aufgefallen und hat mich viel Zeit gekostet: Mit getState() kann ich id-Akürzungen für States in z.B. javascript.0 benutzen, also getState('test'), mit getStateAsync() muss ich zwingend getStateAsync('javascript.0.test') benutzen. Scheint dass das jetzt zukünftig meine BestPractice wird :-)

              Ausserdem muss man scheinbar Klammern nutzen, um einen Wert bei getStateAsync() zu erhalten also let x = (await getStateAsync(id)).val. Ist das korrekt?

              AlCalzoneA Offline
              AlCalzoneA Offline
              AlCalzone
              Developer
              schrieb am zuletzt editiert von
              #6

              @fastfoot sagte in Problem mit await setStateAsync():

              Was mich etwas 'stört' an dieser ganzen async/await Sache, gefühlt steht jetzt überall await vor den Funktionen.

              Das ist völlig normal - du solltest mal sehen, wie viel ich das in meinem Code nutze.

              Das eigentliche Problem mit dem getState liegt daran, dass der Adapter eigentlich alle States zwischenspeichert und synchronisiert, sodass du in Skripten synchron und ohne Callback darauf zugreifen kannst. Das scheint allerdings nicht immer zuverlässig zu gehen. Müsste sich mal jemand ansehen.

              @fastfoot sagte in Problem mit await setStateAsync():

              Ausserdem muss man scheinbar Klammern nutzen, um einen Wert bei getStateAsync() zu erhalten

              Das leider korrekt.

              @fastfoot sagte in Problem mit await setStateAsync():

              mit getStateAsync() muss ich zwingend getStateAsync('javascript.0.test') benutzen

              Das sollte eigentlich nicht sein. Ist test nur ein Beispiel oder ein State, bei dem es nicht geht? Sind in den betroffenen IDs Punkte enthalten?

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

              F 1 Antwort Letzte Antwort
              0
              • AlCalzoneA AlCalzone

                @fastfoot sagte in Problem mit await setStateAsync():

                Was mich etwas 'stört' an dieser ganzen async/await Sache, gefühlt steht jetzt überall await vor den Funktionen.

                Das ist völlig normal - du solltest mal sehen, wie viel ich das in meinem Code nutze.

                Das eigentliche Problem mit dem getState liegt daran, dass der Adapter eigentlich alle States zwischenspeichert und synchronisiert, sodass du in Skripten synchron und ohne Callback darauf zugreifen kannst. Das scheint allerdings nicht immer zuverlässig zu gehen. Müsste sich mal jemand ansehen.

                @fastfoot sagte in Problem mit await setStateAsync():

                Ausserdem muss man scheinbar Klammern nutzen, um einen Wert bei getStateAsync() zu erhalten

                Das leider korrekt.

                @fastfoot sagte in Problem mit await setStateAsync():

                mit getStateAsync() muss ich zwingend getStateAsync('javascript.0.test') benutzen

                Das sollte eigentlich nicht sein. Ist test nur ein Beispiel oder ein State, bei dem es nicht geht? Sind in den betroffenen IDs Punkte enthalten?

                F Offline
                F Offline
                fastfoot
                schrieb am zuletzt editiert von
                #7

                @AlCalzone sagte in Problem mit await setStateAsync():

                Das ist völlig normal - du solltest mal sehen, wie viel ich das in meinem Code nutze.

                na das beruhigt mich, als Anfänger in JS habe ich immer Zweifel

                Müsste sich mal jemand ansehen.

                soll ich ein issue aufmachen?

                @fastfoot sagte in Problem mit await setStateAsync():

                mit getStateAsync() muss ich zwingend getStateAsync('javascript.0.test') benutzen

                Das sollte eigentlich nicht sein. Ist test nur ein Beispiel oder ein State, bei dem es nicht geht? Sind in den betroffenen IDs Punkte enthalten?

                nee, habe es mit genau der ID probiert. was mich soviel Zeit gekostet hat war dass ich in obigem Beispiel 0_userdata.... benutzt hatte, in meinem Originalcode jedoch nach javascript.0.xxxx schreibe. Nach der Änderung zu getStateAsync() hatte ich aber immer noch die verkürzte ID benutzt und nur Fehler bekommen, die gleich/ähnlich dem Timingfehler waren :-( ==> Jetzt kann ich diesen Fehler nicht mehr reproduzieren wenn tst im root von javascript.0 liegt. Aber wenn ich von Tests.tst lese schon, dann muss ich javascript.0.Tests.tst nehmen mit getStateAsync()
                Hier nochmal das umgebaute Skript mit Kommentaren und Datengenerator für den Timing Fehler nach await setState()

                async function getData(){
                    let x = [];
                    for(let i = 0; i < 5e0; i++){
                        x.push({"A":i,"B":i+1})
                    }
                    await setStateAsync('javascript.0.Tests.tst', '');
                    await setStateAsync('javascript.0.Tests.tst', JSON.stringify(x));
                    return true;
                }
                
                async function main(refresh = false){
                    if(refresh){
                        if(!(await getData())) return log('No data');
                    }
                    //ohne wait() Timing Fehler 
                    //await wait(500);
                    //let x = JSON.parse(getState('Tests.tst').val);
                
                    //funktioniert ohne wait(), benötigt vollen Pfad
                    let x = JSON.parse((await getStateAsync('javascript.0.Tests.tst')).val);
                    
                    //verkürzte ID wirft Fehler
                    //let x = JSON.parse((await getStateAsync('Tests.tst')).val);
                    log(x)
                }
                
                main(true);
                

                iobroker läuft unter Docker auf QNAP TS-451+
                SkriptRecovery: https://forum.iobroker.net/post/930558

                AlCalzoneA 1 Antwort Letzte Antwort
                0
                • F fastfoot

                  @AlCalzone sagte in Problem mit await setStateAsync():

                  Das ist völlig normal - du solltest mal sehen, wie viel ich das in meinem Code nutze.

                  na das beruhigt mich, als Anfänger in JS habe ich immer Zweifel

                  Müsste sich mal jemand ansehen.

                  soll ich ein issue aufmachen?

                  @fastfoot sagte in Problem mit await setStateAsync():

                  mit getStateAsync() muss ich zwingend getStateAsync('javascript.0.test') benutzen

                  Das sollte eigentlich nicht sein. Ist test nur ein Beispiel oder ein State, bei dem es nicht geht? Sind in den betroffenen IDs Punkte enthalten?

                  nee, habe es mit genau der ID probiert. was mich soviel Zeit gekostet hat war dass ich in obigem Beispiel 0_userdata.... benutzt hatte, in meinem Originalcode jedoch nach javascript.0.xxxx schreibe. Nach der Änderung zu getStateAsync() hatte ich aber immer noch die verkürzte ID benutzt und nur Fehler bekommen, die gleich/ähnlich dem Timingfehler waren :-( ==> Jetzt kann ich diesen Fehler nicht mehr reproduzieren wenn tst im root von javascript.0 liegt. Aber wenn ich von Tests.tst lese schon, dann muss ich javascript.0.Tests.tst nehmen mit getStateAsync()
                  Hier nochmal das umgebaute Skript mit Kommentaren und Datengenerator für den Timing Fehler nach await setState()

                  async function getData(){
                      let x = [];
                      for(let i = 0; i < 5e0; i++){
                          x.push({"A":i,"B":i+1})
                      }
                      await setStateAsync('javascript.0.Tests.tst', '');
                      await setStateAsync('javascript.0.Tests.tst', JSON.stringify(x));
                      return true;
                  }
                  
                  async function main(refresh = false){
                      if(refresh){
                          if(!(await getData())) return log('No data');
                      }
                      //ohne wait() Timing Fehler 
                      //await wait(500);
                      //let x = JSON.parse(getState('Tests.tst').val);
                  
                      //funktioniert ohne wait(), benötigt vollen Pfad
                      let x = JSON.parse((await getStateAsync('javascript.0.Tests.tst')).val);
                      
                      //verkürzte ID wirft Fehler
                      //let x = JSON.parse((await getStateAsync('Tests.tst')).val);
                      log(x)
                  }
                  
                  main(true);
                  
                  AlCalzoneA Offline
                  AlCalzoneA Offline
                  AlCalzone
                  Developer
                  schrieb am zuletzt editiert von
                  #8

                  @fastfoot sagte in Problem mit await setStateAsync():

                  Jetzt kann ich diesen Fehler nicht mehr reproduzieren wenn tst im root von javascript.0 liegt.

                  Das deckt sich mit dem was ich im Code gesehen habe. Ist etwas ungeschickt, das könnte man bestimmt abhängig vom Adapterpräfix machen

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

                  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

                  919

                  Online

                  32.5k

                  Benutzer

                  81.6k

                  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