Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [gelöst] Warten auf Erstellen und Befüllen von DP

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    [gelöst] Warten auf Erstellen und Befüllen von DP

    This topic has been deleted. Only users with topic management privileges can see it.
    • dirk_1930
      dirk_1930 last edited by dirk_1930

      Ich habe ein Problem bei der Weiterbearbeitung von Daten...

      Ich lese 2 JSON aus und erstelle / befülle daraus jeweils in einer Funktion die Datenpunkte.
      Da der Vorgang unterschiedlich lang dauert, kommt es jetzt vor das die 3. Funktion auf Daten zugreifen will, die noch nicht geschrieben sind.
      Wie muss ich meinen Aufruf gestalten, damit er erst ausgeführt wird, wenn der Schreibvorgang abgeschlossen ist?
      Mein Versuch...

      async function asyncCall() {
          try {
              await DatenAuswerten(basicArray, basicBasisOrdner);
              await DatenAuswerten(currentArray, currentBasisOrdner);
              await DatumAnpassen(basicArray, basicBasisOrdner);
          } catch (e) {
              console.log('Fehler');
          }
      }
      
      arteck 1 Reply Last reply Reply Quote 0
      • arteck
        arteck Developer Most Active @dirk_1930 last edited by

        @dirk_1930 sind die anderen Methoden auch async definiert ?

        dirk_1930 1 Reply Last reply Reply Quote 0
        • dirk_1930
          dirk_1930 @arteck last edited by

          @arteck
          🙄 Hmm - nö

          Nutze zum ersten mal den async Aufruf...

          Muss ich bei den aufgerufenen Funktionen async davor setzten? Ich füge mal das aktuelle Script mit an...

          console.log("====== Skript gestartet ======");
          
          // **** Json & Array initialisieren ***
          const currentJson = '0_userdata.0.meteoblue.json.meteoblue_current_json';
          const currentArray = JSON.parse(getState(currentJson).val);
          const currentBasisOrdner = "0_userdata.0.meteoblue.current";
          
          const basicJson = '0_userdata.0.meteoblue.json.meteoblue_basicday_json';
          const basicArray = JSON.parse(getState(basicJson).val);
          const basicBasisOrdner = '0_userdata.0.meteoblue.basic-day'
          
          asyncCall();
          
          async function asyncCall() {
              try {
                  await DatenAuswerten(basicArray, basicBasisOrdner);
                  await DatenAuswerten(currentArray, currentBasisOrdner);
                  await DatumAnpassen(basicArray, basicBasisOrdner);
              } catch (e) {
                  console.log('Fehler beim Aufruf');
              }
          }
          
          async function DatenAuswerten(array, ordner) {
              console.log('function DatenAuswerten');
              for (var key of Object.keys(array)) {
                  DatenpunktErstellen(array, key, key, ordner);
              }
          }
          
          async function DatenpunktErstellen(array, key, fullKeyName, ordner) {
              var basisOrdner = ordner;
              for (var key2 of Object.keys(array[key])) {
                  var fullKeyName2 = fullKeyName + "." + key2;
                  var value = array[key][key2];
                  if (Array.isArray(value)) {                                             // Array.isArray(obj) - Wenn der Wert ein Array ist wird true zurückgegeben ===> Es gibt eine 2. Ebene
                      for (var i = 0; i <= (value.length) - 1; i++) {
                          var arrayItemKey = basisOrdner + "." + fullKeyName + ".data_" + i + "." + key2;
                          if (!existsState(arrayItemKey)) {                               // Wenn der Datenpunkt nicht vorhanden ist - anlegen
                              createState(arrayItemKey, value[i], async function () { });
                          } else {
                              setState(arrayItemKey, value[i], true);
                          }
                      }
                  }
                  else {
                      var itemKey = currentBasisOrdner + "." + fullKeyName2;
                      if (!existsState(itemKey)) {                                        // Wenn der Datenpunkt nicht vorhanden ist - anlegen
                          createState(itemKey, value, async function () { });
                      } else {
                          setState(itemKey, value, true);
                      }
                  }
              }
          }
          
          async function DatumAnpassen(array, basicBasisOrdner) {
              console.log('function DatumAnpassen');
              let zaehler = 0;
              let time = (array.data_day.time); // Time aus Array
              for (let key in time) {
                  let subOrdner = '.data_day.data_' + zaehler;
                  let dataPoint = basicBasisOrdner + subOrdner + '.time'; //Ordner Zeit auslesen als Trigger für Farbe     
                  let datum = getState(dataPoint).val;
                  console.log(datum);
                  let tag = formatDate(datum, "W"); // Datum Formatieren https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#formatdate
                  let ordnerTagNeu = basicBasisOrdner + subOrdner + ".tag";
                  if (!existsState(ordnerTagNeu)) {
                      createState(ordnerTagNeu, tag, async function () { });
                  } else {
                      setState(ordnerTagNeu, tag, true);
                  }
          
                  let datumKurz = formatDate(datum, "DD.MM"); // Datum Formatieren https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#formatdate
                  let ordnerDatumKurz = basicBasisOrdner + subOrdner + ".datum";
                  if (!existsState(ordnerDatumKurz)) {
                      createState(ordnerDatumKurz, datumKurz, async function () { });
                  } else {
                      setState(ordnerDatumKurz, datumKurz, true); //Datenpunkt setzten
                  }
                  zaehler++;
              }
          }
          
          AlCalzone 1 Reply Last reply Reply Quote 0
          • AlCalzone
            AlCalzone Developer @dirk_1930 last edited by

            @dirk_1930
            Mindestens müsstest du die asynchronen Varianten von createState und setState verwenden. Eine leere Callback-Funktion sorgt nicht dafür, dass gewartet wird, egal ob diese async ist oder nicht.

            createState(ordnerDatumKurz, datumKurz, async function () { });
            

            müsste also

            await createStateAsync(ordnerDatumKurz, datumKurz);
            

            lauten und

            setState(ordnerDatumKurz, datumKurz, true);
            

            stattdessen

            await setStateAsync(ordnerDatumKurz, datumKurz, true);
            

            Grundsätzlich macht es keinen Sinn, eine Funktion als async zu deklarieren, wenn du darin kein await verwendest.

            Es ist genau anders herum: Das await ist das, was wartet, wenn die aufgerufene Funktion async ist bzw. einen Promise zurück gibt. Um await zu nutzen, muss die enthaltende Funktion async sein.
            Diese kann dann wiederum mit await aufgerufen werden, dazu muss die aufrufende Funktion async sein, etc...

            Das zieht sich komplett durch.

            dirk_1930 1 Reply Last reply Reply Quote 0
            • dirk_1930
              dirk_1930 @AlCalzone last edited by

              @alcalzone
              ... das klingt mega kompliziert. Für mich als Javascript Anfänger völlig verwirrend 😞

              Ich habe Deine Vorschläge jetzt umgesetzt, allerdings ruft die Funktion DatumAnpassen immer noch einen DP auf, der zu dem Zeitpunkt noch nicht existiert.

              An welcher Stelle müsste ich jetzt noch etwas ändern?

              console.log("====== Skript gestartet ======");
              
              // **** Json & Array initialisieren ***
              const currentJson = '0_userdata.0.meteoblue.json.meteoblue_current_json';
              const currentArray = JSON.parse(getState(currentJson).val);
              const currentBasisOrdner = "0_userdata.0.meteoblue.current";
              
              const basicJson = '0_userdata.0.meteoblue.json.meteoblue_basicday_json';
              const basicArray = JSON.parse(getState(basicJson).val);
              const basicBasisOrdner = '0_userdata.0.meteoblue.basic-day'
              
              asyncCall();
              
              async function asyncCall() {
                  try {
                      await DatenAuswerten(basicArray, basicBasisOrdner);
                      await DatenAuswerten(currentArray, currentBasisOrdner);
                      await DatumAnpassen(basicArray, basicBasisOrdner);
                  } catch (e) {
                      console.log('Fehler beim Aufruf');
                  }
              }
              
              function DatenAuswerten(array, ordner) {
                  console.log('function DatenAuswerten');
                  for (var key of Object.keys(array)) {
                      DatenpunktErstellen(array, key, key, ordner);
                  }
              }
              
              async function DatenpunktErstellen(array, key, fullKeyName, ordner) {
                  var basisOrdner = ordner;
                  for (var key2 of Object.keys(array[key])) {
                      var fullKeyName2 = fullKeyName + "." + key2;
                      var value = array[key][key2];
                      if (Array.isArray(value)) {                                             // Array.isArray(obj) - Wenn der Wert ein Array ist wird true zurückgegeben ===> Es gibt eine 2. Ebene
                          for (var i = 0; i <= (value.length) - 1; i++) {
                              var arrayItemKey = basisOrdner + "." + fullKeyName + ".data_" + i + "." + key2;
                              if (!existsState(arrayItemKey)) {                               // Wenn der Datenpunkt nicht vorhanden ist - anlegen
                                  await createStateAsync(arrayItemKey, value[i]);
                              } else {
                                  await setStateAsync(arrayItemKey, value[i], true);
                              }
                          }
                      }
                      else {
                          var itemKey = currentBasisOrdner + "." + fullKeyName2;
                          if (!existsState(itemKey)) {                                        // Wenn der Datenpunkt nicht vorhanden ist - anlegen
                              await createStateAsync(itemKey, value);
                          } else {
                              await setStateAsync(itemKey, value, true);
                          }
                      }
                  }
              }
              
              async function DatumAnpassen(array, basicBasisOrdner) {
                  console.log('function DatumAnpassen');
                  let zaehler = 0;
                  let time = (array.data_day.time);
                  for (let key in time) {
                      let subOrdner = '.data_day.data_' + zaehler;
                      let dataPoint = basicBasisOrdner + subOrdner + '.time'; //Ordner Zeit auslesen als Trigger für Farbe     
                      let datum = getState(dataPoint).val;
                      let tag = formatDate(datum, "W"); // Datum Formatieren https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#formatdate
                      let ordnerTagNeu = basicBasisOrdner + subOrdner + ".tag";
                      if (!existsState(ordnerTagNeu)) {
                          await createStateAsync(ordnerTagNeu, tag);
                      } else {
                          await setStateAsync(ordnerTagNeu, tag, true);
                      }
              
                      let datumKurz = formatDate(datum, "DD.MM."); // Datum Formatieren https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#formatdate
                      let ordnerDatumKurz = basicBasisOrdner + subOrdner + ".datum";
                      if (!existsState(ordnerDatumKurz)) {
                          await createStateAsync(ordnerDatumKurz, datumKurz);
                      } else {
                          await setStateAsync(ordnerDatumKurz, datumKurz, true);
                      }
                      zaehler++;
                  }
              }
              
              AlCalzone 1 Reply Last reply Reply Quote 0
              • AlCalzone
                AlCalzone Developer @dirk_1930 last edited by

                @dirk_1930 sagte in Warten auf Erstellen und Befüllen von DP:

                An welcher Stelle müsste ich jetzt noch etwas ändern?

                Hier ist die async-await-Kette unterbrochen:

                function DatenAuswerten(array, ordner) {
                    console.log('function DatenAuswerten');
                    for (var key of Object.keys(array)) {
                        DatenpunktErstellen(array, key, key, ordner);
                    }
                }
                

                Da fehlt ein async vor dem function und ein await for dem DatenpunktErstellen.

                dirk_1930 1 Reply Last reply Reply Quote 0
                • dirk_1930
                  dirk_1930 @AlCalzone last edited by

                  @alcalzone 🙃 👍

                  Vielen, vielen Dank! Es geht!

                  1 Reply Last reply Reply Quote 0
                  • First post
                    Last post

                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  915
                  Online

                  31.9k
                  Users

                  80.2k
                  Topics

                  1.3m
                  Posts

                  3
                  7
                  236
                  Loading More Posts
                  • Oldest to Newest
                  • Newest to Oldest
                  • Most Votes
                  Reply
                  • Reply as topic
                  Log in to reply
                  Community
                  Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                  The ioBroker Community 2014-2023
                  logo