NEWS
deutsche Wettervorhersage mit DWD API-Services
-
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 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...
-
@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 -
@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.
-
@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.