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

  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. scriptedEnabled - Problem bei Abfrage

NEWS

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

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

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

scriptedEnabled - Problem bei Abfrage

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascript
51 Beiträge 4 Kommentatoren 3.6k 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.
  • liv-in-skyL liv-in-sky

    @paul53

    bin vor lauter frust in den regen raus und habe die blätter vom garten entsorgt - dieses await ... bekomme ich einfach nicht hin

    habe den link von @AlCalzone 20mal gelesen und das ganze script mit funktionen gemacht und wollte am ende eine .then kette machen

    die function kannte ich nicht - werd die sofort mal testen

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

    @liv-in-sky sagte:

    die function kannte ich nicht

    Ich auch nicht: Ist erst seit 9. Oktober dokumentiert.

    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 Antwort Letzte Antwort
    0
    • liv-in-skyL liv-in-sky

      @paul53

      bin vor lauter frust in den regen raus und habe die blätter vom garten entsorgt - dieses await ... bekomme ich einfach nicht hin

      habe den link von @AlCalzone 20mal gelesen und das ganze script mit funktionen gemacht und wollte am ende eine .then kette machen

      die function kannte ich nicht - werd die sofort mal testen

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

      @liv-in-sky sagte in scriptedEnabled - Problem bei Abfrage:

      bin vor lauter frust in den regen raus und habe die blätter vom garten entsorgt - dieses await ... bekomme ich einfach nicht hin

      Auch wenn es eine einfachere Lösung gibt, vielleicht zeigst du mal was du hattest. So schwer ist es eigentlich nicht.
      Wenn ne Funktion einen Promise zurückgibt, rufst du sie mit await davor auf. Dazu muss die Funktion, in der await verwendet wird, async sein. Ansonsten wird der Code geschrieben wie synchroner Code.

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

      liv-in-skyL 1 Antwort Letzte Antwort
      1
      • AlCalzoneA AlCalzone

        @liv-in-sky sagte in scriptedEnabled - Problem bei Abfrage:

        bin vor lauter frust in den regen raus und habe die blätter vom garten entsorgt - dieses await ... bekomme ich einfach nicht hin

        Auch wenn es eine einfachere Lösung gibt, vielleicht zeigst du mal was du hattest. So schwer ist es eigentlich nicht.
        Wenn ne Funktion einen Promise zurückgibt, rufst du sie mit await davor auf. Dazu muss die Funktion, in der await verwendet wird, async sein. Ansonsten wird der Code geschrieben wie synchroner Code.

        liv-in-skyL Offline
        liv-in-skyL Offline
        liv-in-sky
        schrieb am zuletzt editiert von liv-in-sky
        #31

        @AlCalzone

        erst mal danke für deine hilfe für dein angebot - darauf komme ich noch zurück - brauch jetzt erstmal eine pause
        bei der anderen version, hatte ich das problem, dass ich eine function hatte, in der ich mit await getStateAsync(id)).val das enabled suche - dann wollte ich aber, dass diese function ein ein promise bringt, wenn sie fertig ist und dann erst der datenpunkt geschrieben wird - ich konnte kein new promise einfügen, weil dann await getStateAsync(id)).val einen fehler anzeigte

        ung. so:

         asyncfunction writeStuff() {
        return new Promise((resolve) => {......
                                       ....... await    lookForEnabled(pfad)                                        
         resolve()
        

        hier kam ein fehler und await war nicht mehr erlaubt

        meine jetzige lösung sieht so aus (hoffe, die ist richtig):

        sammleDaten().then(writeStuff).then( function() { setState("javascript."+instance+".CheckScript.jsonSubScript",JSON.stringify(mxJson))
                                                       log(JSON.stringify(mxJson))})
        

        sammleDaten (liest scripte aus filesystem und versucht die trigger daraus zu finden - schreibt ein arr mit gefundenen non-existent datenpunkten) und writeStuff (checkt script_enabled und macht json für vis-datenpunkt )- beide functionen haben ein promise bekommen und ein resolve

        damit der datenpunkt zum richtigen zeitpunkt geschrieben wird

        @paul53 - die function hat das ganze extrem vereinfacht - nochmals danke dafür

        ergebnis schaut richtig aus:

        Image 8.png

        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

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

          @AlCalzone

          erst mal danke für deine hilfe für dein angebot - darauf komme ich noch zurück - brauch jetzt erstmal eine pause
          bei der anderen version, hatte ich das problem, dass ich eine function hatte, in der ich mit await getStateAsync(id)).val das enabled suche - dann wollte ich aber, dass diese function ein ein promise bringt, wenn sie fertig ist und dann erst der datenpunkt geschrieben wird - ich konnte kein new promise einfügen, weil dann await getStateAsync(id)).val einen fehler anzeigte

          ung. so:

           asyncfunction writeStuff() {
          return new Promise((resolve) => {......
                                         ....... await    lookForEnabled(pfad)                                        
           resolve()
          

          hier kam ein fehler und await war nicht mehr erlaubt

          meine jetzige lösung sieht so aus (hoffe, die ist richtig):

          sammleDaten().then(writeStuff).then( function() { setState("javascript."+instance+".CheckScript.jsonSubScript",JSON.stringify(mxJson))
                                                         log(JSON.stringify(mxJson))})
          

          sammleDaten (liest scripte aus filesystem und versucht die trigger daraus zu finden - schreibt ein arr mit gefundenen non-existent datenpunkten) und writeStuff (checkt script_enabled und macht json für vis-datenpunkt )- beide functionen haben ein promise bekommen und ein resolve

          damit der datenpunkt zum richtigen zeitpunkt geschrieben wird

          @paul53 - die function hat das ganze extrem vereinfacht - nochmals danke dafür

          ergebnis schaut richtig aus:

          Image 8.png

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

          @liv-in-sky sagte in scriptedEnabled - Problem bei Abfrage:

          async function writeStuff() {
          return new Promise((resolve) => {......

                                      ....... await    lookForEnabled(pfad)                                        
          

          resolve()

          Zwei Fehler hast du hier:

          1. Eine async-Funktion braucht nicht explizit einen Promise zurückgeben. In 99% der Fälle ist es sogar einfach nur falsch. Das was ich oben sehe, kannst du wie folgt eindampfen:
          async function writeStuff() {
            // ...
            await lookForEnabled(pfad);
          }
          
          1. Wenn es unbedingt sein muss, await doch in einem Promise zu kapseln (z.B. weil du zusätzlich eine Callback-API nutzt), muss die Promise-"Callback"-Funktion als async definiert werden, nicht die außenrum:
          function foobar() {
            return new Promise(async (resolve) => {
              await irgendwas;
              irgendwasMitCallback(() => resolve());
            });
          });
          

          Meistens lässt sich das aber eleganter trennen.


          meine jetzige lösung sieht so aus

          Würde ich in etwa so machen (besser lesbar und mischt nicht async/await mit .then()-Ketten):

          async function doStuff() {
          	await sammleDaten();
          	await writeStuff();
          	// ^ Hier sollten vermutlich Daten zwischen den Methoden übergeben werden,
          	// damit keine globalen Variablen missbraucht werden
          	// const daten = await sammleDaten();
          	// await writeStuff(daten)
          	const stringified = JSON.stringify(mxJson);
          	await setStateAsync("javascript."+instance+".CheckScript.jsonSubScript", stringified);
          	log(stringified);
          }
          

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

          liv-in-skyL 3 Antworten Letzte Antwort
          0
          • AlCalzoneA AlCalzone

            @liv-in-sky sagte in scriptedEnabled - Problem bei Abfrage:

            async function writeStuff() {
            return new Promise((resolve) => {......

                                        ....... await    lookForEnabled(pfad)                                        
            

            resolve()

            Zwei Fehler hast du hier:

            1. Eine async-Funktion braucht nicht explizit einen Promise zurückgeben. In 99% der Fälle ist es sogar einfach nur falsch. Das was ich oben sehe, kannst du wie folgt eindampfen:
            async function writeStuff() {
              // ...
              await lookForEnabled(pfad);
            }
            
            1. Wenn es unbedingt sein muss, await doch in einem Promise zu kapseln (z.B. weil du zusätzlich eine Callback-API nutzt), muss die Promise-"Callback"-Funktion als async definiert werden, nicht die außenrum:
            function foobar() {
              return new Promise(async (resolve) => {
                await irgendwas;
                irgendwasMitCallback(() => resolve());
              });
            });
            

            Meistens lässt sich das aber eleganter trennen.


            meine jetzige lösung sieht so aus

            Würde ich in etwa so machen (besser lesbar und mischt nicht async/await mit .then()-Ketten):

            async function doStuff() {
            	await sammleDaten();
            	await writeStuff();
            	// ^ Hier sollten vermutlich Daten zwischen den Methoden übergeben werden,
            	// damit keine globalen Variablen missbraucht werden
            	// const daten = await sammleDaten();
            	// await writeStuff(daten)
            	const stringified = JSON.stringify(mxJson);
            	await setStateAsync("javascript."+instance+".CheckScript.jsonSubScript", stringified);
            	log(stringified);
            }
            
            liv-in-skyL Offline
            liv-in-skyL Offline
            liv-in-sky
            schrieb am zuletzt editiert von
            #33

            @AlCalzone sagte in scriptedEnabled - Problem bei Abfrage:

            Würde ich in etwa so machen (besser lesbar und mischt nicht async/await mit .then()-Ketten):
            async function doStuff() { await sammleDaten(); await writeStuff(); // ^ Hier sollten vermutlich Daten zwischen den Methoden übergeben werden, // damit keine globalen Variablen missbraucht werden // const daten = await sammleDaten(); // await writeStuff(daten) const stringified = JSON.stringify(mxJson); await setStateAsync("javascript."+instance+".CheckScript.jsonSubScript", stringified); log(stringified); }

            funktioniert - und leuchtet sogar mir ein :-)

            vielen dank für deine unterstützung

            jetzt kann ich mich wieder auf das eigentliche script konzentrieren - das herausfiltern der trigger

            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

            1 Antwort Letzte Antwort
            1
            • AlCalzoneA AlCalzone

              @liv-in-sky sagte in scriptedEnabled - Problem bei Abfrage:

              async function writeStuff() {
              return new Promise((resolve) => {......

                                          ....... await    lookForEnabled(pfad)                                        
              

              resolve()

              Zwei Fehler hast du hier:

              1. Eine async-Funktion braucht nicht explizit einen Promise zurückgeben. In 99% der Fälle ist es sogar einfach nur falsch. Das was ich oben sehe, kannst du wie folgt eindampfen:
              async function writeStuff() {
                // ...
                await lookForEnabled(pfad);
              }
              
              1. Wenn es unbedingt sein muss, await doch in einem Promise zu kapseln (z.B. weil du zusätzlich eine Callback-API nutzt), muss die Promise-"Callback"-Funktion als async definiert werden, nicht die außenrum:
              function foobar() {
                return new Promise(async (resolve) => {
                  await irgendwas;
                  irgendwasMitCallback(() => resolve());
                });
              });
              

              Meistens lässt sich das aber eleganter trennen.


              meine jetzige lösung sieht so aus

              Würde ich in etwa so machen (besser lesbar und mischt nicht async/await mit .then()-Ketten):

              async function doStuff() {
              	await sammleDaten();
              	await writeStuff();
              	// ^ Hier sollten vermutlich Daten zwischen den Methoden übergeben werden,
              	// damit keine globalen Variablen missbraucht werden
              	// const daten = await sammleDaten();
              	// await writeStuff(daten)
              	const stringified = JSON.stringify(mxJson);
              	await setStateAsync("javascript."+instance+".CheckScript.jsonSubScript", stringified);
              	log(stringified);
              }
              
              liv-in-skyL Offline
              liv-in-skyL Offline
              liv-in-sky
              schrieb am zuletzt editiert von
              #34

              @AlCalzone

              es muss ich dich leider nochmal bemühen:

              ich wollt auch einen datenpunkt anlegen und/oder beschreiben am anfang - habe es tatsächlich geschafft, den adapter zum neustart zu bringen

              async function doStuff() {
                  // if (await !existsStateAsync("javascript."+instance+".CheckScript.jsonSubScript")) {
                  //     await createStateAsync("CheckScript.jsonSubScript", '[{"dp":"noch nicht da","enabled":"","script":""}]',
                  //                     {type: 'string', name: 'jsonSubScript', role: 'value', read: true , write: true} );}
                  await createStateAsync("CheckScript.jsonSubScript", '[{"dp":"noch nicht da","enabled":"","script":""}]',
                                        {type: 'string', name: 'jsonSubScript', role: 'value', read: true , write: true} );
                  await setStateAsync("javascript."+instance+".CheckScript.jsonSubScript",'[{"dp":"noch nicht da","enabled":"","script":""}]')  //}      
              	await sammleDaten();
              	await writeStuff();
              	// ^ Hier sollten vermutlich Daten zwischen den Methoden übergeben werden,
              	// damit keine globalen Variablen missbraucht werden
              	// const daten = await sammleDaten();
              	// await writeStuff(daten)
                  //await wait(5000);
              	const stringified = JSON.stringify(mxJson);
              	await setStateAsync("javascript."+instance+".CheckScript.jsonSubScript", stringified);
              	log(stringified);
              }
              
              doStuff()
              
              

              diese version läuft einmal und beim 2ten mal, wenn der dp existiert, crasht der adapter.
              die auskommentierte version war ein versuch vorher zu abzufragen - scheitert aber auch

              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

              1 Antwort Letzte Antwort
              0
              • AlCalzoneA AlCalzone

                @liv-in-sky sagte in scriptedEnabled - Problem bei Abfrage:

                async function writeStuff() {
                return new Promise((resolve) => {......

                                            ....... await    lookForEnabled(pfad)                                        
                

                resolve()

                Zwei Fehler hast du hier:

                1. Eine async-Funktion braucht nicht explizit einen Promise zurückgeben. In 99% der Fälle ist es sogar einfach nur falsch. Das was ich oben sehe, kannst du wie folgt eindampfen:
                async function writeStuff() {
                  // ...
                  await lookForEnabled(pfad);
                }
                
                1. Wenn es unbedingt sein muss, await doch in einem Promise zu kapseln (z.B. weil du zusätzlich eine Callback-API nutzt), muss die Promise-"Callback"-Funktion als async definiert werden, nicht die außenrum:
                function foobar() {
                  return new Promise(async (resolve) => {
                    await irgendwas;
                    irgendwasMitCallback(() => resolve());
                  });
                });
                

                Meistens lässt sich das aber eleganter trennen.


                meine jetzige lösung sieht so aus

                Würde ich in etwa so machen (besser lesbar und mischt nicht async/await mit .then()-Ketten):

                async function doStuff() {
                	await sammleDaten();
                	await writeStuff();
                	// ^ Hier sollten vermutlich Daten zwischen den Methoden übergeben werden,
                	// damit keine globalen Variablen missbraucht werden
                	// const daten = await sammleDaten();
                	// await writeStuff(daten)
                	const stringified = JSON.stringify(mxJson);
                	await setStateAsync("javascript."+instance+".CheckScript.jsonSubScript", stringified);
                	log(stringified);
                }
                
                liv-in-skyL Offline
                liv-in-skyL Offline
                liv-in-sky
                schrieb am zuletzt editiert von
                #35

                @AlCalzone

                so wird wenigstens der error abgefangen - gibt es da eine andere lösung?

                     try {
                    await createStateAsync("CheckScript.jsonSubScript", '[{"dp":"noch nicht da","enabled":"","script":""}]',
                                          {type: 'string', name: 'jsonSubScript', role: 'value', read: true , write: true} );
                     } catch (error) {
                        log(`Unexpected error - ${error}`, 'error');
                    }
                    await setStateAsync("javascript."+instance+".CheckScript.jsonSubScript",'[{"dp":"noch nicht da","enabled":"","script":""}]')  //}      
                	await sammleDaten();
                	await writeStuff();
                	// ^ Hier sollten vermutlich Daten zwischen den Methoden übergeben werden,
                	// damit keine globalen Variablen missbraucht werden
                	// const daten = await sammleDaten();
                	// await writeStuff(daten)
                    //await wait(5000);
                	const stringified = JSON.stringify(mxJson);
                	await setStateAsync("javascript."+instance+".CheckScript.jsonSubScript", stringified);
                	log(stringified);
                }
                
                doStuff()
                
                

                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

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

                  @AlCalzone

                  so wird wenigstens der error abgefangen - gibt es da eine andere lösung?

                       try {
                      await createStateAsync("CheckScript.jsonSubScript", '[{"dp":"noch nicht da","enabled":"","script":""}]',
                                            {type: 'string', name: 'jsonSubScript', role: 'value', read: true , write: true} );
                       } catch (error) {
                          log(`Unexpected error - ${error}`, 'error');
                      }
                      await setStateAsync("javascript."+instance+".CheckScript.jsonSubScript",'[{"dp":"noch nicht da","enabled":"","script":""}]')  //}      
                  	await sammleDaten();
                  	await writeStuff();
                  	// ^ Hier sollten vermutlich Daten zwischen den Methoden übergeben werden,
                  	// damit keine globalen Variablen missbraucht werden
                  	// const daten = await sammleDaten();
                  	// await writeStuff(daten)
                      //await wait(5000);
                  	const stringified = JSON.stringify(mxJson);
                  	await setStateAsync("javascript."+instance+".CheckScript.jsonSubScript", stringified);
                  	log(stringified);
                  }
                  
                  doStuff()
                  
                  
                  AlCalzoneA Offline
                  AlCalzoneA Offline
                  AlCalzone
                  Developer
                  schrieb am zuletzt editiert von
                  #36

                  @liv-in-sky Bin gerade am nachvollziehen. CreateState gibt etwas zurück, das als Fehler interpretiert wird, wenn der State existiert

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

                  liv-in-skyL 1 Antwort Letzte Antwort
                  0
                  • AlCalzoneA AlCalzone

                    @liv-in-sky Bin gerade am nachvollziehen. CreateState gibt etwas zurück, das als Fehler interpretiert wird, wenn der State existiert

                    liv-in-skyL Offline
                    liv-in-skyL Offline
                    liv-in-sky
                    schrieb am zuletzt editiert von
                    #37

                    @AlCalzone

                    ich dachte, dass könnte wie bei createState funktionieren - da wird auch einfach drübergegangen, wenn er existiert

                    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

                    AlCalzoneA 2 Antworten Letzte Antwort
                    0
                    • liv-in-skyL liv-in-sky

                      @AlCalzone

                      ich dachte, dass könnte wie bei createState funktionieren - da wird auch einfach drübergegangen, wenn er existiert

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

                      @liv-in-sky Das Problem liegt daran, dass alle ...Async Methoden intern die nicht-Async-Varianten nutzen. Das erste Argument der Callbacks wird als Fehler interpretiert. Das stimmt auch meistens, aber createState gibt sowohl bei Fehlern als auch bei existierenden States hier einen String zurück:

                      getState(..., (err) => {
                          // Bei existierendem State: err === id
                          // Bei Fehler: err === Fehlertext
                      });
                      

                      Das entspricht aber nicht der Konvention, dass bei Callbacks der erste Parameter der Fehler ist.

                      Dein Workaround war fast richtig - beachte die Klammern hinter ! im if:

                      if (!(await existsStateAsync("javascript." + instance + ".CheckScript.jsonSubScript"))) {
                              await createStateAsync(
                                  "CheckScript.jsonSubScript",
                                  '[{"dp":"noch nicht da","enabled":"","script":""}]',
                                  {
                                      type: "string",
                                      name: "jsonSubScript",
                                      role: "value",
                                      read: true,
                                      write: true,
                                  }
                              );
                          }
                      

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

                      paul53P liv-in-skyL 2 Antworten Letzte Antwort
                      0
                      • AlCalzoneA AlCalzone

                        @liv-in-sky Das Problem liegt daran, dass alle ...Async Methoden intern die nicht-Async-Varianten nutzen. Das erste Argument der Callbacks wird als Fehler interpretiert. Das stimmt auch meistens, aber createState gibt sowohl bei Fehlern als auch bei existierenden States hier einen String zurück:

                        getState(..., (err) => {
                            // Bei existierendem State: err === id
                            // Bei Fehler: err === Fehlertext
                        });
                        

                        Das entspricht aber nicht der Konvention, dass bei Callbacks der erste Parameter der Fehler ist.

                        Dein Workaround war fast richtig - beachte die Klammern hinter ! im if:

                        if (!(await existsStateAsync("javascript." + instance + ".CheckScript.jsonSubScript"))) {
                                await createStateAsync(
                                    "CheckScript.jsonSubScript",
                                    '[{"dp":"noch nicht da","enabled":"","script":""}]',
                                    {
                                        type: "string",
                                        name: "jsonSubScript",
                                        role: "value",
                                        read: true,
                                        write: true,
                                    }
                                );
                            }
                        
                        paul53P Offline
                        paul53P Offline
                        paul53
                        schrieb am zuletzt editiert von
                        #39

                        @AlCalzone sagte:

                        if (!(await existsStateAsync("javascript." + instance + ".CheckScript.jsonSubScript"))) {

                        Sollte man es wirklich so machen, wenn ein synchrones existsState(id) existiert ?

                        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

                        AlCalzoneA 1 Antwort Letzte Antwort
                        0
                        • paul53P paul53

                          @AlCalzone sagte:

                          if (!(await existsStateAsync("javascript." + instance + ".CheckScript.jsonSubScript"))) {

                          Sollte man es wirklich so machen, wenn ein synchrones existsState(id) existiert ?

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

                          @paul53 Du musst nicht, aber das asynchrone vermeidet Probleme mit dem Cache

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

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

                            @AlCalzone

                            ich dachte, dass könnte wie bei createState funktionieren - da wird auch einfach drübergegangen, wenn er existiert

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

                            @liv-in-sky BTW, der Fix wird vermutlich ebenfalls in 4.9.5 enthalten sein:
                            https://github.com/ioBroker/ioBroker.javascript/pull/692

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

                            1 Antwort Letzte Antwort
                            0
                            • AlCalzoneA AlCalzone

                              @liv-in-sky Das Problem liegt daran, dass alle ...Async Methoden intern die nicht-Async-Varianten nutzen. Das erste Argument der Callbacks wird als Fehler interpretiert. Das stimmt auch meistens, aber createState gibt sowohl bei Fehlern als auch bei existierenden States hier einen String zurück:

                              getState(..., (err) => {
                                  // Bei existierendem State: err === id
                                  // Bei Fehler: err === Fehlertext
                              });
                              

                              Das entspricht aber nicht der Konvention, dass bei Callbacks der erste Parameter der Fehler ist.

                              Dein Workaround war fast richtig - beachte die Klammern hinter ! im if:

                              if (!(await existsStateAsync("javascript." + instance + ".CheckScript.jsonSubScript"))) {
                                      await createStateAsync(
                                          "CheckScript.jsonSubScript",
                                          '[{"dp":"noch nicht da","enabled":"","script":""}]',
                                          {
                                              type: "string",
                                              name: "jsonSubScript",
                                              role: "value",
                                              read: true,
                                              write: true,
                                          }
                                      );
                                  }
                              
                              liv-in-skyL Offline
                              liv-in-skyL Offline
                              liv-in-sky
                              schrieb am zuletzt editiert von
                              #42

                              @AlCalzone

                              das bedeutet, wenn ich in einem script selbst datenpunkte anlege, muss ich am besten immer so vorgehen und scripte gleich so wie dieses hier aufbauen -try u. catch habe ich mit deinem beispiel ersetztu und läuft

                              zusammengefaßt:
                              lauter async funktionenen , die anschliessend in einer async. hauptfunktion mit await aufgerufen werden und am ende wird die hauptfunktion aufgerufen

                              dann sollte man doch meist auf der sicheren seite sein

                              wenn ich eine api abrufe muss ich auch noch deinen tipp von oben berücksichtigen

                              function foobar() {
                                return new Promise(async (resolve) => {
                                  await irgendwas;
                                  irgendwasMitCallback(() => resolve());
                                });
                              });
                              

                              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

                              AlCalzoneA 1 Antwort Letzte Antwort
                              0
                              • AlCalzoneA AlCalzone

                                @paul53 Du musst nicht, aber das asynchrone vermeidet Probleme mit dem Cache

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

                                @AlCalzone sagte:

                                das asynchrone vermeidet Probleme mit dem Cache

                                Da gebe ich Dir recht. Mit dem States-Puffer gab es schon manchmal Probleme.

                                EDIT: Allerdings greift auch die asynchrone Version auf den Puffer zu:

                                        existsState:    function (id, callback) {
                                            if (typeof callback === 'function') {
                                                adapter.getForeignObject(id, (err, obj) =>
                                                    callback(err, obj && obj.type === 'state' && states.get(id) !== undefined));
                                

                                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 Antwort Letzte Antwort
                                0
                                • liv-in-skyL liv-in-sky

                                  @AlCalzone

                                  das bedeutet, wenn ich in einem script selbst datenpunkte anlege, muss ich am besten immer so vorgehen und scripte gleich so wie dieses hier aufbauen -try u. catch habe ich mit deinem beispiel ersetztu und läuft

                                  zusammengefaßt:
                                  lauter async funktionenen , die anschliessend in einer async. hauptfunktion mit await aufgerufen werden und am ende wird die hauptfunktion aufgerufen

                                  dann sollte man doch meist auf der sicheren seite sein

                                  wenn ich eine api abrufe muss ich auch noch deinen tipp von oben berücksichtigen

                                  function foobar() {
                                    return new Promise(async (resolve) => {
                                      await irgendwas;
                                      irgendwasMitCallback(() => resolve());
                                    });
                                  });
                                  
                                  AlCalzoneA Offline
                                  AlCalzoneA Offline
                                  AlCalzone
                                  Developer
                                  schrieb am zuletzt editiert von
                                  #44

                                  @liv-in-sky sagte in scriptedEnabled - Problem bei Abfrage:

                                  lauter async funktionenen , die anschliessend in einer async. hauptfunktion mit await aufgerufen werden und am ende wird die hauptfunktion aufgerufen
                                  dann sollte man doch meist auf der sicheren seite sein

                                  In 4.9.x kannst du sogar die Haupt-Funktion weglassen. Top-Level-Await funktioniert da!

                                  // nix
                                  await irgendwas;
                                  // auch nix
                                  

                                  wenn ich eine api abrufe muss ich auch noch deinen tipp von oben berücksichtigen

                                  Dann aber bitte so:

                                  function asyncAPI() {
                                    return new Promise((resolve) => {
                                      irgendwasMitCallback(() => resolve());
                                    });
                                  });
                                  

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

                                  1 Antwort Letzte Antwort
                                  1
                                  • liv-in-skyL Offline
                                    liv-in-skyL Offline
                                    liv-in-sky
                                    schrieb am zuletzt editiert von liv-in-sky
                                    #45

                                    nur nebenbei gefragt - ihr habt das problem nicht, dass die suche im scripte tab die browser zum crashen bringt ?

                                    https://github.com/ioBroker/ioBroker.javascript/issues/666

                                    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

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

                                      nur nebenbei gefragt - ihr habt das problem nicht, dass die suche im scripte tab die browser zum crashen bringt ?

                                      https://github.com/ioBroker/ioBroker.javascript/issues/666

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

                                      @liv-in-sky Nö

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

                                      liv-in-skyL 2 Antworten Letzte Antwort
                                      0
                                      • AlCalzoneA AlCalzone

                                        @liv-in-sky Nö

                                        liv-in-skyL Offline
                                        liv-in-skyL Offline
                                        liv-in-sky
                                        schrieb am zuletzt editiert von
                                        #47

                                        @AlCalzone

                                        du glücklicher - ist extrem nervig

                                        und nochmals danke - war sehr lehrreich für mich

                                        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

                                        1 Antwort Letzte Antwort
                                        0
                                        • AlCalzoneA AlCalzone

                                          @liv-in-sky Nö

                                          liv-in-skyL Offline
                                          liv-in-skyL Offline
                                          liv-in-sky
                                          schrieb am zuletzt editiert von liv-in-sky
                                          #48

                                          @AlCalzone

                                          hi - ich schon wieder - brauche nochmal deinen sachverstand

                                          habe jetzt den fall mit den api abfragen - zwei hintereinander - zuerst radarstelle finden - dann adresse anzeigen - (später dazu: an handy senden)

                                          ist der code ok - außer die übergabe der werte an die nächste function

                                          werte kommen richtig raus !

                                          
                                          const  BASE_URL="https://cdn2.atudo.net/api/1.0/vl.php?type=0,1,2,3,4,5,6&box="
                                          const LATITUDE_START="48.312969"
                                          const LONGITUDE_START="11.701666"
                                          const LATITUDE_DEST="48.308288"
                                          const LONGITUDE_DEST="11.720184"
                                          const APIKEY_GEOCODING="4ddxxxxxxxx910f5a7b493d192e"
                                          var myLat="xx";
                                          var myLng="yy";
                                          var myRes="myRes";
                                          
                                          async function getContent(){
                                               return new Promise(async (resolve) => {
                                              var url = BASE_URL + LATITUDE_START + "," + LONGITUDE_START + "," + LATITUDE_DEST  + "," + LONGITUDE_DEST
                                              request(url, function(err, response, json) {
                                                   log(json)
                                                  var myjson = JSON.parse(json).pois;
                                               
                                                  log(myjson[0].lat+myjson[0].lng)
                                                  myLat=myjson[0].lat
                                                  myLng=myjson[0].lng
                                                  resolve()
                                              });
                                              });
                                          }
                                           
                                           
                                          async function getAddress(lat, long){
                                               return new Promise(async (resolve) => {
                                              var geoCodeUrl = 'https://api.opencagedata.com/geocode/v1/json' 
                                              geoCodeUrl = geoCodeUrl + '?' + 'key=' + APIKEY_GEOCODING + '&q=' + lat + ',' + long + '&pretty=1'
                                              log(geoCodeUrl)
                                               request(geoCodeUrl, function(err, response, json) {
                                              //log("d--------"+json)
                                                log  (JSON.parse(json).results[0].formatted);
                                                myRes=JSON.parse(json).results[0].formatted
                                                resolve()
                                              });
                                              });
                                          }  
                                          
                                          async function doStuff(){
                                          await getContent()
                                          //await getAddress("48.310381","11.706523")
                                          log(myLat)
                                          log(myLng)
                                          await getAddress(myLat,myLng)
                                          log(myRes)
                                          
                                          }
                                          

                                          Image 1.png

                                          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

                                          AlCalzoneA 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

                                          884

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          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