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

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    • Save The Date: ioBroker@Smart Living Forum Solingen, 14.06.

    Luftdate.info per Skript einlesen

    This topic has been deleted. Only users with topic management privileges can see it.
    • P
      pix last edited by

      Hallo,

      stelle mal wieder ne Parsing-Lösung vor 😄

      Diesmal gehts um die Daten des Projektes http://luftdaten.info. Es geht um DIY-Feinstaubsensoren. Noch habe ich keinen gebaut, aber vielleicht komme ich noch dazu. Bis dahin nutze ich die Daten eines Nachbarn.

      Zuerst sie auf der Karte nach, wo in deiner Nähe ein Sensor ist.

      http://deutschland.maps.luftdaten.info/#6/51.165/10.455 261_bildschirmfoto_2017-07-10_um_14.25.51.jpg
      Nehme als Beispiel mal diesen Sensor 3877 in Freiburg.

      Dann das Skript anpassen (Sensor ID)

      ! ````
      /* Luftdaten
      ! Liest Daten eines Feinstaub-Sensors
      von luftdaten.info aus
      ! http://api.luftdaten.info/v1/sensor/####/
      ! todo: Optin
      ! 05.06.2017 erstellt von Pix
      10.07.2017 Code angepasst nach Fehler
      */
      ! var sensorid = "3877";
      ! var logging = false;
      var instanz = 'javascript.' + instance + '.';
      var pfad = 'Luftdaten.' + sensorid + '.';
      var cronStr = "14,29,44,59 * * * *";
      ! 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.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));
      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);
                  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();
      });
      ! ````

      Sieht im Objektbrowser dann so aus:
      261_bildschirmfoto_2017-07-10_um_14.32.09.jpg

      Und in VIS dann so:
      261_bildschirmfoto_2017-07-10_um_14.36.47.png

      Das Skript sieht gleich vor, die Messwerte in die InfluxDB zu schieben. Bitte bei Nichtgebrauch diesen Teil löschen.

      Gruß

      Pix

      PS: Irgendwie habe ich den Eindruck, ich habe das hier schon mal vorgestellt. Aber meine Suche spuckte nix aus … :shock:

      S 1 Reply Last reply Reply Quote 0
      • K
        Kueppert last edited by

        Cool, sieht ja Klasse aus bei dir. Hast du die Widgets vielleicht noch als Export, die du nutzt?

        Thx und Grüße, kueppert

        Gesendet von meinem HUAWEI RIO-L01 mit Tapatalk

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

          Hallo,

          danke fürs Feedback. Nein, die Widgets exportiere ich nicht. Das ist aber auch alles sehr einfach nachgebaut. Sind ja nur 5 Widgets + Navigation.

          Gruß

          Pix

          1 Reply Last reply Reply Quote 0
          • T
            tempestas last edited by

            Das Thema Luft betrifft mich zwar nicht direkt, aber danke dafür, dass ich hier mal ein gutes Anschauungsbeispiel zum Thema Parsing fionde.

            Könnte mir bei meinem anstehenden Projekt gut helfen.

            1 Reply Last reply Reply Quote 0
            • F
              fruehwi last edited by

              Hallo,

              das sieht ja sehr gut aus!

              Das ist ja timing, mein Sensor ist unterwegs und kommt am nächsten Montag!

              Gruße,

              Fruehwi

              1 Reply Last reply Reply Quote 0
              • F
                fruehwi last edited by

                Hallo Pix,

                dein Skript funktioniert super.

                Konnte die Daten von Luftdaten einlesen.

                @all:

                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).

                <title>Aktuelle Werte</title>	[![](/images?name=luftdaten_logo)](/)	
                
                ### Feinstaubsensor
                
                	ID: 2221799
                MAC: A0:20:A6:21:E6:XX
                Firmware: NRZ-2017-092
                
                #### Übersicht » Aktuelle Werte
                
                | Sensor | Parameter | Wert |
                |   |
                | SDS011 | PM2.5 | 6.6 µg/m³ |
                | SDS011 | PM10 | 14.6 µg/m³ |
                |   |
                | DHT22 | Temperatur | 22.0 °C |
                | DHT22 | rel. Luftfeuchte | 59.0 % |
                |   |
                | WiFi | Signal | -62 dBm |
                | WiFi | Qualität | 76 % |
                
                [Zurück zur Startseite](/)
                
                [![](/images?name=cfg_logo)](http://codefor.de/)
                
                

                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.

                Danke im voraus.

                Viele Grüße,

                Fruehwi

                1 Reply Last reply Reply Quote 0
                • A
                  andyb last edited by

                  @pix:

                  Hallo,

                  danke fürs Feedback. Nein, die Widgets exportiere ich nicht. Das ist aber auch alles sehr einfach nachgebaut. Sind ja nur 5 Widgets + Navigation.

                  Gruß

                  Pix `
                  OT: Kannst du mir erklären wie an dem Diagramm der transparente Hintergrund realisiert ist? Ist doch flot oder?

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

                    So:

                    Anwenderhintergrund: check

                    Farbe: rgba(XX,XX,XX,0)

                    261_bildschirmfoto_2017-07-27_um_15.42.28.jpg

                    Gruß

                    Pix

                    1 Reply Last reply Reply Quote 0
                    • A
                      andyb last edited by

                      Dankeschön [emoji122]

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

                        Hallo,

                        ich habe meinen Sensor auch mit dem Skript von pix eingebunden. Vielen Dank!

                        Habe mir nun ebenfalls eine View erstellt und die Karte der Sensoren per iFrame eingebunden.

                        Kann man hier irgendwie die Zoomstufe mit vorgeben?

                        Gruß Alex

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

                          Hallo,

                          schön, dass es klappt. Die Zoomstufe wird im URL nach der Raute mitgegeben (min = 0; max = 13)

                          http://deutschland.maps.luftdaten.info/#13/50.8740/4.3853

                          Gruß

                          Pix

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

                            @pix:

                            Hallo,

                            schön, dass es klappt. Die Zoomstufe wird im URL nach der Raute mitgegeben (min = 0; max = 13)

                            http://deutschland.maps.luftdaten.info/#13/50.8740/4.3853

                            Gruß

                            Pix `

                            Hat wunderbar geklappt. Danke!

                            Gruß Alex

                            1 Reply Last reply Reply Quote 0
                            • L
                              Linedancer last edited by

                              Hallo,

                              danke für dieses hilfreiche Script.

                              Es funktioniert, holt die Daten, aber es bringt jedes mal die Javascript zum Stillstand. Hab ich leider erst gemerkt als einiges andere nicht wie erwartet funktioniert hatte.

                              Hab dem Luftdaten Script jetzt eine eigene Instanz spendiert sodas der Rest wenigstens unbeeinflusst läuft.

                              Hier mien Fehlerlog:

                              ! host.HTPC 2017-08-07 13:53:51.875 info Restart adapter system.adapter.javascript.1 because enabled
                              ! host.HTPC 2017-08-07 13:53:51.875 error instance system.adapter.javascript.1 terminated with code 6 (uncaught exception)
                              ! javascript.1 2017-08-07 13:53:15.125 info script.js.common.Luftdaten: Luftdaten aktualisiert
                              ! javascript.1 2017-08-07 13:53:15.125 info script.js.common.Luftdaten: registered 1 subscription and 1 schedule
                              ! javascript.1 2017-08-07 13:53:15.125 info Start javascript script.js.common.Luftdaten
                              ! javascript.1 2017-08-07 13:52:55.562 info received all objects
                              ! javascript.1 2017-08-07 13:52:52.609 info received all states
                              ! javascript.1 2017-08-07 13:52:43.812 info requesting all objects
                              ! javascript.1 2017-08-07 13:52:43.812 info requesting all states
                              ! javascript.1 2017-08-07 13:52:43.797 info starting. Version 3.3.11 in C:/iobroker/node_modules/iobroker.javascript, node: v4.4.7
                              ! host.HTPC 2017-08-07 13:52:39.952 info instance system.adapter.javascript.1 started with pid 5740
                              ! host.HTPC 2017-08-07 13:52:09.906 info Restart adapter system.adapter.javascript.1 because enabled
                              ! host.HTPC 2017-08-07 13:52:09.906 error instance system.adapter.javascript.1 terminated with code 0 (OK)
                              ! javascript.1 2017-08-07 13:52:09.718 error at emitNone (events.js:72:20)
                              ! javascript.1 2017-08-07 13:52:09.718 error at IncomingMessage.g (events.js:260:16)
                              ! javascript.1 2017-08-07 13:52:09.718 error at IncomingMessage. (C:\iobroker\node_modules\iobroker.javascript\node_modules\request\request.js:1091:12)
                              ! javascript.1 2017-08-07 13:52:09.718 error at Request.emit (events.js:169:7)
                              ! javascript.1 2017-08-07 13:52:09.718 error at emitOne (events.js:77:13)
                              ! javascript.1 2017-08-07 13:52:09.718 error at Request. (C:\iobroker\node_modules\iobroker.javascript\node_modules\request\request.js:1171:10)
                              ! javascript.1 2017-08-07 13:52:09.718 error at Request.emit (events.js:172:7)
                              ! javascript.1 2017-08-07 13:52:09.718 error at emitTwo (events.js:87:13)
                              ! javascript.1 2017-08-07 13:52:09.718 error at Request.self.callback (C:\iobroker\node_modules\iobroker.javascript\node_modules\request\request.js:188:22)
                              ! javascript.1 2017-08-07 13:52:09.718 error at Request._callback (script.js.common.Luftdaten:146:53)
                              ! javascript.1 2017-08-07 13:52:09.718 error TypeError: Cannot read property 'sensor' of undefined
                              ! javascript.1 2017-08-07 13:52:09.718 error uncaught exception: Cannot read property 'sensor' of undefined
                              ! javascript.1 2017-08-07 13:51:18.390 info script.js.common.Luftdaten: Luftdaten aktualisiert
                              ! javascript.1 2017-08-07 13:51:15.968 info script.js.common.Luftdaten: registered 1 subscription and 1 schedule
                              ! javascript.1 2017-08-07 13:51:15.890 info Start javascript script.js.common.Luftdaten
                              ! javascript.1 2017-08-07 13:51:13.890 info received all objects
                              ! javascript.1 2017-08-07 13:51:10.453 info received all states
                              ! javascript.1 2017-08-07 13:51:02.171 info requesting all objects
                              ! javascript.1 2017-08-07 13:51:02.156 info requesting all states
                              ! javascript.1 2017-08-07 13:51:02.140 info starting. Version 3.3.11 in C:/iobroker/node_modules/iobroker.javascript, node: v4.4.7
                              ! host.HTPC 2017-08-07 13:50:58.297 info instance system.adapter.javascript.1 started with pid 2968
                              ! host.HTPC 2017-08-07 13:50:28.280 info Restart adapter system.adapter.javascript.1 because enabled

                              gibt's hier Ideeen wie das zu beheben wäre?

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

                                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

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

                                  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

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

                                                        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]) {
                                    
                                    
                                    1 Reply Last reply Reply Quote 0
                                    • P
                                      pix last edited by

                                      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

                                      1 Reply Last reply Reply Quote 0
                                      • L
                                        Linedancer last edited by

                                        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

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

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

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

                                          Pix

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

                                            @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?

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            534
                                            Online

                                            31.6k
                                            Users

                                            79.4k
                                            Topics

                                            1.3m
                                            Posts

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