NEWS
[Linux Shell-Skript] WLAN-Wetterstation
-
@sborg Mega Danke. Ich werde mich jetzt erstmal um die uid kümmern und dein Script einbauen. Damit komme ich bestimmt weiter. (Hab aber bestimmt noch weitere Fragen)
Tasks wird dann alles kopiert, aggregiert und ins long geshifftet das wäre sowas, wie ich oben den Fummel betitelt hatte. -
@SBorg
welchen Adapter nutzt du für die Ozonwerte? -
@nashra
Keinen, mir ist auch keiner bekannt, ich nutze (wie bei mir fast üblich ) ein Linux Shell-Skript.
Bevor nun wieder die Frage kommt: nein, das kann ich schlecht zur Verfügung stellen, da es die Daten vom HLNUG bezieht und somit nur für Hessen gültig ist.Weil aber bestimmt hier wieder Begehrlichkeiten geweckt wurden (nehme ich mal an ), habe ich mir heute morgen mal Gedanken gemacht und bin auf die Suche gegangen.
Übrig bleibt eigentlich nur das "Umwelt Bundesamt", da es für ganz Deutschland Daten liefert (sry @Negalein), auch kleinere Stationen. Leider keine API verfügbar und https://www.umweltbundesamt.de/daten/luft/luftdaten/luftqualitaet/ verlangt das ausfüllen der gewünschten Daten (ist hier nicht einfach zu automatisieren, da darüber ein Einmal-Token generiert wird).
Aber wird sind ja nicht blöd
Über die "Stationen" kommen wir zwar zu einer ähnlichen Eingabemaske, aber nach dem ausfüllen erhalten wir einen nutzbaren Link "Station herunterladen". Per MouseOver erkennen wir nun auch einen für uns nutzbaren Link
Beispiel:https://www.umweltbundesamt.de/api/air_data/v3/measures/csv?date_from=2024-01-18&time_from=11&date_to=2024-01-18&time_to=11&data%5B0%5D%5Bco%5D=3&data%5B0%5D%5Bsc%5D=2&data%5B0%5D%5Bst%5D=533&lang=de
Also doch eine (nicht öffentliche) API. Die Daten könnte ich automatisieren, man muss es nur einmalig per Frontend ausfüllen damit man seine StationID bekommt. In der heruntergeladenen CSV steht dann der Ozonwert drin -
@sborg
nö lass mal, so wichtig ist das nicht. Aber trotzdem danke fürs suchen -
@sborg
Doch öffentliche Api
Git-Hub zur Luftqualität-Api des Bundes
Dokumentation der ApiBeispiel Daten für Ulm:
(https://umweltbundesamt.api.proxy.bund.dev/api/air_data/v2/airquality/json?date_from=2024-01-18&time_from=13&date_to=2024-01-18&time_to=13&station=228&lang=de){ "request": { "station": "228", "date_from": "2024-01-18", "date_to": "2024-01-18", "time_from": "13:00:00", "time_to": "13:00:00", "lang": "de", "index": "id", "datetime_from": "2024-01-18 12:00:00", "datetime_to": "2024-01-18 12:00:00" }, "data": { "228": { "2024-01-18 12:00:00": [ "2024-01-18 13:00:00", 1, 0, [ 3, 64, 1, "1.051" ], [ 5, 9, 0, "0.45" ], [ 1, 7, 0, "0.35" ] ] } }, "indices": { "data": { "Id of station - string": { "Date of measure start in CET - string": [ "0: Date of measure end in CET - string", "1: Airquality index for all components - integer", "2: Data incomplete (0|1) - integer", [ "0: Id of component id - integer", "1: Value - number", "2: Airquality index of this component- integer", "3: Decimal representation of Airquality index of this component - string" ] ] } } }, "count": 1 }
=> 64 µg/m³ Ozon / 9 µg/m³ NO2 / 7 µg/m³ Feinstaub PM10
Man kann anstatt der 228 auch die von der Stationsseite den angezeigten Code DEBW019 der Station verwenden
Und anscheinend gibts auch schon ne Api v3
Da kommt bei der Station dann sogar ein PM2.5-Wert mit
-
@boronsbruder Das schreit ja förmlich nach einem neuen Adapter
-
@sborg sagte in [Linux Shell-Skript] WLAN-Wetterstation:
sry @Negalein)
No Problem.
Ich brauch Ozon nicht.
Wenn doch, verwende ich einen deutschen Ort.
Kann von Ö nach DE rüber spucken. -
@rene55
Adapter kann ich nicht.
Skripten ein bischen, deswegen hab ich für euch/uns Daten-Fetischisten mal mit nem Skript angefangen:// Luftqualität v1 // User Einstellungen const stations = ["DEBW019"]; // Stationen, können durch Komma getrennt werden z.B. ["DEBW019", "DEBY007"] const datenpunkt_pre ="0_userdata.0" // => wird in 0_userdata.0.Luftqualität gespeichert const debug = false; // Abfrage findet um **:05 und **:10 stündlich statt (um fehlende Daten eventl. nachzufüllen). Die Daten werden sowieso nur stündlich von der letzten Stunde zur Verfügung gestellt... // Datenverarbeitung var dp_path = datenpunkt_pre + ".Luftqualität."; var timer; var components; var stations_list; const fetch = require('node-fetch'); function createBaseFolder(ID, type, name) { /** geklaut bei grrfield * Erstellt Basisfolder und stellt den richtigen Typ ein * @param {string} ID ID des Folders * @param {any} type Typ des Folders * @param {string} [name] (optional) Name des Folders */ createState(ID, function() { let obj=getObject(ID); obj.type=type; if(name != undefined) obj.common.name=name; obj.common.role=''; setObject(ID, obj); }); } const get_stations = async () => { const url_stations = "https://umweltbundesamt.api.proxy.bund.dev/api/air_data/v3/stations/json?lang=de"; var stations_json = fetch(url_stations) .then(response => response.json()) .then(data => { //if (debug) console.log(data); return data}) .catch ((err) => { console.error("failed fetch " + err); } ); return stations_json; } const send_request = async (station_code) => { const d = new Date(); let hour = d.getHours()-1; let date = d.getFullYear + "-" + d.getMonth + "-" + d.getDay; const url_server = "https://umweltbundesamt.api.proxy.bund.dev/api/air_data/v3/airquality/json?date_from=" + date + "&time_from=" + hour + "&date_to=" +date +"&time_to=" + (hour +1) + " &station=" + station_code + "&lang=de"; var request = fetch(url_server) .then(response => response.json()) .then(data => { if (debug) console.log(data); return data}) .catch ((err) => { console.error("failed fetch " + err); } ); return request; }; const get_components = async () => { var list = fetch("https://umweltbundesamt.api.proxy.bund.dev/api/air_data/v3/components/json?lang=de&index=id") .then(response => response.json()) .then(data => { if (debug) console.log(data); return data}) .catch ((err) => { console.error("failed fetch " + err); } ); return list; }; async function get_data (station_code) { var data = await send_request(station_code); if (!existsObject(dp_path + station_code)){ if (debug) console.warn("not exist => " + stations_list.data[data.request.station][2]); createBaseFolder(dp_path + station_code, "folder", stations_list.data[data.request.station][2]); } var measure_set = data.data[data.request.station][data.request.datetime_from]; for (let i = 3 ; i < measure_set.length; i++) { var id = dp_path + station_code + "." + components[measure_set[i][0]][1]; if (debug) console.log ("ID: " + id); existsState(id, (err, isExists) => { var idwork = dp_path + station_code + "." + components[measure_set[i][0]][1]; if (debug){ console.log ("IDwork: " + idwork); console.log ("initval: " + measure_set[i][1]); console.log ("Name: " + components[measure_set[i][0]][4] + "(" + components[measure_set[i][0]][1] + ")"); console.log ("unit: " + components[measure_set[i][0]][3]); } if (err) console.error (err); if (isExists) { if (debug) console.log ("Exists writing new value"); setState(idwork, measure_set[i][1]); } else{ if (debug) console.log ("Not Exists - creating State"); createState(idwork, measure_set[i][1], { name: components[measure_set[i][0]][4] + " (" + components[measure_set[i][0]][2] + ")", unit: components[measure_set[i][0]][3], type: "number", role: "value", read: true, write: true} , () => { log('Dp '+ idwork + ' erstellt!'); }); } }); } } onStop (() => { clearSchedule(timer); }); async function init(){ stations_list = await get_stations(); components = await get_components(); stations.forEach (get_data); // init für sofortige Datenverfügbarkeit // timer um */5 und */10 timer = schedule({minute: [5,10]}, () => { stations.forEach (get_data); }); } init();
Funktion:
auf der SEITE des Umwelbundesamtes die StationsID raussuchen
Es können auch mehrere Stationen durch Komma getrennt im Skript eingetragen werden.
Dann werden die Daten (letzter Stündlicher Mittelwert) unter dem eingestellten Datenpunkt um **:05 und **:10 gespeichert.Ich plane noch die "Airquality indexes" hinzuzufügen.
-
@boronsbruder Ich schau mal, ob es da schon eine Anfrage auf einen Adapter zu diesem Thema gibt. Danke für dein Engagement, aber wir sollten den Thread hier nicht weiter volltexten sondern wenn du willst in einem Neuen.
-
@rene55 sagte in [Linux Shell-Skript] WLAN-Wetterstation:
@boronsbruder ... aber wir sollten den Thread hier nicht weiter volltexten sondern wenn du willst in einem Neuen.
-
@boronsbruder sagte in [Linux Shell-Skript] WLAN-Wetterstation:
@rene55 sagte in [Linux Shell-Skript] WLAN-Wetterstation:
@boronsbruder ... aber wir sollten den Thread hier nicht weiter volltexten sondern wenn du willst in einem Neuen.
Die v2 installiert aber jeden Morgen kommt dieser Fehler zur selben Uhrzeit
2024-01-22 02:09:47.206 - info: linux-control.0 (1080) successful received data from ioBroker (192.168.1.14:22) 2024-01-22 02:10:00.797 - error: javascript.0 (283) script.js.Wetter.Luftqualität: TypeError: Cannot read properties of undefined (reading '2024-01-22 00:00:00') 2024-01-22 02:10:00.797 - error: javascript.0 (283) at get_data (script.js.Wetter.Luftqualität:148:54) 2024-01-22 02:10:00.797 - error: javascript.0 (283) at processTicksAndRejections (node:internal/process/task_queues:95:5) 2024-01-22 02:12:00.026 - info: host.ioBroker instance system.adapter.meteoalarm.2 started with pid 1832595
-
@nashra
Hab ich auch bemerkt.
Die Api kann meines Erachtens nicht mit Stunde 0 umgehen.
Hab die Kollegen mal angeschrieben, aber ich wurde so wie es aussieht missverstanden. -
@SBorg
Falls du es mal brauchst:
API V3 Doku -
Ich verstehe deren System auch nicht so ganz. Eigentlich ist doch UBA nur Deutschland...?
Wollen sie jetzt noch Zeitzonen in BRD einführen? Bin schon mal auf die Sommer-/Winterzeit-Thematik bei denen gespannt.Aber 1-24 bei den Stunden ist auch der Burner. Wer arbeitet den in der Computertechnologie mit 24:00 Uhr?
Ich bin jetzt im NodeRed-Flow den einfachen Weg gegangen und verzichte einfach auf den 0:00 Uhr Wert, wobei ich es eh nicht nutze. Ich nehme weiter die Daten des HLNUG, nur die Karte vom UBA, da die vom HLNUG schon ein paar Wochen nicht mehr aktualisiert wird
-
@sborg sagte in [Linux Shell-Skript] WLAN-Wetterstation:
Wer arbeitet den in der Computertechnologie mit 24:00 Uhr?
Jeder der keinen Bock hat sich Gedanken um Jahres-, Monats- oder Tageswechsel zu machen...
Weisst ja 0 Uhr - 1 -
@SBorg
Ich hab da was für dich:2024-01-24 23:58:05.001 - info: simple-api.0 (5300) State value to set for "0_userdata.0.Wetterstation.Info.Solarenergie_VorTag" has to be type "number" but received type "string" 2024-01-24 23:58:05.175 - info: simple-api.0 (5300) State value to set for "0_userdata.0.Wetterstation.Info.Solarenergie_Woche" has to be type "number" but received type "string" 2024-01-24 23:58:05.175 - info: simple-api.0 (5300) State value to set for "0_userdata.0.Wetterstation.Info.Solarenergie_Monat" has to be type "number" but received type "string" 2024-01-24 23:58:05.176 - info: simple-api.0 (5300) State value to set for "0_userdata.0.Wetterstation.Info.Solarenergie_Jahr" has to be type "number" but received type "string" 2024-01-24 23:58:05.176 - info: simple-api.0 (5300) State value to set for "0_userdata.0.Wetterstation.tempData.Solarenergie" has to be type "string" but received type "number"
Das passiert, wenn die Solarenergie-Datenpunkte leer sind.
Der TempData steht z.B. gerade auf 404,662, weil ich seit 2 Tagen erst wieder, in Ermangelung eines Aussensensors, Daten bekomme.
Wenn die SimpleApi halt alle 30 Sekunden rummotzt gibt das ganz schön große LogsEigentlich eher ein Schönheitsfehler...
-
Den Zustand kann es "eigentlich" auch nicht geben. Entweder alle Daten da oder eben nüscht.
Bei uns sagt man: Kommt davon wenn man so neumodische Ferz hat...Sollte dann in/ab der V3.3.0 abgefangen werden. Da ich aber aktuell nicht aktiv daran arbeite kann das etwas dauern bis die kommt.
Aktueller Wasserstand des Projektes: Bugfixing ja, Weiterentwicklung (so 1-2 Dinge stehen aktuell noch auf der Agenda) ruht schlichtweg aus Zeitmangel
-
@sborg
Alte Maschin gabutt - Ameise machen Nest in Maschin - kaufen neie Maschin -
Hallo zusammen,
Aktuell besteht meine "Wetterstation" aus einer selbstgebastelten Arduino Lösung. Allerdings möchte ich jetzt etwas Verlässlicheres und überlege mir daher ein Ecowitt GW2000 Gateway in Kombi mit einem WS90 "Wittboy" 7-in-1 Sensor zu holen. Die Regenmessung des WS90 soll allerdings nicht so prickelnd funktionieren, weswegen in den einschlägigen Foren empfohlen wird, zusätzlich einen WH40 (= Froggit DP80) Regenmesser zu verwenden. Der WH40 wird hier allerdings nicht unter den kompatiblen Zusatzsensoren aufgeführt. Heisst das, es werden nur die Regenwerte des WS90 an iobroker übergeben oder gibt es eine Möglichkeit, auch den WH40 einzubinden? Hat jemand die Kombi WS90 und WH40 im Einsatz und kann berichten ob das funktioniert?
-
@el_rob
Es besteht die Möglichkeit im WebIf des GW2000 auszuwählen, welcher Wert an den Server gesendet werden soll. Somit sollte der WH40 auch funktioneren.