Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Skript Pollenflug

    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

    Skript Pollenflug

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

      Hallo. Heute stelle ich euch einmal mein Skript "Pollenflug" vor. Dieses Skript liest Daten einer Website (in diesem Falle www.wetter.com) aus. Es ermittelt wie auch andere Skripts (z.B. Wetter, Luftdaten, Biowetter, usw.) Daten und schreibt diese zur Weiterverarbeitung in einzelne Datenpunkte.

      Als Allergiker ist es schon interessant, was gerade alles so in der Luft liegt und die Nase zum Laufen bringt. Damit lassen sich einfache, individuelle Visualisierungen erstellen. Dies ist vielleicht ein weiteres Skript für Nutzer vom ioBroker.

      //Version 1.0.0
      //20.09.2024
      //Ersteller Ro75.
      
      //Voraussetzungen (Version 1.0.0 getestet mit)
      //NodeJS: 20.x
      //Javascript-Adapter: 8.7.6
      //Admin-Adapter: 7.0.23
      //JS-Controller: 6.0.11
      
      
      //Anleitung um meinen Ort zu finden
      //1. Adresse suchen über: https://www.wetter.com/gesundheit/pollenflug/ - Hinweis: Funktioniert mit Orten aus DE, AT, CH
      //2. Im Suchfeld über Ort oder PLZ deinen Ort suchen
      //3. Adresse im Browser kopieren und die Konstante sURL anpassen - sollte etwa so aussehen: https://www.wetter.com/gesundheit/pollenflug/deutschland/XXXORTXXX/DExxxx999.html
      
      const sMainPath = '0_userdata.0.PollenIndex.';
      //Liste mit Pollen die abgefragt werden können - ggfs.anpassen
      const aPollen   = 'Ahorn,Ambrosia,Ampfer,Beifuss,Birke,Brennnessel,Buche,Eibe,Eiche,Erle,Esche,Fichte,Gräser,Gänsefuß,Hainbuche,Hasel,Heidekraut,Holunder,Hopfen,Kastanie,Kiefer,Kieferngewächse,Korbblütler,Kreuzblütler,Labkräuter,Linde,Lärche,Pappel,Platane,Roggen,Rosskastanie,Sauergräser,Schimmel,Springkraut,Steineiche,Tanne,Ulme,Walnuss,Wegerich,Weide'
      //Pollenflug Intensitätsstufen:
      //0: Keine, 1: Gering, 2: Erhöht, 3: Hoch, -1: kein Abruf (Fehler, keine Daten gefunden, ...)
      const iPollen   = 'Keine,Gering,Erhöht,Hoch'
      //URL für Datenabruf
      const sURL      = 'https://www.wetter.com/gesundheit/pollenflug/deutschland/bautzen/DE0000849.html'; // Ermittlung Schritt 1 - 3
      
      //Anlage der Datenpunkte
      function Initalisierung(){
          let sPollen = aPollen.split(',');
          for (let i = 0; i <= sPollen.length-1; i++) {
              createState(sMainPath+sPollen[i], 0, {name: sPollen[i],type: 'number', read: true, write: true});
          }
          createState(sMainPath+'data_json', '', {name: 'JSON',type: 'string', def: '[]', read: true, write: true, desc: 'JSON Widget'});
          //erster Datenabruf
          LadenPollen();
      }
      //START
      Initalisierung();
      
      //automatisierte Datenabfrage - kann angepasst werden: aller 4 - 6 Stunden sollte ausreichen
      schedule('23 4,10,16 * * *', LadenPollen);
      
      function LadenPollen() {
          httpGet(sURL, { timeout: 6000}, (error, response) => {
              if (!error  && response.statusCode == 200) {
                  let info = response.data;
                  let sPollen = aPollen.split(',');
                  for (let i = 0; i <= sPollen.length-1; i++) {
                      PollenIndex(info,sPollen[i]);
                  }
                  setTimeout(function(){
                      CreateJSON();
                  },1000);
              } else {
                  console.error('Pollenflug: ' + response.statusCode);
              }    
          });
      }
      
      function CreateJSON() {
          let JSON_List   = [];
          let sPollen = aPollen.split(',');
          for (let i = 0; i <= sPollen.length-1; i++) {
              var lValue = getState(sMainPath+sPollen[i]).val;
              if (lValue >= 0) {
                  JSON_List.push({"pollen": sPollen[i], "index": lValue, "stufe": iPollen.split(',')[lValue]});
              }
          }
          setState(sMainPath+'data_json', JSON.stringify(JSON_List), true);
          JSON_List = [];
      }
      
      function PollenIndex(sData, sValue=''){
          var wert = -1;
          var Position = sData.indexOf('>'+sValue+'</td>');
          if (Position > 0) {
              var dummy = sData.substr(Position, 300);
              var Position2 = dummy.indexOf("pollen-index-");
              if (Position2 > 0) {
                  wert = parseInt(dummy.substr(Position2+13, 1));
              }
          }
          setState(sMainPath+sValue,wert,true);
      }
      

      Im Grunde sollte alles selbsterklärend sein. Die hinzugefügten Kommentare geben Info und Einstellmöglichkeiten. Für Anregungen bin ich offen, auch wenn es ggfs. nicht gleich umgesetzt werden kann (die gute Zeit).

      f6ef07b2-372d-4adb-bb1d-c13ddfcefa33-image.png
      Ich wünsche euch viel Spaß.

      Ro75.

      sigi234 1 Reply Last reply Reply Quote 3
      • sigi234
        sigi234 Forum Testing Most Active @Ro75 last edited by

        @ro75

        Super, eine Ausgabe als json-table wäre noch toll.

        Ro75 2 Replies Last reply Reply Quote 0
        • Ro75
          Ro75 @sigi234 last edited by

          @sigi234 das sollte kein Problem sein.

          Ro75.

          1 Reply Last reply Reply Quote 1
          • Ro75
            Ro75 @sigi234 last edited by

            @sigi234 Ich habe das Skript im ersten Post aktualisiert. Jetzt mit JSON.

            Ro75.

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

              @Ro75

              zur Info:
              Es gab vor 10 Jahren mal ein Skript von @pix .
              Da wurden die Pollenflugdaten auch von wetterdotcom geholt.

              Irgendwann wurde das geblockt.

              Ro75 1 Reply Last reply Reply Quote 0
              • Ro75
                Ro75 @Homoran last edited by Ro75

                @homoran das kenn ich nicht. Das läuft bei mir nun über 1 Jahr. Vielleicht wurde in dem anderen Skript zu oft nach Daten "gegraben". Ich hole nur 3x am Tag Daten ab - das reicht völlig. Ich lasse mich überraschen.

                EDIT: Alternativ könnte man ja einen wechselnden USER-Agenten implementieren.

                Ro75.

                Neuschwansteini 1 Reply Last reply Reply Quote 0
                • Neuschwansteini
                  Neuschwansteini @Ro75 last edited by

                  @ro75

                  es gibt auch einen Adapter... der holt nicht alle Pollen..

                  Ro75 Homoran 2 Replies Last reply Reply Quote 0
                  • Ro75
                    Ro75 @Neuschwansteini last edited by Ro75

                    @ilovegym sagte in Skript Pollenflug:

                    der holt nicht alle Pollen

                    genau. Das Skript kann alle abholen. Oder man ändert einfach "const aPollen" an, in dem man nur die Pollen in dem Array hat, die man braucht.

                    z.B.

                    const aPollen   = 'Ambrosia,Birke,Brennnessel,Buche,Gräser,Hasel,Holunder,Kiefer,Kieferngewächse,Platane,Roggen,Schimmel,Tanne,Ulme,Walnuss,Wegerich,Weide'
                    

                    Ro75.

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

                      @ilovegym sagte in Skript Pollenflug:

                      der holt nicht alle Pollen..

                      weil der die offenen Daten des DWD nutzt und es dort nicht mehr Pollenarten gibt

                      @Ro75 zur Info

                      /* Pollenflug Parser von wetteronline.de
                      
                      http://forum.iobroker.net/viewtopic.php?f=23&t=2799&sid=936235bdac98a70a1d8672897d334a07#p25266
                      
                      05.05.2016 erstellt von steinwedel für homoran
                      06.05.2016 Anpassung durch pix
                      */
                      
                      var url = "https://www.wetteronline.de/pollen/koeln";
                      var pfad = "WetterOnline.pollenvorhersage.";
                      var logging = false;
                      
                      // ab hier nix ändern
                      var Pollenarten = ['Hasel','Pappel','Weide','Ulme','Birke','Buche','Ampfer','Roggen','Graeser','Eiche','Wegerich','Beifuss','Ambrosia', 'Erle'];
                      var tage_vorhersage = ['heute','morgen','uebermorgen'];
                      var request = require('request');
                      
                      function dpAnlegen(y) {
                         for(var i=0;i<Pollenarten.length;i++) {
                             createState(pfad + tage_vorhersage[y] + '.' + Pollenarten[i].toLowerCase(),0, {
                                 name: 'WetterOnline Pollenvorhersage ' + tage_vorhersage[y] + ' ' + Pollenarten[i],
                                 desc: 'Vorhersage für Pollenbelastung für ' + tage_vorhersage[y] + ' durch ' + Pollenarten[i],
                                 type: 'number'
                             });
                         }
                      }
                      
                      function readPollenwetter(x) {
                         var options = {
                             url: ((x>0) ? url + '?fcdatstr=' + tag(x) : url), // korrekten Link erstellen
                             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
                                     body=body.replaceAll(String.fromCharCode(13),"");
                                     body=body.replaceAll(String.fromCharCode(10),"");
                                     body=body.replaceAll(String.fromCharCode(9)," ");
                                     body=strip_tags(body);
                                     for(var i=0;i<Pollenarten.length;i++) {
                                         setState(pfad + tage_vorhersage[x] + '.' + Pollenarten[i].toLowerCase(),{val: GetPollenIndex(Pollenarten[i],body), ack: true});
                                         if (logging) log(Pollenarten[i].toLowerCase() + ' ' + GetPollenIndex(Pollenarten[i],body));
                                     }
                                 } else {
                                     log("StatusCode="+response.statusCode);
                                     log(error,'error');                               // Error beim Einlesen
                                 }
                             });
                         } catch (e) {
                             log('Fehler (try) leseWebseite: ' + e, 'error');
                         }
                      }
                      
                      function strip_tags(data) {
                         var rueckgabe = data.replace(/(&nbsp;|<([^>]+)>)/ig, " ");
                         return(rueckgabe);
                      }
                      
                      function GetPollenIndex(pflanze, html) {
                         var code={'kein':0, 'schwach':1, 'mäßig':2, 'stark':3}; 
                         var result="";
                         var start=html.indexOf(pflanze)+pflanze.length;
                         result=html.slice(start);
                         result=result.trim();
                         var stop=result.indexOf(' ');
                         result=result.slice(0,stop);
                         return code[result];
                      }
                      
                      String.prototype.replaceAll = function(find, replace) {
                         var str = this;
                         return str.replace(new RegExp(find.replace(/([.*+?^=!:${}()|[]\/\])/g, "\\$1"), 'g'), replace);
                      };
                      
                      function tag (abstand) { // Eingabe 0, 1, 2, ...
                         var jetzt = new Date();
                         jetzt.setHours(0);
                         jetzt.setMinutes(0);
                         jetzt.setSeconds(0);
                         jetzt.setMilliseconds(0);
                         var newdate = new Date();
                         newdate.setTime(jetzt.getTime() + (24 * 60 * 60 * 1000 * abstand) ); // heute + anzahl tage ins Millisekunden
                         var date = newdate.getDate();
                         var month = newdate.getMonth()+1;
                         var year = newdate.getFullYear();
                         date = (date < 10) ? '0' + date : date;
                         month = (month < 10) ? '0' + month : month;
                         var rueckgabe = year.toString()+month.toString()+date.toString();
                         if (logging) log('Datum in Link: ' + rueckgabe);
                         return (rueckgabe); // Ausgabe z.B. 20160506
                      }
                      
                      // alle Tage aus dem Array durchgehen (x)
                      function main() {
                         for (var x = 0; x < tage_vorhersage.length; x++) {
                             dpAnlegen(x);
                             readPollenwetter(x);
                         }
                      }
                      
                      main();
                      schedule("*/5 * * * *", main);
                      

                      sehe gerade, das war wetteronline!
                      Sorry!

                      1 Reply Last reply Reply Quote 0
                      • Nashra
                        Nashra Most Active Forum Testing last edited by

                        Hallo @Ro75
                        welche Widgets hast Du für die Darstellung genutzt?

                        Ro75 1 Reply Last reply Reply Quote 0
                        • Ro75
                          Ro75 @Nashra last edited by

                          @nashra in dem Fall habe ich Grafana benutzt. Man kann ja einzelne DP historisieren und dann mit Flot, ECharts oder Material Design anzeigen lassen. Alternativ gibt es noch ein JSON für ein JSON-Widget.

                          Ro75

                          Nashra 1 Reply Last reply Reply Quote 0
                          • Nashra
                            Nashra Most Active Forum Testing @Ro75 last edited by

                            @ro75 sagte in Skript Pollenflug:

                            @nashra in dem Fall habe ich Grafana benutzt. Man kann ja einzelne DP historisieren und dann mit Flot, ECharts oder Material Design anzeigen lassen. Alternativ gibt es noch ein JSON für ein JSON-Widget.

                            Ro75

                            Ah, alles klar. Sah so aus als wenn das Widgets sind aber Grafana habe ich ja auch und versuchs mal damit, danke.

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

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            553
                            Online

                            31.8k
                            Users

                            80.0k
                            Topics

                            1.3m
                            Posts

                            5
                            12
                            696
                            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