Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Luftdate.info per Skript einlesen

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.8k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.2k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.2k

Luftdate.info per Skript einlesen

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
38 Beiträge 18 Kommentatoren 8.9k Aufrufe 8 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • P Offline
    P Offline
    pix
    schrieb am zuletzt editiert von
    #14

    Hallo,

    das Fehlerhandling klappt noch nicht so recht.

    Cannot read property 'sensor' of undefined

    Wenn der Sensor mal keine Daten liefert, dann gibt es Probleme. Neulich war die SensorID meines nächsten Sensors auf Luftdaten.inof komplett verschwunden. Musste ich mir einen neuen Nächsten suchen….

    Ich kann mal versuchen, mit einer weiter Abfrage einen Fehler beim Abarbeiten zu verhindern. Ich probiere es aus.

    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);
                    if (logging) log('JSON: ' + JSON.stringify(json));
                    setState(pfad + 'json', JSON.stringify(json));
                    if (json[0].sensor.id.toString() != undefined) {         // <--------- Abfrage hier neu
                        setState(pfad + 'sensor_id', json[0].sensor.id.toString());
                        // ... hier sind noch mehr Daten
                    } else log('Fehler beim Parsen!", 'error');                 // <---------  Anweisung hier neu
                } else {
                    log("StatusCode = "+response.statusCode);
                    log(error,'error');                               // Error beim Einlesen
                }
            });
            log('Luftdaten aktualisiert');
        } catch (e) {
            log('Fehler (try) Luftdaten.info: ' + e, 'error');
        }
    

    Gruß

    Pix

    ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

    1 Antwort Letzte Antwort
    0
    • P Offline
      P Offline
      pix
      schrieb am zuletzt editiert von
      #15

      Hallo,

      habe nachgesehen und den gleichen Fehler gestern zwei drei mal gehabt:

      2017-08-06 08:00:24.939  - [31merror[39m: javascript.2 uncaught exception: Cannot read property 'value' of undefined
      2017-08-06 08:00:24.946  - [31merror[39m: javascript.2 TypeError: Cannot read property 'value' of undefined
          at Request._callback (script.js.Test.Test_Luftdaten:937:103)
          at Request.self.callback (/Users/pix/Documents/iobroker/node_modules/request/request.js:188:22)
          at emitTwo (events.js:87:13)
          at Request.emit (events.js:172:7)
          at Request. <anonymous>(/Users/pix/Documents/iobroker/node_modules/request/request.js:1171:10)
          at emitOne (events.js:77:13)
          at Request.emit (events.js:169:7)
          at IncomingMessage. <anonymous>(/Users/pix/Documents/iobroker/node_modules/request/request.js:1091:12)
          at IncomingMessage.g (events.js:260:16)
          at emitNone (events.js:72:20)
          at IncomingMessage.emit (events.js:166:7)
      2017-08-06 08:00:25.212  - [31merror[39m: host.MacMini.local instance system.adapter.javascript.2 terminated with code 0 (OK)
      2017-08-06 08:00:25.213  - [32minfo[39m: host.MacMini.local Restart adapter system.adapter.javascript.2 because enabled</anonymous></anonymous> 
      

      Bei mir sieht das Skript schon so aus:

      ! ````
      /* Luftdaten
      ! Liest Daten eines Feinstaub-Sensors
      von luftdaten.info aus
      ! http://api.luftdaten.info/v1/sensor/####/
      ! 05.06.2017 erstellt von Pix
      10.07.2017 Code angepasst nach Fehler
      12.07.2017 Fehler abfangen, wenn JSON leer
      30.07.2017 Zoomstufe für VIS
      */
      ! const sensorid = "4395"; //
      ! const logging = false;
      const instanz = 'javascript.' + instance + '.';
      const pfad = 'Luftdaten.' + sensorid + '.';
      const cronStr = "14,29,44,59 * * * *";
      ! function createStates () {
      // Nur für VIS Bedienung
      createState('Luftdaten.Zoom', {
      name: 'Zoom',
      desc: 'Zoomstufe Karte in VIS',
      type: 'number',
      min: 0,
      max: 13,
      def: 11
      }, function () {
      if (logging) log('Objekt ' + instanz + 'Luftdaten.Zoom erstellt');
      });

      // 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.P1', {
          name: 'P1',
          desc: 'Messung P1',
          type: 'number',
          role: 'val',
          custom: {
              "influxdb.0": {
              "enabled": true,
              "changesOnly": true,
              "debounce": "",
              "retention": 63072000
              }
          }
      }, function () {
          if (logging) log('Objekt ' + instanz + pfad + 'Messung.P1 erstellt');
      });
      

      ! createState(pfad + 'Messung.P2', {
      name: 'P2',
      desc: 'Messung P2',
      type: 'number',
      role: 'val',
      custom: {
      "influxdb.0": {
      "enabled": true,
      "changesOnly": true,
      "debounce": "",
      "retention": 63072000
      }
      }
      }, function () {
      if (logging) log('Objekt ' + instanz + pfad + 'Messung.P2 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 request = require('request');
      var options = {
      url: 'http://api.luftdaten.info/v1/sensor/' + 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);
      if (logging) log('JSON: ' + JSON.stringify(json));

                  if (JSON.stringify(json).length <= 2) {
                      log ('JSON Daten sind nicht empfangbar', 'warn');
                  } else {
                      setState(pfad + 'json', JSON.stringify(json));
                      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);
      
                      if (json[0].sensordatavalues[0].value !== undefined && json[0].sensordatavalues[1].value !== undefined) {
                          p1 = json[0].sensordatavalues[0].value;
                          p2 = json[0].sensordatavalues[1].value;
      
                          setState(pfad + 'Messung.P1', parseFloat(p1));
                          setState(pfad + 'Messung.P2', parseFloat(p2));
                          log('Luftdaten aktualisiert');
                      } else {
                          log('Luftdaten nicht aktualisiert, da keine Messdaten', 'warn');
                      }
                  }
              } else {
                  log("StatusCode = " + response.statusCode);
                  log(error, 'error');                               // Error beim Einlesen
              }
          });
      } 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();
      });
      ! ````

      Vielleicht kann noch jemand helfen?

      Gruß

      Pix

      ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

      1 Antwort Letzte Antwort
      0
      • paul53P Offline
        paul53P Offline
        paul53
        schrieb am zuletzt editiert von
        #16
                            if (json[0].sensordatavalues[0].value !== undefined && json[0].sensordatavalues[1].value !== undefined) {
        

        Ändere mal die Abfrage in

                            if (json[0].sensordatavalues[0] && json[0].sensordatavalues[1]) {
        
        

        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

        1 Antwort Letzte Antwort
        0
        • P Offline
          P Offline
          pix
          schrieb am zuletzt editiert von
          #17

          Vielen Dank, paul53.

          Z.Zt. ist mein Lieblingssender wieder offline. Daher

          20:29:00.784	[warn]	javascript.2 script.js.Test.Test_Luftdaten: JSON Daten sind nicht empfangbar
          

          Es greift also die Abfrage:

                          if (JSON.stringify(json).length <= 2) {
                              log ('JSON Daten sind nicht empfangbar', 'warn');
                          }
          

          Wenn der Sender wieder online ist, werde ich die Code Korrektur prüfen können.

          Gruß

          Pix

          ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

          1 Antwort Letzte Antwort
          0
          • L Online
            L Online
            Linedancer
            schrieb am zuletzt editiert von
            #18

            Hallo Pix,

            Hab die Änderung eingebaut. Scheint zu kaufen, allerdings kann ich noch nicht testen, da meine gewählte ID jetzt wieder sendet.

            Dank dir

            –

            Ciao, Gerhard

            1 Antwort Letzte Antwort
            0
            • P Offline
              P Offline
              pix
              schrieb am zuletzt editiert von
              #19

              Hier - für die Vollständigkeit - eine Darstellung mit Grafana.

              http://forum.iobroker.net/viewtopic.php … ana#p99946

              Pix

              ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

              1 Antwort Letzte Antwort
              0
              • S Offline
                S Offline
                Solear
                schrieb am zuletzt editiert von
                #20

                @fruehwi:

                Nun habe ich mir noch einen zweiten Sensor gebaut der in der Wohnung verbaut ist. (Kachelofen Überwachung) Dieser soll nicht die Daten an den Luftdaten.info Server senden.

                Daher möchte ich die Daten per Parser auslesen (IP-Sensor/values).

                Laut https://regex101.com/habe ich die Kombinationen gefunden

                PM2.5

                (?:PM2[^]*)(?=[^]* class='r'>)([0-9.]{1,})
                

                PM10

                (?:PM10[^]*)(?=[^]* class='r'>)([0-9.]{1,})
                

                Temperatur

                (?:Temper[^]*)(?=[^]* class='r'>)([0-9.]{1,})
                

                Luftfreuchte

                (?:rel[^]*)(?=[^]* class='r'>)([0-9.]{1,})
                

                Hoffe das mir jemand helfen kann. `

                Hallo,

                bist du hier (oder jemand anderes) schon weiter?

                Ich möchte gerne einen Feinstaubsensor im Haus installieren und in iobroker auswerten, aber ohne über eine Cloud zu gehen. Analog zu den Dingern wie es die Luftreiniger haben (Xiaomi Air Purifer etc).

                Oder gibt es einen anderen Staubsensor den man einbinden kann?

                iobroker als LXC unter Proxmox

                1 Antwort Letzte Antwort
                0
                • A Offline
                  A Offline
                  Ace-k
                  schrieb am zuletzt editiert von
                  #21

                  also erstmal , coole sache.

                  Funktioniert und das Skript liest die Daten aus.

                  Werde mir auch selber noch eine Station bauen.

                  aber ich benötige bitte mal die erklärung der Daten.

                  p1= PM10 ?

                  p2= Pm2,5 ?

                  Welcher Wert und welches Widget stellt mir die 24h anzeige dar?

                  Besten Dank

                  1 Antwort Letzte Antwort
                  0
                  • A Offline
                    A Offline
                    Ace-k
                    schrieb am zuletzt editiert von
                    #22

                    Hallo

                    nach Rücksprache, nunalles in der History und dann per Flot.

                    Wenn ich die Zahnräder anklicke kann ich zwar "aktivieren" aber nicht speichern. Er macht einfach nix.

                    Andere Sachen speichert er, aber nicht P1 und P2.

                    Woran kann das liegen?
                    2562_32.jpg

                    1 Antwort Letzte Antwort
                    0
                    • P Offline
                      P Offline
                      pix
                      schrieb am zuletzt editiert von
                      #23

                      Hallo Ace-k,

                      ich verstehe dein Problem nicht. Wenn du in das Zahnrad klickst, die Speicherdauer auswählst und aktivierst (Haken links oben setzen), dann werden die eingelesenen Werte in der Datenbank gespeichert. Nach einigen Stunden (ein paar Durchgängen des Einlesens) kannst du mit Flot eine Grafik erstellen. 261_bildschirmfoto_2018-02-07_um_18.41.45.png
                      Gruß

                      Pix~~@Ace-k:~~

                      aber ich benötige bitte mal die erklärung der Daten.

                      p1= PM10 ?

                      p2= Pm2,5 ?

                      Welcher Wert und welches Widget stellt mir die 24h anzeige dar? `
                      Infos zu PM10 und PM2,5 https://www.umweltbundesamt.de/themen/luft/luftschadstoffe/feinstaub

                      Es gibt keinen 24 Stunden Wert, der wird nicht in der API von luftdaten.info zur Verfügung gestellt und kann somit nicht eingelesen werden. Wie oben erklärt, kannst du mit der ioBroker History-FUnktion selbst einen Chart erzeugen (und im iFrame Widget von VIS anzeigen), Mittelwerte berechnen, usw.

                      Gruß

                      Pix

                      ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

                      1 Antwort Letzte Antwort
                      0
                      • A Offline
                        A Offline
                        Ace-k
                        schrieb am zuletzt editiert von
                        #24

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

                        1 Antwort Letzte Antwort
                        0
                        • C Offline
                          C Offline
                          chris
                          schrieb am zuletzt editiert von
                          #25

                          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 Antwort Letzte Antwort
                          0
                          • A Offline
                            A Offline
                            Ace-k
                            schrieb am zuletzt editiert von
                            #26

                            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 Antwort Letzte Antwort
                            0
                            • P Offline
                              P Offline
                              pix
                              schrieb am zuletzt editiert von
                              #27

                              @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

                              ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

                              1 Antwort Letzte Antwort
                              0
                              • P Offline
                                P Offline
                                pix
                                schrieb am zuletzt editiert von
                                #28

                                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

                                ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

                                1 Antwort Letzte Antwort
                                0
                                • umbmU Offline
                                  umbmU Offline
                                  umbm
                                  schrieb am zuletzt editiert von
                                  #29

                                  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 Antwort Letzte Antwort
                                  0
                                  • SegwayS Offline
                                    SegwayS Offline
                                    Segway
                                    schrieb am zuletzt editiert von
                                    #30

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

                                    1043_bildschirmfoto_2018-08-09_um_18.12.33.png

                                    Gruß Dirk
                                    Intel Proxmox Cluster (3x NUC) mit Debian & Proxmox / IoB als VM unter Debian / 60+ Adapter installiert

                                    1 Antwort Letzte Antwort
                                    0
                                    • SegwayS Offline
                                      SegwayS Offline
                                      Segway
                                      schrieb am zuletzt editiert von
                                      #31

                                      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 ?

                                      Gruß Dirk
                                      Intel Proxmox Cluster (3x NUC) mit Debian & Proxmox / IoB als VM unter Debian / 60+ Adapter installiert

                                      1 Antwort Letzte Antwort
                                      0
                                      • S Offline
                                        S Offline
                                        schittl
                                        schrieb am zuletzt editiert von
                                        #32

                                        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

                                        HW: Lenovo M920q (Proxmox, ioBroker, RaspMatic & Z2M), QNAP (Docker, Influx), Arduino Mega 2560 R3 (I2C DS18B20 + LED)

                                        SW: CT IoBroker, VM RaspMatic(v3.79.6.20241122)

                                        1 Antwort Letzte Antwort
                                        0
                                        • P Offline
                                          P Offline
                                          piForscher
                                          schrieb am zuletzt editiert von
                                          #33

                                          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();
                                          });
                                          

                                          –----------------------------------

                                          44 HM-Geräte mit CCU2

                                          iobroker auf MSI Ubuntu, Raspi2 und RaspiB.


                                          HomoranH 1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          794

                                          Online

                                          32.4k

                                          Benutzer

                                          81.5k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe