Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Luftdate.info per Skript einlesen

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Luftdate.info per Skript einlesen

    This topic has been deleted. Only users with topic management privileges can see it.
    • A
      Ace-k last edited by

      Ich kann wenn ich den Haken bei aktivieren setze nicht auf speichern klicken .

      1 Reply Last reply Reply Quote 0
      • C
        chris last edited by

        Hallo,

        das Problem mit dem speichern hatte ich auch.

        Pix verwendet wohl influxdb und du history. Tausche im Script "influxdb.0" gegen "history.0".

        Ich musste allerdings unter Objekte den Ordner "Luftdaten" einmal löschen und und das Script dann neu starten.

        Speichern war dann automatisch aktiviert.

        Gruß

        Chris

        1 Reply Last reply Reply Quote 0
        • A
          Ace-k last edited by

          da wollte ich auch gerade mal reinschauen ob im Skript evtl was anderes ist.

          aber ob ich genau draufgekommen wäre :lol:

          besten dank. es scheint zu gehen!

          1 Reply Last reply Reply Quote 0
          • P
            pix last edited by

            @chris:

            Hallo,

            das Problem mit dem speichern hatte ich auch.

            Pix verwendet wohl influxdb und du history. Tausche im Script "influxdb.0" gegen "history.0".

            Ich musste allerdings unter Objekte den Ordner "Luftdaten" einmal löschen und und das Script dann neu starten.

            Speichern war dann automatisch aktiviert.

            Gruß

            Chris `
            Darauf hätte ich auch mal kommen können. Danke für den Hinweis.

            Gruß

            Pix

            1 Reply Last reply Reply Quote 0
            • P
              pix last edited by

              Hallo,

              die Daten des eigenen Sensors und fremder Geräte lassen sich auch über Apollon77's neuen iobroker.ham - Adapter einlesen.

              Folgt diesem Link: viewtopic.php?f=36&t=14972&p=156438#p156438

              Gruß

              Pix

              1 Reply Last reply Reply Quote 0
              • umbm
                umbm last edited by

                Es gibt inzwischen einen Adapter.

                Da ich kein Doppelposting machen möchte, bitte hier lesen

                viewtopic.php?f=8&t=9865&p=157989#p157989

                1 Reply Last reply Reply Quote 0
                • Segway
                  Segway last edited by

                  Wahrscheinlich völlig falsche Widgets genommen - aber egal 🙂 mir gefällts - DANKE pix

                  1043_bildschirmfoto_2018-08-09_um_18.12.33.png

                  1 Reply Last reply Reply Quote 0
                  • Segway
                    Segway last edited by

                    Anmerkung:

                    Im Log finde ich immer folgende Meldungen - da wird die verbindung zur DB verloren:

                    javascript.0	2018-08-12 10:56:16.427	warn	Reconnection to DB.
                    javascript.0	2018-08-12 10:56:16.404	warn	Reconnection to DB.
                    host.RaPi03-FHEM-Prod	2018-08-12 10:55:15.029	info	instance system.adapter.luftdaten.0 terminated with code 0 (OK)
                    luftdaten.0	2018-08-12 10:55:04.376	info	starting. Version 0.0.6 in /opt/iobroker/node_modules/iobroker.luftdaten, node: v6.14.3
                    

                    Ist das richtig so ?

                    1 Reply Last reply Reply Quote 0
                    • S
                      schittl last edited by

                      Hallo pix,

                      erstmal vielen Dank für das geniale Skript. Wie immer von Dir super Arbeit. Ich habe nur ein kleines Problem. Falls der Sensor nicht erreichbar ist, bekomme ich folgenden Fehler und JS startet sich immer neu. Kann man das irgendwie umgehen?

                      ! javascript.0 2018-08-13 11:28:36.350 error at Socket.emit (events.js:188:7)
                      ! javascript.0 2018-08-13 11:28:36.350 error at emitOne (events.js:96:13)
                      ! javascript.0 2018-08-13 11:28:36.350 error at Socket.socketErrorListener (_http_client.js:310:9)
                      ! javascript.0 2018-08-13 11:28:36.350 error at ClientRequest.emit (events.js:188:7)
                      ! javascript.0 2018-08-13 11:28:36.350 error at emitOne (events.js:96:13)
                      ! javascript.0 2018-08-13 11:28:36.350 error at Request.onRequestError (/opt/iobroker/node_modules/iobroker.javascript/node_modules/request/request.js:878:8)
                      ! javascript.0 2018-08-13 11:28:36.350 error at Request.emit (events.js:188:7)
                      ! javascript.0 2018-08-13 11:28:36.350 error at emitOne (events.js:96:13)
                      ! javascript.0 2018-08-13 11:28:36.350 error at self.callback (/opt/iobroker/node_modules/iobroker.javascript/node_modules/request/request.js:186:22)
                      ! javascript.0 2018-08-13 11:28:36.350 error at Request._callback (script.js.XSkripte.Luftdaten:613:47)
                      ! javascript.0 2018-08-13 11:28:36.350 error TypeError: Cannot read property 'statusCode' of undefined
                      ! javascript.0 2018-08-13 11:28:36.349 error uncaught exception: Cannot read property 'statusCode' of undefined

                      Mein Skript sieht aktuell so aus (Auszug):

                      ! ````
                      try {
                      request(options, function (error, response, body) {
                      if (!error && response.statusCode == 200) { // kein Fehler, Inhalt in body
                      var p1, p2, note;
                      var json = JSON.parse(body);
                      if (logging) log('body: ' + body);

                                  if (logging) log('JSON: ' + JSON.stringify(json));
                                  setState(pfad + 'json', JSON.stringify(json));
                      
                                  if (json[0].sensor.id.toString() !== undefined) {
                                  .....
                      

                      ! ````

                      Aktuell scheint die Seite gar nicht mehr zu gehen. Kommt gar nix zurück…

                      Danke Dir und vg

                      Falk

                      1 Reply Last reply Reply Quote 0
                      • P
                        piForscher last edited by

                        Hallo,
                        weil es mit luftdaten.de einige Schwierigkeiten gab und dort auch nur Feinstaubwerte abrufbar sind,
                        habe ich weiter gesucht und beim UBA schöne Luftqualitätsdaten gefunden - allerdings keine API.
                        Aber auf Anfrage hat man mir sehr gut geholfen und ich habe jetzt das Script von Pix ein wenig umgebaut.
                        Ist noch ziemlich roh, aber es funktioniert bisher.
                        Es ist ein Schritt vorher erforderlich:
                        Im Browser den Request absetzen, um die gewünschte Station abzufragen (das habe ich nicht automatisiert, weil der Befehl alle Stationen abfragt, somit ziemlich lange braucht und ich den Server nicht nerven will...)
                        Die Antwort enthält 'stations' und dort kann man die gewünschte Station suchen und dann die zugehörige ID.
                        Dabei hilft die Karte unter https://www.umweltbundesamt.de/daten/luft/luftdaten/luftqualitaet.

                        /* 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 = "633";
                        
                        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();
                        });
                        
                        Homoran 1 Reply Last reply Reply Quote 0
                        • Homoran
                          Homoran Global Moderator Administrators @piForscher last edited by

                          @piForscher
                          ich verstehe nicht allzuviel vom Skripten, bekomme mit deinem Skript zwar (manchmal) Ergebnisse, die passen aber nicht zu anderen Ergebnissen.

                          Zum einen wird z.B. das Ozon auf einmal nicht aktualisiert

                          Zum anderen passen die UBA-Werte nicht zu denen des LANUV, die IMHO die gleiche Station nutzen. Kann mich da aber auch täuschen.

                          Habe mich dann als Nicht-Skripter zum einen versucht durch dein Skript zu wühlen, zum anderen auf der Website des UBA mehr Informationen zu bekommen.

                          Einen Hinweis auf die API finde ich gar nicht - und die Werte die auf deren Karten angezeigt werden entsprechen nicht denen, die das Skript auswirft.

                          Der URL, den du zusammenbaust enthält Datum von und bis.
                          Warum addierst du bei dem Monat einen drauf?
                          geht das im Dezember überhaupt?
                          und im Tag ziehst du einen ab.

                          Im Url.log steht seltsamerweise der 12. als Monat aber der gestrige Tag.

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

                            Und wie kommt es zu den vielen Werten beginnend von 00:00 Uhr bis zur (aktuellen Stunde - 1) auch wenn man die von .. bis Zeiten auf die letzte Stnde beschränkt.
                            Bitte nicht falsch verstehen, ich will nicht schimpfen, sondern das Skript nutzen. Denn ich halte das für eine sehr gute Idee.
                            Die Luftdaten-Leute setzen den SDS011 Sensor ein, der über 70% rel. Feuchte nicht spezifiziert ist und dann meiner Beobachtung nach recht hohe Werte anzeigt. Diese Werte werden aber nicht unterdrückt, sondern fleißig weiter gesendet und für bare Münze genommen. Das macht die Messungen und die Daten aber meiner Meinung nach in letzter Konsequenz wertlos.
                            Ich nehm an, daß die offiziellen Stationen für dem optischen Vermessen qualifiziert trocknen. Deshalb bin ich in Ergänzung zu den eigenen Messungen noch an den offiziellen Messungen interessiert.

                            1 Reply Last reply Reply Quote 0
                            • P
                              piForscher last edited by

                              Hallo,
                              die API vom UBA ist hier beschrieben: https://www.umweltbundesamt.de/daten/luft/luftdaten/doc
                              Zusätzlich hatte ich von einem sehr netten UBA-Mitarbeiter diese Beispiele bekommen:
                              Luftportal_API.pdf
                              Das hatte mir geholfen, das Script soweit zusammenzubasteln.
                              Und dann war ich auch erstmal happy - die Daten habe ich nicht verifiziert.
                              Fühlt euch frei, das Script zu verbessern 🙂

                              1 Reply Last reply Reply Quote 1
                              • S
                                Silence1599 @pix last edited by

                                @pix Ich finde die Ansicht der Karte super. Wie bekommst du es hin, dass die Banner der Webseite nicht angezeigt werden ?

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

                                  @silence1599 Du weisst schon, dass der referenzierte Beitrag 8 Jahre alt idt?

                                  Da hat sich mittlerweile garantiert einiges geändert.

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

                                  Support us

                                  ioBroker
                                  Community Adapters
                                  Donate

                                  1.0k
                                  Online

                                  31.7k
                                  Users

                                  79.7k
                                  Topics

                                  1.3m
                                  Posts

                                  18
                                  38
                                  7168
                                  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