Navigation

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

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Gedanken zur Feinstaubmessung

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

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

      architectures=esp8266,avr,esp32
      

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

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

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

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

        Auch die rH logge ich mit

        Danke fürs Anschubsen

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

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

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

            @klassisch sagte in wrong type of...:

            Ist das das passende Skript zum Auslesen

            Ja!

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

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

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

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

                @klassisch
                Das ist mir noch nicht aufgefallen!

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

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

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

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

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

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

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

                    @klassisch

                    Habe gerade das log der Daten angesehen:

                    UBA_RoKi_log.png

                    Da kommen mit dem Skript regelmäßig Daten

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

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

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

                        @klassisch
                        Nur das wir vom gleichen reden.

                        Hier das Skript:

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

                        In Zeile 7 steht ein Link.

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

                        Deine Station suchen und den Stationsnamen in dem Array suchen.

                        Die dort befindliche Stationsnummer im Skript in Zeile 16 eintragen

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

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

                          Langsam glaube ich an nichts mehr:

                          Luftwerte.png

                          Da passt nichts zusammen 😉

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

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

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

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

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

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

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

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

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

                                @klassisch sagte in Gedanken zur Feinstaubmessung:

                                Wie hast Du die Seite Deines Landes geparst?

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

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

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

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

                                  @Homoran Oder mit https://www.lanuv.nrw.de/fileadmin/lanuv/luft/immissionen/aktluftqual/eu_luftqualitaet.csv alle aktuellen Werte als CSV bekommen. Ganz praktisch.

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

                                    @klassisch
                                    Ja, aber für den laufenden Betrieb wollte ich die Seite parsen.

                                    Inzwischen habe ich festgestellt, dass sich da die Classes "eins" und "zwei" wohl immer mal wechseln, hab es zwar im Griff, sehe mir die csv aber später auch noch an.

                                    Bundesweit oder für dich in BaWü habe ich noch nichts gefunden

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

                                      @Homoran Vielen Dank für Deine Bemühungen! Ich habe ja noch meine eigenen Meßwerte.
                                      Habe den Sketch jetzt mal so geändert, daß ich das gültig/ungültig Flag mit zum ioBroker schicke und auch wahlweise ungültige Werte zum ioBroker schicken kann. Mit FLOT kann man dann über "Füllen" des INVALID Flags die unültigen Daten schön deutlich machen. Hat auch was.
                                      ineParticles-Invalid.JPG
                                      Das gelbe Overlay markiert die Daten als ungültig.
                                      Wenn die Luftfeuchte mal wieder <70% wird, sollte das gelbe Overlay dann verschwinden.
                                      Dann sehen wir mal, was in der Sylvesternacht "gemessen" oder besser angezeigt wird...

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

                                        @klassisch
                                        Bei mir sieht es im Moment so aus:
                                        PM10_Luftdaten.png

                                        Die Grenzen jeweils markiert und die rH als Graph.
                                        Dann kann man die rH jedem aktuellen Messwert zuordnen und nicht den ganzen Graph als ungültig markieren

                                        Die blauen Linien sind die kumulierten Tagesmittelwerte (0:00 - 24:00, dann wieder von neuem)

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

                                          @Homoran Da erkennt man eben den Profi. Weil ich auf die ganz Schnelle keine Grenzlinien einziehen konnte, habe ich die Grenzwerte in die Legende geschrieben.
                                          Ok, Grenzlinien kann ich jetzt auch, habe es mal mit "Markierungen" gemacht.
                                          Die 70% Grenze gilt für das Chinesische Billigmeßgerät . Ich nehme an, daß die amtlichen Stationen eine validierte Trockung eingebaut haben und deshalb nicht an diese Grenzen gebunden sind. Das ist auch mein Hautptinteresse an den offiziellen Daten. Wie gesagt, die sind eigentlich viel zu weit weg und auch an Orten, die nicht zu meinem Wohnort vergleichbar sind.
                                          Apropos Feinstaub an Sylvester: Dazu gibt es eine Broschüre https://www.umweltbundesamt.de/sites/default/files/medien/479/publikationen/hgp_wenn_die_luft_zum_schneiden_ist_2019.pdf

                                          • 4200 Tonnen Feinstaub PM10 jährlich durch Feuerwerk
                                          • Entspricht 25% der Menge aus Holzfeuerungen
                                          • Entspricht 2% der deutschlandweit gesamten jährlichen Feinstaubmenge
                                            Hoffe, daß das Zitat jetzt noch gesetzeskonform ist
                                          Homoran 2 Replies Last reply Reply Quote 0
                                          • Homoran
                                            Homoran Global Moderator Administrators @klassisch last edited by

                                            @klassisch
                                            Na dann guten Rutsch!

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            354
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

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