Skip to content
  • Home
  • 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
ioBroker Logo

Community Forum

  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Problem mit await setStateAsync()

NEWS

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

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

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

Problem mit await setStateAsync()

Scheduled Pinned Locked Moved JavaScript
8 Posts 3 Posters 1.6k Views 5 Watching
  • 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.
  • F Offline
    F Offline
    fastfoot
    wrote on last edited by 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 Replies Last reply
    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
      wrote on last edited by
      #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 Reply Last reply
      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
        wrote on last edited by
        #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 Reply Last reply
        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
          wrote on last edited by
          #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 Reply Last reply
          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
            wrote on last edited by
            #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 Reply Last reply
            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
              wrote on last edited by
              #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 Reply Last reply
              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
                wrote on last edited by
                #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 Reply Last reply
                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
                  wrote on last edited by
                  #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 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

                  291

                  Online

                  32.4k

                  Users

                  81.4k

                  Topics

                  1.3m

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

                  • Don't have an account? Register

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