Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Gedanken zur Feinstaubmessung

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Gedanken zur Feinstaubmessung

    This topic has been deleted. Only users with topic management privileges can see it.
    • K
      klassisch Most Active @Homoran last edited by Homoran

      MOD-Edit:
      **Dieses ist eine Abspaltung des Threads zu Problemen mit dem Luftdaten-Adapter

      Hier geht es um allgemeine Überlegungen und Möglichkeiten die Feinstaub Immissionen sinnvoll zu messen**

      @Homoran sagte in wrong type of...:

      Issue beim Luftdaten-Adapter ist erstellt.

      [Teil-OT]
      Betreibst Du einen eigenen Feinstaub-Sensor oder holst Du Dir die Daten aus der Cloud?
      Vor letzterem würde ich warnen. Ich betreibe einen eigenen, basierend auf dem SDS011. Und der ist bei H>70% out of Spec und zeigt dort wahrscheinlich zu hohe Werte an. Dennoch schicken die verteilten Feinstaubfreunde diese unzuverlässigen Daten weiter ins Netz. So etwas ist meiner Meinung nach irgendwas zwischen unseriös, irreführend oder Schlimmeren.
      Deshalb habe ich mein Gerät mit einem T-/H-Sensor gekoppelt und logge die Daten nur für H<70% und -10°C<=T>=50°C mit.
      Das führt dann auch dazu, daß ich seit dem 16.12.19 keine neuen Werte mehr bekommen habe. Natürlich kann ich welche manell abfragen, das sieht dann aber so aus:

      Feinstaub PM10: 12.00 µg/m^3;   PM2,5 :10.80 µg/m^3 
       	!!! ACHTUNG Feinstaubwerte ungueltig - T oder H out of Spec
      

      Aufgezeichneit wird in den "out of spec" Zeiten bei mir nichts.
      Und man sieht recht gut, daß die Feinstaubwerte kurz vor und nach dem Aussetzen nach oben gehen.

      Homoran 1 Reply Last reply Reply Quote 0
      • Homoran
        Homoran Global Moderator Administrators @klassisch last edited by Homoran

        @klassisch sagte in wrong type of...:

        holst Du Dir die Daten aus der Cloud?

        im Moment noch aus der cloud.
        Die Teile sind in D doch relativ teuer. Meine Meinung zu Ali kennst du ja.

        @klassisch sagte in wrong type of...:

        Dennoch schicken die verteilten Feinstaubfreunde diese unzuverlässigen Daten weiter ins Netz

        Danke für die Warnung - der DHT scheint bei den Stationen nicht mit verbaut zu sein, dann muss ich das über meine Außen-H-Werte korrigieren

        ich habe jetzt aktuell nur deswegen damit angefangen um mal zu sehen, wie es über Sylvester wieder hoch geht 😉
        Hier sind zwei Stationen in der Nähe, jede "in der Nähe" einer anderen Autobahn und eine in dem Ex-Schutzgebiet der Shell

        K 1 Reply Last reply Reply Quote 0
        • K
          klassisch Most Active @Homoran last edited by

          @Homoran sagte in wrong type of...:

          Danke für die Warnung - der DHT scheint bei den Stationen nicht mit verbaut zu sein, dann muss ich das über meine Außen-H-Werte korrigieren

          Die DHT gehören auch nicht zu den besseren Sensoren. Ich habe an dieser Stelle einen SHT31. Und zwar so, daß man ihn einfach austauschen kann. Im Freien leiden die Feuchtesensoren leider etwas.

          ich habe jetzt aktuell nur deswegen damit angefangen um mal zu sehen, wie es über Sylvester wieder hoch geht 😉

          Das wollte ich letztes Jahr auch. Allerdings war Sylvester 2018 ebenfalls zu feucht, so daß ich keine Daten übermittelt und gespeichert habe. So wie es aussieht wird es dieses Jahr wieder so. Und wenn es regnet oder nebelt, wird ein großer Teil der Partikel gebunden und weggespült. Nach einem Regen ist ja bekanntlich die Fernsicht sehr gut.

          Hier sind zwei Stationen in der Nähe, jede "in der Nähe" einer anderen Autobahn und eine in dem Ex-Schutzgebiet der Shell

          Wenn das offizielle Stationen sind, kann das anders aussehen. Da muß man in D zwar den Aufstellungsort genauer anschauen, aber die zugelassenen Stationen sollten Trockner vorgeschaltet haben. Aber Trocknen ohne den Meßwert zu verfälschen ist auch nicht so einfach. Ich habe das vor langer Zeit bei Prozeßgasen beruflich gemacht. Aber hier und heute hätte ich nicht die Meßmittel, um nachzuweisen, daß die Trocknung nichts verfälscht. Deshalb logge ich in den out of spec Zeiten einfach nicht mit. Und die Luftdaten-Freunde mit den Billigdingern sollten das meiner Meinung auch nicht tun. Und schon gar nicht irgendwelche Langzeitauswerungen. Und so lange sie es dennoch tun, bleibt da ein "Geschmäckle" von - s.o.

          Homoran 1 Reply Last reply Reply Quote 0
          • Homoran
            Homoran Global Moderator Administrators @klassisch last edited by

            @klassisch sagte in wrong type of...:

            Wenn das offizielle Stationen sind,

            Nee, das sind luftinfo-Stationen.
            Es gibt eine offizielle Station von der Site des Umweltbundesamts - etwa 3 km weg weg.

            Zum abrufen der UBA-Stationen gibt es ein Skript hier im Forum

            1 Reply Last reply Reply Quote 0
            • K
              klassisch Most Active last edited by klassisch

              [/Teil-OT]
              Gerade mal nachgeschaut: SDS011

              • Reichelt 30 EUR
              • Pollin 30 EUR heute (26.12.) noch praktisch versandkostenfrei
              • Banggood (seriös und nimmt PayPal) 18.04 EUR
              • ebay 272657389015 aus China, 19 EUR
              • Der Vollständigkeit halber: ali (823 verkauft, 224 Reviews, sieht also seriös aus) 15.83

              Dazu empfehle ich einen ESP32 weil der 2 Serielle Schnittstellen hat.

              Homoran 1 Reply Last reply Reply Quote 0
              • Homoran
                Homoran Global Moderator Administrators @klassisch last edited by Homoran

                @klassisch
                Das hatte ich gestern schon durch, hatte noch Völkner, Eckstein und EXP-Tech als Lieferanten, bei denen ich ab und zu kaufe.

                Banggood war für mich erste Wahl mit Lager GB (solange das noch EU ist 😉 )
                [Heute nur noch CN Warehouse]

                Ich wollte dann "ein paar" ESP8266 mitnehemen, daber da waren gestern nur noch 4 - heute 3 und der Preis aus UK ist mit 6,xx doch nicht unbedingt günstig

                Kann ich für den ESP32 den gleichen Sketch nehmen wie für den 8266?

                EDIT: Sehe gerade dass bei Berrybase (LINK bei Luftdaten.info (https://www.berrybase.de/bauelemente/sensoren-module/gas-staub/nova-fitness-sds011-feinstaub-sensor-inkl.-usb-adapter) der sds011 auch nicht zu teuer, und das ganze Set für knapp 36€ zu bekommen ist

                K 1 Reply Last reply Reply Quote 0
                • K
                  klassisch Most Active @Homoran last edited by klassisch

                  @Homoran Die Luftleute machen das mit dem ESP8266 und haben einen eigenen Sketch, der die Daten bei denen auf der Website abliefert. So war das zumindest als ich mir das angeschaut habe.
                  Der ESP8266 hat aber nur eine HW-Serial, die man gemeinhin als Diagnose/Programming etc. nutzt. Deshalb nutzen die Luftleute eine SW-Serial, was wohl auch im Großen Ganzen funktioniert und mit 9600Bd ist der Sensor auch langsam genug.
                  Ich hatte das mal mit einem Fingerprintsensor eine SW Serial eingesetzt, was mir aber tricky in Erinnerung blieb. Vielleicht weil das einer meiner ersten Versuche mit dem ESP8266 war.
                  Deshalb habe ich was mit dem ESP32 gemacht - wollte ohnehin mal was mit dem ESP32 machen. Verwendet habe ich https://github.com/sensebox/SDS011-select-serial forked from https://github.com/sensebox/SDS011-select-serial forked from https://github.com/ricki-z/SDS011 was man wohl mit HWSerial und SWSerial betreiben kann. Und angeblich https://github.com/ricki-z/SDS011/blob/master/library.properties kann man das mit

                  architectures=esp8266,avr,esp32
                  

                  betreiben. Bei ESP32 mit HW-Serial.
                  Das habe ich in meinen Monstersketch hineneingequetscht und kann so auch T-H Messen - mit BME280 oder SHT31.
                  Übertragen werden die Daten direkt an ioBroker über simpleApi.

                  Homoran 1 Reply Last reply Reply Quote 0
                  • Homoran
                    Homoran Global Moderator Administrators @klassisch last edited by

                    @klassisch
                    Ich werde da ganz bestimmt auf dich zukommen wenn ich meinen eigenen Sensor bauen will. 😉

                    In der Zwischenzeit logge ich die Werte zweier Stationen der Luftinfo und einer des UBA:
                    PM10_Luftdaten_vs_UBA.png

                    Auch die rH logge ich mit

                    Danke fürs Anschubsen

                    K 1 Reply Last reply Reply Quote 0
                    • K
                      klassisch Most Active @Homoran last edited by

                      @Homoran gerne, auch wenn das bei mir schon wieder einige Zeit her ist. März 2018 war wohl der letzte Compilerlauf, Sensor kam Ende Februar 2018 an.
                      Habe heute den Sketch noch so modifiziert, daß ich alternativ CO2 messen kann, wenn denn der MH-Z19 Sensor mal ankommt.
                      Offizielle Meßstationen gibt es 3 in ca. 20 bis 25km Entfernung, Zwei nach Norden, wobei eine davon direkt an einer Staustraße ist, die andere an einer strak befahrenen Bundesstraße und eine nach Süden hin, an einer mäßig befahrenen Bundesstraße. Die paßt für mich eher, hat auch einen realistischeren Abstand zur Straße.
                      Ist das das passende Skript zum Auslesen https://forum.iobroker.net/post/303043 ?
                      https://forum.iobroker.net/post/303043

                      Homoran 1 Reply Last reply Reply Quote 0
                      • Homoran
                        Homoran Global Moderator Administrators @klassisch last edited by

                        @klassisch sagte in wrong type of...:

                        Ist das das passende Skript zum Auslesen

                        Ja!

                        Du musst einmal die Abfrage der Stationen manuell machen und "deine" Station irgendwie finden. Da dann die ID raussuchen und in dem Skript eintragen.

                        K 1 Reply Last reply Reply Quote 0
                        • K
                          klassisch Most Active @Homoran last edited by klassisch

                          @Homoran Habe ich gemacht, funktioniert aber nicht wirklich. Die Messwerte sind 1 Tag alt und kommen im Bundle und ein Messwert wird als "null" geschickt.
                          Frage ich die Station manuell über die Webseite des LandesUmweltamtes ab, kommen die Daten im Klartext auf der Webseite eingebettet an. Also man kann sie als Mensch lesen und es gibt alle Meßwerte, die die Station kann. einigermaßen aktuell. Jetzt, um 11:40 werden die 11:00 Werte angezeigt.
                          Von der Bundesamt-Seite gezogen kommen die Werte von gestern und das auch noch lückenhaft.
                          Wahrscheinlich gibt es da einen Großrechner Nachtlauf, der die Daten vom Vortag überträgt.
                          Das Suchen der Station ging am besten so: Über die Karte eine Station picken und dann gabs bei mir irgendwann die Site des Landesamtes. Dort kann man auch auf Diagramm klicken und dann weren Meßstelleninformationen angezeigt. Darunter eine EU-Kennung.
                          Dann öffnet man den Suchlink, der im Skript referenziert ist, wartet ewig und sucht dann nach dieser EU-Kennung. Dann sieht man auch die Zahl.

                          Homoran 1 Reply Last reply Reply Quote 0
                          • Homoran
                            Homoran Global Moderator Administrators @klassisch last edited by Homoran

                            @klassisch
                            Das ist mir noch nicht aufgefallen!

                            Habe mich gestern wegen der Skalierung der Flot-Achsen ein wenig mit dem BImSchG beschäftigt.
                            Die angegeben Grenzen beziehen sich immer auf das maximale Tagesmittel, das wiederum maximal x mal im Jahr überschritten werden darf und einem maximalen Jahresmittel.

                            Deshalb erstelle ich jetzt auch einen fließenden Mittelwert über den Tag und trage diesen zum Tagesende in einen anderen Datenpunkt ein.

                            Daher ergibt es schon einen Sinn, wenn nur das Tagesmittel angegeben wird. Das geht natürlich erst am Folgetag.

                            Ich sehe mir das gleich nochmal an!
                            Hatte auch schon versucht die Seite des UBA über den parser zauszulesen . auf die Schnelle ohne Erfolg

                            K 1 Reply Last reply Reply Quote 0
                            • K
                              klassisch Most Active @Homoran last edited by

                              @Homoran Neinein, bekommen kein Tagesmittel. Ich bekomme 10 Arrays mit gestrigem Datum und zwar von 00:00 bis 09:00 Uhr. In den Arrays stecken nochmals Arrays drin und da drin Daten. Ich vergleiche das mal mit dem Format der "633" aus dem Thread.

                              Homoran 1 Reply Last reply Reply Quote 0
                              • Homoran
                                Homoran Global Moderator Administrators @klassisch last edited by Homoran

                                @klassisch

                                Habe gerade das log der Daten angesehen:

                                UBA_RoKi_log.png

                                Da kommen mit dem Skript regelmäßig Daten

                                K 1 Reply Last reply Reply Quote 0
                                • K
                                  klassisch Most Active @Homoran last edited by

                                  @Homoran Also bei mir hat die "633" ein ähnlicher Format wie meine. Und auch die Daten sind ein Tag alt. Irgendwas mache ich also falsch.

                                  Homoran 1 Reply Last reply Reply Quote 0
                                  • Homoran
                                    Homoran Global Moderator Administrators @klassisch last edited by

                                    @klassisch
                                    Nur das wir vom gleichen reden.

                                    Hier das Skript:

                                    /* Luftdaten
                                    -
                                    Liest Daten eines Luftdaten-Sensors
                                    von https://www.umweltbundesamt.de/api aus
                                    -
                                    https://www.umweltbundesamt.de/api/air_data/v2/xxx
                                    Request all stations (to find the station code for your region):
                                    https://www.umweltbundesamt.de/api/air_data/v2/meta/json?use=airquality&date_from=2019-01-01&date_to=2019-01-01&time_from=1&time_to=2
                                    -
                                    todo: Optin
                                    -
                                    20.09.2019 erstellt auf Vorlage von von Pix
                                    */
                                    
                                    
                                    var sensorid = "1114";
                                    
                                    var logging       = false;
                                    var instanz       = 'javascript.' + instance + '.';
                                    var pfad          = 'Luftdaten.' + sensorid + '.';
                                    var cronStr       = "14,29,44,59 * * * *";
                                    //var cronStr       = "* * * * *";
                                    
                                    function createStates () {
                                    
                                    // Allgemein   
                                       createState(pfad + 'json', {
                                           name: 'JSON',
                                           desc: 'JSON Ausgabe',
                                           type: 'string',
                                           role: 'json'
                                       }, function () {
                                           if (logging) log('Objekt ' + instanz + pfad + 'json erstellt');
                                       });
                                    
                                       createState(pfad + 'sensor_id', {
                                           name: 'ID',
                                           desc: 'ID-Nummer des Sensors',
                                           type: 'string',
                                           role: 'text'
                                       }, function () {
                                           if (logging) log('Objekt ' + instanz + pfad + 'sensor_id erstellt');
                                       });
                                       
                                       createState(pfad + 'sensor_type', {
                                           name: 'Typ',
                                           desc: 'Type des Sensors',
                                           type: 'string',
                                           role: 'text'
                                       }, function () {
                                           if (logging) log('Objekt ' + instanz + pfad + 'sensor_type erstellt');
                                       });
                                    
                                       createState(pfad + 'location', {
                                           name: 'Ort',
                                           desc: 'Location des Sensors',
                                           type: 'string',
                                           role: 'text'
                                       }, function () {
                                           if (logging) log('Objekt ' + instanz + pfad + 'location erstellt');
                                       });
                                       
                                       createState(pfad + 'lat', {
                                           name: 'Latitude',
                                           desc: 'Geographische Lage des Sensors - Breite',
                                           type: 'number',
                                           unit: '°',
                                           role: 'val'
                                       }, function () {
                                           if (logging) log('Objekt ' + instanz + pfad + 'latitude erstellt');
                                       });
                                       
                                       createState(pfad + 'lon', {
                                           name: 'Longitude',
                                           desc: 'Geographische Lage des Sensors - Länge',
                                           type: 'number',
                                           unit: '°',
                                           role: 'val'
                                       }, function () {
                                           if (logging) log('Objekt ' + instanz + pfad + 'longitude erstellt');
                                       });
                                       
                                       createState(pfad + 'country', {
                                           name: 'Country Code',
                                           desc: 'Geographische Lage des Sensors - Landeskürzel',
                                           type: 'string',
                                           role: 'text'
                                       }, function () {
                                           if (logging) log('Objekt ' + instanz + pfad + 'country erstellt');
                                       });
                                       
                                       createState(pfad + 'Messung.timestamp', {
                                           name: 'Zeitstempel',
                                           desc: 'Zeitstempel der Messung',
                                           type: 'string',
                                           role: 'text'
                                       }, function () {
                                           if (logging) log('Objekt ' + instanz + pfad + 'timestamp erstellt');
                                       });
                                       
                                       createState(pfad + 'Messung.PM10', {
                                           name: 'PM10',
                                           desc: 'Messung PM10',
                                           type: 'number',
                                           role: 'val',
                                       }, function () {
                                           if (logging) log('Objekt ' + instanz + pfad + 'Messung.PM10 erstellt');
                                       });
                                    
                                       createState(pfad + 'Messung.O3', {
                                           name: 'O3',
                                           desc: 'Messung O3',
                                           type: 'number',
                                           role: 'val',
                                       }, function () {
                                           if (logging) log('Objekt ' + instanz + pfad + 'Messung.O3 erstellt');
                                       });
                                    
                                       createState(pfad + 'Messung.NO2', {
                                           name: 'NO2',
                                           desc: 'Messung NO2',
                                           type: 'number',
                                           role: 'val',
                                       }, function () {
                                           if (logging) log('Objekt ' + instanz + pfad + 'Messung.NO2 erstellt');
                                       });
                                    
                                       createState(pfad + 'forceRefresh', {
                                           name: 'aktualisieren',
                                           desc: 'Werte neu einlesen',
                                           type: 'boolean',
                                           def:  false,
                                           role: 'indicator'
                                       }, function () {
                                           if (logging) log('Objekt ' + instanz + pfad + 'forceRefresh erstellt');
                                       });
                                    }
                                    
                                    
                                    function readData() {
                                       var Today, Now, DateString;
                                       var request = require('request');
                                       Today = new Date();
                                       DateString = Today.getFullYear() + '-' + (Today.getMonth()+1) + '-' + (Today.getDate()-1);
                                       Now = Today.getHours();
                                       var url= 'https://www.umweltbundesamt.de/api/air_data/v2/airquality/json?date_from=' + DateString + '&date_to=' + DateString + '&time_from=1' + '&time_to=' + (Now-1) + '&station=' + sensorid;
                                       //log(url);
                                       var options = {
                                           url: 'https://www.umweltbundesamt.de/api/air_data/v2/airquality/json?date_from=' + DateString + '&date_to=' + DateString + '&time_from=1' + '&time_to=' + (Now-1) + '&station=' + sensorid,
                                           headers: {
                                               'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1'
                                           }
                                       };  
                                       try {
                                           request(options, function (error, response, body) {
                                               if (!error && response.statusCode == 200) {              // kein Fehler, Inhalt in body
                                                   var p1, p2;
                                                   var json = JSON.parse(body);
                                                   var Station = json.data[sensorid];
                                                   var allPropertyNames = Object.keys(Station);
                                                   setState(pfad + 'json',JSON.stringify(json.data));
                                                   if (logging) {
                                                       for (var j=0; j<allPropertyNames.length; j++) {
                                                           var name = allPropertyNames[j];
                                                           var value = Station[name];
                                                           log('name: ' + name + '; value: ' + value);
                                                       }
                                                   }
                                                   //log(allPropertyNames.length);
                                                   //Use only the last entry, because this is the latest: that's what we want to add
                                                   name = allPropertyNames[allPropertyNames.length-1];
                                                   value = Station[name];
                                    
                                                   if (logging) {
                                                       //log('JSON: ' + JSON.stringify(json.data));
                                                       //log('Station: ' + JSON.stringify(Station));
                                                       //log('JSON: ' + JSON.stringify(json.indices.data));
                                                       log(name + 'value[0]: ' + value[0]);
                                                       log(name + 'value[1]: ' + value[1]);
                                                       log(name + 'value[2]: ' + value[2]);
                                                       log(name + 'value[3]: ' + value[3]);
                                                       log(name + 'value[4]: ' + value[4]);
                                                       log(name + 'value[5]: ' + value[5]);
                                                       log(name + 'value[6]: ' + value[6]);
                                                       //var xx = value[3][0];
                                                       //log(xx);
                                                   }
                                                   var PM10,O3, NO2;
                                                   for (var count=3; count<value.length; count++) {
                                                       //log(parseInt(value[count][0]));
                                                       //log(value.length);
                                                       switch(parseInt(value[count][0])) {
                                                           case 1:
                                                               // PM10
                                                               PM10 = value[count][1];
                                                               //log('PM10: ' + PM10);
                                                               setState(pfad + 'Messung.PM10', parseFloat(PM10),true);
                                                               break;
                                                           case 3:
                                                                   // O3
                                                                   O3 = value[count][1];
                                                                   //log('O3: ' + O3);
                                                                   setState(pfad + 'Messung.O3', parseFloat(O3),true);
                                                                   break;
                                                               case 5:
                                                                   // NO2
                                                                   NO2 = value[count][1];
                                                                   //log('NO2: ' + NO2);
                                                                   setState(pfad + 'Messung.NO2', parseFloat(NO2),true);
                                                                   break;
                                                               default:
                                                                   // code block
                                                       } 
                                                   }
                                     /*
                                                   setState(pfad + 'sensor_id', json[0].sensor.id.toString());
                                                   setState(pfad + 'sensor_type', json[0].sensor.sensor_type.name + ' by ' + json[0].sensor.sensor_type.manufacturer);
                                                   
                                                   setState(pfad + 'location', json[0].location.id.toString());
                                                   setState(pfad + 'lat', parseFloat(json[0].location.latitude));
                                                   setState(pfad + 'lon', parseFloat(json[0].location.longitude));
                                                   setState(pfad + 'country', json[0].location.country);
                                                   
                                                   setState(pfad + 'Messung.timestamp', json[0].timestamp);
                                                   p1 = json[0].sensordatavalues[0].value;
                                                   p2 = json[0].sensordatavalues[1].value;
                                                   
                                                   setState(pfad + 'Messung.P1', parseFloat(p1));
                                                   setState(pfad + 'Messung.P2', parseFloat(p2));
                                                   */
                                               } else {
                                                   log("StatusCode = "+response.statusCode);
                                                   log(error,'error');                               // Error beim Einlesen
                                               }
                                           });
                                           log('Luftdaten aktualisiert');
                                       } catch (e) {
                                           log('Fehler (try) Luftdaten.info: ' + e, 'error');
                                       }
                                    }
                                    
                                    // regelmässige Wiederholungen
                                    schedule(cronStr, readData);
                                    
                                    // einmaliger Start bei Skriptstart
                                    createStates();
                                    setTimeout(readData, 1500);
                                    
                                    // Start beim Setzen auf true
                                    on(instanz + pfad + 'forceRefresh', function (obj) {
                                       if (!obj.state.ack && obj.state.val) readData();
                                    });
                                    
                                    

                                    In Zeile 7 steht ein Link.

                                    Diesen aufrufen - und ja, das dauert ewig - dann in der Liste (ARRAY) die Nummer deiner Station suchen.
                                    Dazu uf der Karte des UmweltBUNDESamtes https://www.umweltbundesamt.de/daten/luft/luftdaten/luftqualitaet/eJzrWJSSuMrIwNBS19BI18h8UUnmIkODRXmpCw0XFZcsNjIyWZziVoRQYLA4JSQfWX1uFcei3OSmxTmJJacdPPxn1vE1PF6ck5d-2kFxFf-EabvnAQCejCSu

                                    Deine Station suchen und den Stationsnamen in dem Array suchen.

                                    Die dort befindliche Stationsnummer im Skript in Zeile 16 eintragen

                                    1 Reply Last reply Reply Quote 0
                                    • Homoran
                                      Homoran Global Moderator Administrators last edited by

                                      Bin ein wenig weiter.
                                      Habe noch die Seite vom LANUV (Landesamt für Natur, Umwelt und Verkehr, NRW) über den Parser ausgelesen.
                                      Hier neben PM10 auch die Werte für NO2 und O3, was das Skript über die API vom UBA auch ermittelt.

                                      Langsam glaube ich an nichts mehr:

                                      Luftwerte.png

                                      Da passt nichts zusammen 😉

                                      K 1 Reply Last reply Reply Quote 0
                                      • K
                                        klassisch Most Active @Homoran last edited by

                                        @Homoran So, jetzt habe ich auch wieder her gefunden. Ja, bei mir passt das auch nicht. Die Webseite des Landes sagt etwas anderes als das Skript.
                                        Habe jetzt das Skript neu geladen - und er holt wieder Werte von gestern.
                                        Vielleicht mittelt das Skript, ich habe es nicht verstanden. Ausserdem zeigt es nicht alle Werte an.
                                        Wie hast Du die Seite Deines Landes geparst?
                                        Ich habe mal als Beispiel die Meßstation in der Nähe des ioBroker Headquarter genommen. Da gibt es z.B. diese "Karlsruhe Reinhold Frank-Straße":

                                        https://www.umweltbundesamt.de/daten/luft/luftdaten/luftqualitaet

                                        https://www.lubw.baden-wuerttemberg.de/luft/messwerte-immissionswerte#karte

                                        Aber da muß man noch irgendwelche Menues bedienen. Das wird wohl nichts.

                                        Homoran 1 Reply Last reply Reply Quote 0
                                        • Homoran
                                          Homoran Global Moderator Administrators @klassisch last edited by

                                          @klassisch
                                          habe mich gerade zdurch den Code gewühlt und @piForscher in dem Thread zum Skript angepingt:
                                          https://forum.iobroker.net/topic/6777/luftdate-info-per-skript-einlesen/26

                                          Ich sehe mir mal deine Links an, ob ich da was machen kann.
                                          Auch in der Website des LANUV muss man den Quelltext des Tabellen-Frames analysieren.

                                          Homoran 1 Reply Last reply Reply Quote 0
                                          • Homoran
                                            Homoran Global Moderator Administrators @Homoran last edited by

                                            @klassisch sagte in Gedanken zur Feinstaubmessung:

                                            Wie hast Du die Seite Deines Landes geparst?

                                            Nachdem ich die Seiten des Landesamts BaWü gesehen habe muss ich sagen ich habe Glück:
                                            https://www.lanuv.nrw.de/umwelt/luft/immissionen/aktuelle-luftqualitaet

                                            Im linken Menü dann den Parameter auswählen und mit der rechten Maustaste in der Tabelle den frame-Quelltext anzeigen.
                                            Da kann man dann parsen.

                                            z.B. PM10:
                                            Frame-Link: https://www.lanuv.nrw.de/fileadmin/lanuv/luft/immissionen/aktluftqual/eu_pm10_akt.htm
                                            RegEx: RODE<\/td><td class="eins">[<\d]*<\/td><td class="zwei">([<\d]*)<

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            609
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            10
                                            150
                                            12151
                                            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