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

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Skript Pollenflug

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.7k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    882

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.1k

Skript Pollenflug

Scheduled Pinned Locked Moved JavaScript
12 Posts 5 Posters 1.3k Views 6 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • Ro75R 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.

    sigi234S Online
    sigi234S Online
    sigi234
    Forum Testing Most Active
    wrote on last edited by
    #2

    @ro75

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

    Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
    Immer Daten sichern!

    Ro75R 2 Replies Last reply
    0
    • sigi234S sigi234

      @ro75

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

      Ro75R Offline
      Ro75R Offline
      Ro75
      wrote on last edited by
      #3

      @sigi234 das sollte kein Problem sein.

      Ro75.

      SERVER = Beelink U59 16GB DDR4 RAM 512GB SSD, FB 7490, FritzDect 200+301+440, ConBee II, Zigbee Aqara Sensoren + NOUS A1Z, NOUS A1T, Philips Hue ** ioBroker, REDIS, influxdb2, Grafana, PiHole, Plex-Mediaserver, paperless-ngx (Docker), MariaDB + phpmyadmin *** VIS-Runtime = Intel NUC 8GB RAM 128GB SSD + 24" Touchscreen

      1 Reply Last reply
      1
      • sigi234S sigi234

        @ro75

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

        Ro75R Offline
        Ro75R Offline
        Ro75
        wrote on last edited by
        #4

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

        Ro75.

        SERVER = Beelink U59 16GB DDR4 RAM 512GB SSD, FB 7490, FritzDect 200+301+440, ConBee II, Zigbee Aqara Sensoren + NOUS A1Z, NOUS A1T, Philips Hue ** ioBroker, REDIS, influxdb2, Grafana, PiHole, Plex-Mediaserver, paperless-ngx (Docker), MariaDB + phpmyadmin *** VIS-Runtime = Intel NUC 8GB RAM 128GB SSD + 24" Touchscreen

        1 Reply Last reply
        1
        • HomoranH Do not disturb
          HomoranH Do not disturb
          Homoran
          Global Moderator Administrators
          wrote on last edited by
          #5

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

          kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

          Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

          der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

          Ro75R 1 Reply Last reply
          0
          • HomoranH Homoran

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

            Ro75R Offline
            Ro75R Offline
            Ro75
            wrote on last edited by Ro75
            #6

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

            SERVER = Beelink U59 16GB DDR4 RAM 512GB SSD, FB 7490, FritzDect 200+301+440, ConBee II, Zigbee Aqara Sensoren + NOUS A1Z, NOUS A1T, Philips Hue ** ioBroker, REDIS, influxdb2, Grafana, PiHole, Plex-Mediaserver, paperless-ngx (Docker), MariaDB + phpmyadmin *** VIS-Runtime = Intel NUC 8GB RAM 128GB SSD + 24" Touchscreen

            ? 1 Reply Last reply
            0
            • Ro75R 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.

              ? Offline
              ? Offline
              A Former User
              wrote on last edited by
              #7

              @ro75

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

              Ro75R HomoranH 2 Replies Last reply
              0
              • ? A Former User

                @ro75

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

                Ro75R Offline
                Ro75R Offline
                Ro75
                wrote on last edited by Ro75
                #8

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

                SERVER = Beelink U59 16GB DDR4 RAM 512GB SSD, FB 7490, FritzDect 200+301+440, ConBee II, Zigbee Aqara Sensoren + NOUS A1Z, NOUS A1T, Philips Hue ** ioBroker, REDIS, influxdb2, Grafana, PiHole, Plex-Mediaserver, paperless-ngx (Docker), MariaDB + phpmyadmin *** VIS-Runtime = Intel NUC 8GB RAM 128GB SSD + 24" Touchscreen

                1 Reply Last reply
                0
                • ? A Former User

                  @ro75

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

                  HomoranH Do not disturb
                  HomoranH Do not disturb
                  Homoran
                  Global Moderator Administrators
                  wrote on last edited by Homoran
                  #9

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

                  kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                  Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                  der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                  1 Reply Last reply
                  0
                  • NashraN Offline
                    NashraN Offline
                    Nashra
                    Most Active Forum Testing
                    wrote on last edited by
                    #10

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

                    Gruß Ralf
                    Mir egal, wer Dein Vater ist! Wenn ich hier angel, wird nicht übers Wasser gelaufen!!

                    Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                    Ro75R 1 Reply Last reply
                    0
                    • NashraN Nashra

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

                      Ro75R Offline
                      Ro75R Offline
                      Ro75
                      wrote on last edited by
                      #11

                      @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

                      SERVER = Beelink U59 16GB DDR4 RAM 512GB SSD, FB 7490, FritzDect 200+301+440, ConBee II, Zigbee Aqara Sensoren + NOUS A1Z, NOUS A1T, Philips Hue ** ioBroker, REDIS, influxdb2, Grafana, PiHole, Plex-Mediaserver, paperless-ngx (Docker), MariaDB + phpmyadmin *** VIS-Runtime = Intel NUC 8GB RAM 128GB SSD + 24" Touchscreen

                      NashraN 1 Reply Last reply
                      0
                      • Ro75R Ro75

                        @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

                        NashraN Offline
                        NashraN Offline
                        Nashra
                        Most Active Forum Testing
                        wrote on last edited by
                        #12

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

                        Gruß Ralf
                        Mir egal, wer Dein Vater ist! Wenn ich hier angel, wird nicht übers Wasser gelaufen!!

                        Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                        1 Reply Last reply
                        0
                        Reply
                        • Reply as topic
                        Log in to reply
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes


                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        570

                        Online

                        32.6k

                        Users

                        82.1k

                        Topics

                        1.3m

                        Posts
                        Community
                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                        ioBroker Community 2014-2025
                        logo
                        • Login

                        • Don't have an account? Register

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Home
                        • Recent
                        • Tags
                        • Unread 0
                        • Categories
                        • Unreplied
                        • Popular
                        • GitHub
                        • Docu
                        • Hilfe