Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] regex

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    [gelöst] regex

    This topic has been deleted. Only users with topic management privileges can see it.
    • Homoran
      Homoran Global Moderator Administrators @mike1976 last edited by Homoran

      @mike1976 sagte in regex:

      doch leider will der Adapter nicht.

      Dann brauchen wir den "echten" quellcode.
      mit dem geposteten kann ich das nicht nachvollziehen

      Beim Parser gibt es den ein oder anderen feinen Unterschied im Vergleich zu regex101

      Wahrscheinlich liegt es nur am Format.

      Ich habe mal den folgenden Wert (10.50) genommen:

      <!DOCTYPE html>
      <html lang="en">
        <head>
          <meta charset="utf-8" />
          <meta name="viewport" content="width=device-width, initial-scale=1.0" />
          <title>AQI</title>
          <script src="aqi.js"></script>
          <link rel='stylesheet' href='style.css'>
        </head>
        <body>
          <div class="container">
            <h1>AQI</h1>
            <p class='time' id="time"></p>
            <div class='aqi-container' id="containerPm25">
                <div class='aqi-label'>AQI (PM2.5)</div>
                <div class='aqi' id="aqiPm25"></div>
                <div class='pm-label' id="pm25"></div>
            </div>
            <div class='aqi-container' id="containerPm10">
                <div class='aqi-label'>AQI (PM10)</div>
                <div class='aqi' id="aqiPm10">10.50</div>
                <div class='pm-label' id="pm10"></div>
            </div>
          </div>
        </body>
        <script type="text/javascript">
          getData();
          setInterval(getData, 60000);
        </script>
      </html>
      

      Und mit dem regex <[^>]*id="aqiPm10">(\d+\.\d+)<\/div> ausgelesen

      Auch die genauen Einstellungen im Adapter wären interessant

      1 Reply Last reply Reply Quote 0
      • M
        mike1976 last edited by mike1976

        @Homoran

        testpi.dyndns-at-home.com:56000

        habe ich mal freigeschalten. kannst direkt auf die webseite

        Quellcode:
        aqi.py

        einstellungen von adapter habe ich oben einen screen gemacht. gibt ja nicht viele punkte

        crycode 1 Reply Last reply Reply Quote 0
        • M
          mike1976 last edited by

          und das ist die export file des adapters:

          system.adapter.parser.0.json

          1 Reply Last reply Reply Quote 0
          • crycode
            crycode Developer @mike1976 last edited by

            @mike1976
            Das Problem an der Stelle ist, dass der eigentliche Wert gar nichtdirekt im HTML Code steht, sondern per JavaScript aus der Datei api.json geladen wird. Versuch mal als URL http://192.168.1.241/api.json und als RegEx den: {"pm10":\s+(\d+(\.\d+)?)[^}]*}]
            Das sollte dann jeweils den letzten (aktuellsten) Wert auslesen, egal ob es nun z.B. 9 oder 9.5 ist.

            Beispiel: https://regex101.com/r/a41Fp3/3

            Alternativ könnte man sicherlich auch über den JavaScript Adapter direkt die JSON-Datei laden und daraus dann den gewünschten Wert extrahieren.

            M 1 Reply Last reply Reply Quote 1
            • M
              mike1976 @crycode last edited by

              @crycode said in regex:

              http://192.168.1.241/api.json

              Leider nein der aufruf geht auch nicht 😞
              parsen7.JPG

              wenn ich im den link so teste bzw. öffne bekomme ich nur 404 not found
              okay muss einsehen das es für mich leider nicht möglich sein wird den wert in iobroker zu bekommen.
              Danke an euch allen für euer rasches bemühen.

              lg mike

              crycode 1 Reply Last reply Reply Quote 0
              • crycode
                crycode Developer @mike1976 last edited by

                @mike1976 ups, mein Fehler... das sollte aqi.json heißen. Dann müsste er die Datei auch finden 😉

                M 1 Reply Last reply Reply Quote 1
                • M
                  mike1976 @crycode last edited by

                  @crycode

                  okay damit liest der adapter jetzt die seite ein, aber er will mir einfach keinen wert geben.
                  Hast recht auf https://regex101.com/r/a41Fp3/3 geht es einwandfrei.
                  Habe jetzt alle varianten gesteset im adapter:
                  boolean
                  number(.)
                  number(,)
                  string
                  JSON

                  eigentlich müsste der type ja nummer(.) sein, aber nicht um die bohne das er mir einen wert gibt

                  parsen8.JPG

                  1 Reply Last reply Reply Quote 0
                  • M
                    mike1976 last edited by

                    update bekomme jetzt einen wert 🙂
                    habe bei den einstellungen noch Num 4 drinnen stehen
                    geändert auf 0 und siehe da es kommt was rein.

                    ich weis das kling jetzt sicherlich frech aber wie könnte ich jetzt immer die letzten werte von
                    pm25 und seperat pm10 haben.

                    im moment ist es ja immer der von pm10.

                    Man Tausend dank erstmal 🙂

                    1 Reply Last reply Reply Quote 0
                    • M
                      mike1976 last edited by

                      Denke habe es hinbekommen
                      geändert auf

                      "pm25":\s+(\d+(\.\d+)?)[^}]*}]
                      
                      1 Reply Last reply Reply Quote 0
                      • M
                        mike1976 last edited by mike1976

                        Danke das auslesen der "µg/m³" geht nun einwandfrei.

                        Ist es eigentlich möglich den "AQI (PM2.5)" und den "AQI (PM15)" auch auszulesen?
                        in http://192.168.1.241/aqi.json wird der ja nicht augelistet.

                        parsen3.JPG

                        Das sind die Webseiten auf den das script aufbaut:
                        $ wget -O /var/www/html/index.html https://raw.githubusercontent.com/zefanja/aqi/master/html/index.html
                        $ wget -O /var/www/html/aqi.js https://raw.githubusercontent.com/zefanja/aqi/master/html/aqi.js
                        $ wget -O /var/www/html/style.css https://raw.githubusercontent.com/zefanja/aqi/master/html/style.css

                        crycode 1 Reply Last reply Reply Quote 0
                        • crycode
                          crycode Developer @mike1976 last edited by crycode

                          @mike1976 Das sieht doch schon mal gut aus 🙂

                          Ist es eigentlich möglich den "AQI (PM2.5)" und den "AQI (PM15)" auch auszulesen?

                          Direkt auslesen kannst du die beiden Werte nicht, da die ja nicht so in den Daten enthalten sind.
                          Du kannst die Berechnung aber in ioBroker über ein Script nachbilden und die Ergebnisse dann eigene Datenpunkte schreiben.

                          Dann wäre aber wieder der oben schon mal erwähnte Weg direkt die JSON-Datei zu laden die schönere und zuverlässigere Variante.
                          Das Script dazu sieht dann so aussehen:

                          // URL von der die JSON-Daten geladen werden
                          const url = 'http://192.168.1.241/aqi.json';
                          
                          // Datenpunkte (javascript.0.XX)
                          const objPm10 = 'aqi.pm10';
                          const objPm25 = 'aqi.pm25';
                          const objAqiPm10 = 'aqi.aqiPm10';
                          const objAqiPm25 = 'aqi.aqiPm25';
                          
                          // Objekete anlegen, falls nicht vorhanden
                          createState(objPm10, { name: 'PM10', unit: 'µg/m³', type: 'number', role: 'value' });
                          createState(objPm25, { name: 'PM2.5', unit: 'µg/m³', type: 'number', role: 'value' });
                          createState(objAqiPm10, { name: 'AQI (PM10)', type: 'number', role: 'value' });
                          createState(objAqiPm25, { name: 'AQI (PM2.5)', type: 'number', role: 'value' });
                          
                          // alle 5 Sekunden die Daten laden
                          schedule('*/5 * * * * *', loadData);
                          
                          /**
                           * Funktion zum Laden der Daten.
                           */
                          function loadData () {  
                            request(url, (err, res, body) => {
                              if (err) {
                                log(err.toString(), 'error');
                                return;
                              }
                              const data = JSON.parse(body);
                              
                              const pm10 = data[data.length -1].pm10;
                              const pm25 = data[data.length -1].pm25;
                              const aqiPm10 = calcAQIpm10(pm10);
                              const aqiPm25 = calcAQIpm25(pm25);
                          
                              // Log-Ausgabe zum Testen
                              // log(`pm10: ${pm10}, pm25: ${pm25}, aqiPm10: ${aqiPm10}, aqiPm25: ${aqiPm25}`);
                          
                              setState(objPm10, pm10, true);
                              setState(objPm25, pm25, true);
                              setState(objAqiPm10, aqiPm10, true);
                              setState(objAqiPm25, aqiPm25, true);
                            });
                          }
                          
                          /**
                           * Berechnung von AQI PM 2.5.
                           * Quelle: https://github.com/zefanja/aqi/blob/master/html/aqi.js#L55
                           */
                          function calcAQIpm25(pm25) {
                            let pm1 = 0;
                            let pm2 = 12;
                            let pm3 = 35.4;
                            let pm4 = 55.4;
                            let pm5 = 150.4;
                            let pm6 = 250.4;
                            let pm7 = 350.4;
                            let pm8 = 500.4;
                          
                            let aqi1 = 0;
                            let aqi2 = 50;
                            let aqi3 = 100;
                            let aqi4 = 150;
                            let aqi5 = 200;
                            let aqi6 = 300;
                            let aqi7 = 400;
                            let aqi8 = 500;
                          
                            let aqipm25 = 0;
                          
                            if (pm25 >= pm1 && pm25 <= pm2) {
                              aqipm25 = ((aqi2 - aqi1) / (pm2 - pm1)) * (pm25 - pm1) + aqi1;
                            } else if (pm25 >= pm2 && pm25 <= pm3) {
                              aqipm25 = ((aqi3 - aqi2) / (pm3 - pm2)) * (pm25 - pm2) + aqi2;
                            } else if (pm25 >= pm3 && pm25 <= pm4) {
                              aqipm25 = ((aqi4 - aqi3) / (pm4 - pm3)) * (pm25 - pm3) + aqi3;
                            } else if (pm25 >= pm4 && pm25 <= pm5) {
                              aqipm25 = ((aqi5 - aqi4) / (pm5 - pm4)) * (pm25 - pm4) + aqi4;
                            } else if (pm25 >= pm5 && pm25 <= pm6) {
                              aqipm25 = ((aqi6 - aqi5) / (pm6 - pm5)) * (pm25 - pm5) + aqi5;
                            } else if (pm25 >= pm6 && pm25 <= pm7) {
                              aqipm25 = ((aqi7 - aqi6) / (pm7 - pm6)) * (pm25 - pm6) + aqi6;
                            } else if (pm25 >= pm7 && pm25 <= pm8) {
                              aqipm25 = ((aqi8 - aqi7) / (pm8 - pm7)) * (pm25 - pm7) + aqi7;
                            }
                            return Math.round(aqipm25);
                          }
                          
                          /**
                           * Berechnung von AQI PM 10.
                           * Quelle: https://github.com/zefanja/aqi/blob/master/html/aqi.js#L94
                           */
                          function calcAQIpm10(pm10) {
                            let pm1 = 0;
                            let pm2 = 54;
                            let pm3 = 154;
                            let pm4 = 254;
                            let pm5 = 354;
                            let pm6 = 424;
                            let pm7 = 504;
                            let pm8 = 604;
                          
                            let aqi1 = 0;
                            let aqi2 = 50;
                            let aqi3 = 100;
                            let aqi4 = 150;
                            let aqi5 = 200;
                            let aqi6 = 300;
                            let aqi7 = 400;
                            let aqi8 = 500;
                          
                            let aqipm10 = 0;
                          
                            if (pm10 >= pm1 && pm10 <= pm2) {
                              aqipm10 = ((aqi2 - aqi1) / (pm2 - pm1)) * (pm10 - pm1) + aqi1;
                            } else if (pm10 >= pm2 && pm10 <= pm3) {
                              aqipm10 = ((aqi3 - aqi2) / (pm3 - pm2)) * (pm10 - pm2) + aqi2;
                            } else if (pm10 >= pm3 && pm10 <= pm4) {
                              aqipm10 = ((aqi4 - aqi3) / (pm4 - pm3)) * (pm10 - pm3) + aqi3;
                            } else if (pm10 >= pm4 && pm10 <= pm5) {
                              aqipm10 = ((aqi5 - aqi4) / (pm5 - pm4)) * (pm10 - pm4) + aqi4;
                            } else if (pm10 >= pm5 && pm10 <= pm6) {
                              aqipm10 = ((aqi6 - aqi5) / (pm6 - pm5)) * (pm10 - pm5) + aqi5;
                            } else if (pm10 >= pm6 && pm10 <= pm7) {
                              aqipm10 = ((aqi7 - aqi6) / (pm7 - pm6)) * (pm10 - pm6) + aqi6;
                            } else if (pm10 >= pm7 && pm10 <= pm8) {
                              aqipm10 = ((aqi8 - aqi7) / (pm8 - pm7)) * (pm10 - pm7) + aqi7;
                            }
                            return Math.round(aqipm10);
                          }
                          

                          Die beiden Funktionen calcAQIpm25 und calcAQIpm10 sind direkt aus der aqi.js übernommen. Ich habe dabei lediglich den Rückgabewert angepasst, sodass immer eine Zahl ohne Nachkommastellen zurückgegeben wird.

                          Die Daten sind dann unter javascript.0.aqi.* verfügbar. 🙂

                          M 1 Reply Last reply Reply Quote 1
                          • M
                            mike1976 @crycode last edited by

                            @crycode

                            Ähhh... Was soll ich sagen ausser 1000 mal Danke.
                            Das funktioniert einwandfrei 😄 😄
                            Hatte die hoffnung schon aufgegeben.
                            Kommer leider aus der SPS welt und script mässig ein kompleter noob.

                            Danke nochmal hast mir einen riesen schritt weitergeholfen, jetzt muss ich nur noch eine vernünftige Wochenzeitschaltuhr für die Vis finden.

                            GLG Mike

                            PS: Danke für deine Zeit und Hilfe

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

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            817
                            Online

                            31.8k
                            Users

                            80.0k
                            Topics

                            1.3m
                            Posts

                            communication
                            4
                            19
                            1034
                            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