Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. deutsche Wettervorhersage mit DWD API-Services

    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

    deutsche Wettervorhersage mit DWD API-Services

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

      Hallo,

      ich habe vor einiger Zeit eine deutsche Wettervorhersage für ein CMS (MODX) mit dem DWD MOSMIX-Vorhersagedatensatz erstellt. Nun wollte ich dasselbe auch für ioBroker mit JavaScript umsetzen, bin aber noch Anfänger in JavaScript. Der MOSMIX-Vorhersagedatensatz ist ein äußerst nützliches und leistungsfähiges Werkzeug für die Wettervorhersage.

      Nun bin ich auf die DWD API-Services gestoßen, die mir einfacher erscheinen, um entsprechende Datenpunkte in ioBroker zu schreiben. Das Ergebnis (Beta-Version) habe ich auf github.com/jolichter/ioBroker_dwdWeather hochgeladen. Vielleicht kann es jemand gebrauchen oder hat Tipps zur Verbesserung des Codes. Ein aktuelles Problem besteht darin, ungenutzte Datenpunkte automatisch zu löschen.

      Ich habe eine Funktion hinzugefügt, die alle vorhandenen Datenpunkte durchläuft und überprüft, ob sie mit dem Format "dpBase" beginnen. Anschließend wird überprüft, ob der Datenpunkt in den Wetterdaten verwendet wird. Wenn nicht, wird der Datenpunkt gelöscht.

      Die Funktion habe ich am Ende des Skripts hinzugefügt (nach updateWeatherData), um sicherzustellen, dass zuerst die Wetterdaten aktualisiert und dann die ungenutzten Datenpunkte gelöscht werden:

      // Funktion zum Löschen ungenutzter Datenpunkte
      async function deleteUnusedDataPoints() {
          try {
              const existingDataPoints = await getObjectListAsync({ include_docs: true });
      
              for (const dataPoint of existingDataPoints) {
                  const dataPointId = dataPoint._id;
      
                  // Überprüfen, ob der Datenpunkt mit dpBase beginnt
                  if (dataPointId.startsWith(dpBase)) {
                      let isUsed = false;
      
                      // Überprüfen, ob der Datenpunkt in den Wetterdaten verwendet wird
                      for (const url of urls) {
                          const response = await axios.get(url);
                          const weatherData = response.data;
                          const stationId = dataPointId.split('.')[3];
      
                          if (weatherData.hasOwnProperty(stationId)) {
                              if (dataPointId.startsWith(`${dpBase}.${stationId}`)) {
                                  isUsed = true;
                                  break;
                              }
                          }
                      }
      
                      // Datenpunkt löschen, wenn er nicht verwendet wird
                      if (!isUsed) {
                          await deleteStateAsync(dataPointId);
                          if (enableLogs) log('Deleting data point ' + dataPointId);
                      }
                  }
              }
          } catch (error) {
              log('Fehler beim Löschen ungenutzter Datenpunkte: ' + error, 'error');
          }
      }
      
      // Funktion zum Aktualisieren der Wetterdaten aufrufen
      updateWeatherData();
      
      // Datenpunkte löschen
      deleteUnusedDataPoints();
      
      

      Leider funktioniert das nicht und beim Testen erhalte ich folgenden Error:

      script.js.common.dwdWeather: Fehler beim Löschen ungenutzter Datenpunkte: ReferenceError: getObjectListAsync is not defined
      

      Es funktioniert auch nicht mit getObjectListAsync, getStatesAsync, getAdapterObjectsAsync, getAllStatesAsync oder getStateListAsync. Hat jemand eine Idee, warum oder was ich falsch mache?

      Vielen Dank im Voraus für eure Hilfe!

      Mein System:

      • Raspberry Pi 4 - 8GB
      • Rasbbian bullseye
      • Kernel 6.1.21
      • Node.js 18.16.0
      • NPM 9.5.1
      • Admin 6.3.5
      crunchip T 2 Replies Last reply Reply Quote 0
      • crunchip
        crunchip Forum Testing Most Active @jolic last edited by

        @jolic kennst du https://forum.iobroker.net/topic/30616/script-dwd-uwz-nina-warnungen-als-push-sprachnachrichten?_=1684962294772

        jolic 1 Reply Last reply Reply Quote 0
        • jolic
          jolic @crunchip last edited by jolic

          @crunchip Danke, kannte ich nicht, sehe im Script eine cleanUnusedObjects Funktion welche auch getObjectListAsync nutzt. Sorry Unsinn, das war wo anders und hat hiermit nichts zu tun.

          Es scheint, dass das Problem bei mir darin besteht, dass die Funktion getObjectListAsync nicht definiert ist und führt zu dem Fehler "ReferenceError: getObjectListAsync is not defined". Verstehe ich im Moment nicht... werde das später in Ruhe anschauen müssen...

          1 Reply Last reply Reply Quote 0
          • T
            ticaki Developer @jolic last edited by

            @jolic sagte in deutsche Wettervorhersage mit DWD API-Services:

            Es funktioniert auch nicht mit getObjectListAsync, getStatesAsync, getAdapterObjectsAsync, getAllStatesAsync oder getStateListAsync. Hat jemand eine Idee, warum oder was ich falsch mache?

            Das sind Funktionen die einem Adapter zur Verfügung stehen jedoch nicht einem Script.

            https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md
            https://github.com/ioBroker/ioBroker.javascript/blob/master/lib/javascript.d.ts

            jolic 1 Reply Last reply Reply Quote 0
            • jolic
              jolic @ticaki last edited by jolic

              @ticaki Danke für die Info. Hab das zusätzlich so geprüft:

              // Liste der zu prüfenden Funktionen
              const functionsToCheck = [
                  'getObjectViewAsync',
                  'getForeignObjects',
                  'getForeignStates',
                  'getAllStates',
                  'getAllObjects',
                  // Füge hier weitere Funktionen hinzu...
              ];
              
              // Prüfe jede Funktion in der Liste
              for (const functionName of functionsToCheck) {
                  if (typeof this[functionName] === 'function') {
                      log(`Die Funktion ${functionName} ist verfügbar.`);
                  } else {
                      log(`Die Funktion ${functionName} ist NICHT verfügbar.`);
                  }
              }
              

              Ausgabe ist bei allen "NICHT verfügbar", wie deine Links bestätigen.

              Abgesehen davon habe ich aufgehört, es zu versuchen, Datenpunkte automatisch zu löschen. Während meiner Tests ist mir ein Fehler im Code passiert, durch den ich versehentlich zu viele Datenpunkte gelöscht habe (in einer Testumgebung). Aus diesem Grund ist es sicherer, sie bei Bedarf manuell zu löschen.

              Mein Code ist größtenteils fertig, jedoch gestaltet sich die Beschaffung der stündlichen Messdaten (POI) via DWD ziemlich schwierig, da nicht alle Messstationen frei verfügbar sind. Zudem sind die stündlichen Messdaten bei den verfügbaren DWD Stationen nicht immer aktuell und können bis zu 2 Stunden hinterherhinken. In Anbetracht dieser Umstände erscheint es sinnvoll, eine eigene Mini-Wetterstation zu verwenden, um aktuelle Messdaten zu erhalten.

              T 1 Reply Last reply Reply Quote 0
              • T
                ticaki Developer @jolic last edited by ticaki

                @jolic sagte in deutsche Wettervorhersage mit DWD API-Services:

                In Anbetracht dieser Umstände erscheint es sinnvoll, eine eigene Mini-Wetterstation zu verwenden, um aktuelle Messdaten zu erhalten.

                Bei diesen Stationen kannst du die Daten auch teilen und bekommst dafür Daten von anderen Hobby Stationen.

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

                Support us

                ioBroker
                Community Adapters
                Donate

                669
                Online

                31.8k
                Users

                80.0k
                Topics

                1.3m
                Posts

                3
                6
                691
                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