Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

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

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.3k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.0k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.4k

Skript Pollenflug

Geplant Angeheftet Gesperrt Verschoben JavaScript
12 Beiträge 5 Kommentatoren 1.1k Aufrufe 6 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • 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
    schrieb am zuletzt editiert von
    #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 Antworten Letzte Antwort
    0
    • sigi234S sigi234

      @ro75

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

      Ro75R Online
      Ro75R Online
      Ro75
      schrieb am zuletzt editiert von
      #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 Antwort Letzte Antwort
      1
      • sigi234S sigi234

        @ro75

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

        Ro75R Online
        Ro75R Online
        Ro75
        schrieb am zuletzt editiert von
        #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 Antwort Letzte Antwort
        1
        • HomoranH Nicht stören
          HomoranH Nicht stören
          Homoran
          Global Moderator Administrators
          schrieb am zuletzt editiert von
          #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 Antwort Letzte Antwort
          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 Online
            Ro75R Online
            Ro75
            schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
            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
              Ein ehemaliger Benutzer
              schrieb am zuletzt editiert von
              #7

              @ro75

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

              Ro75R HomoranH 2 Antworten Letzte Antwort
              0
              • ? Ein ehemaliger Benutzer

                @ro75

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

                Ro75R Online
                Ro75R Online
                Ro75
                schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
                0
                • ? Ein ehemaliger Benutzer

                  @ro75

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

                  HomoranH Nicht stören
                  HomoranH Nicht stören
                  Homoran
                  Global Moderator Administrators
                  schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
                  0
                  • NashraN Offline
                    NashraN Offline
                    Nashra
                    Most Active Forum Testing
                    schrieb am zuletzt editiert von
                    #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 Antwort Letzte Antwort
                    0
                    • NashraN Nashra

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

                      Ro75R Online
                      Ro75R Online
                      Ro75
                      schrieb am zuletzt editiert von
                      #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 Antwort Letzte Antwort
                      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
                        schrieb am zuletzt editiert von
                        #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 Antwort Letzte Antwort
                        0
                        Antworten
                        • In einem neuen Thema antworten
                        Anmelden zum Antworten
                        • Älteste zuerst
                        • Neuste zuerst
                        • Meiste Stimmen


                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        402

                        Online

                        32.4k

                        Benutzer

                        81.4k

                        Themen

                        1.3m

                        Beiträge
                        Community
                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                        ioBroker Community 2014-2025
                        logo
                        • Anmelden

                        • Du hast noch kein Konto? Registrieren

                        • Anmelden oder registrieren, um zu suchen
                        • Erster Beitrag
                          Letzter Beitrag
                        0
                        • Home
                        • Aktuell
                        • Tags
                        • Ungelesen 0
                        • Kategorien
                        • Unreplied
                        • Beliebt
                        • GitHub
                        • Docu
                        • Hilfe