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

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

NEWS

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

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

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

Skript Luftdaten

Geplant Angeheftet Gesperrt Verschoben JavaScript
13 Beiträge 7 Kommentatoren 1.4k Aufrufe 5 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 Online
    Ro75R Online
    Ro75
    schrieb am zuletzt editiert von Ro75
    #1

    Hallo. Heute stelle ich euch einmal mein Skript "Luftdaten" vor. Dieses Skript liest Daten einer Websiteaus. Es ermittelt wie auch andere Skripts (z.B. Wetter, Biowetter, AlleStörungen, usw.) Daten und schreibt diese zur Weiterverarbeitung in einzelne Datenpunkte.

    Ausgelesen werden Daten für Ozon, NO2, PM10 und PM25. Damit lassen sich einfache, individuelle Visualisierungen erstellen. Dies ist vielleicht ein weiteres Skript für Nutzer vom ioBroker.

    VORARBEITEN für SKRIPT - Anleitung um meinen Ort und damit die URL zu finden

    1. Adresse https://www.accuweather.com/ öffnen und im Suchfeld dein Ort eingeben und auswählen - Hinweis: Funktioniert mit Orten aus DE, AT, CH
      2d7aaaf9-e7ec-412d-aadf-6d492926ff1c-image.png

    2. Auf der neuen Seite, unterhalb des Suchfeldes auf den Link "LUFTQUALITÄT" klicken
      5284ee36-d54b-4b21-aa31-718b89226b41-image.png

    3. In der ersten Karte (LUFTQUALITÄT HEUTE) unten rechts auf den Link "plume labs" klicken
      65a95d62-4dc4-4dd5-a510-ff9274d4f03d-image.png

    4. Adresse im Browser kopieren und die Konstante sURL anpassen - sollte etwa so aussehen: https://air.plumelabs.com/air-quality-in-XXXXXX-aw-YYYYYYYY?utm_source=accuweather&utm_medium=current_aq_widget&utm_campaign=#ae16

    VORARBEITEN für Visualisierung (VIS) - ICON

    Nachfolgende Bilder müssen in den Ordner "luftdaten". Dieser ist ein Unterordner von "vis.0". Ergebnis: "/vis.0/luftdaten". Hinweis. Sollte eine andere Visualisierung genutzt werden, müssen ggfs. individuelle Anpassungen vorgenommen werden.

    aqip6.png
    aqip5.png
    aqip4.png
    aqip3.png
    aqip2.png
    aqip1.png
    luftdaten-images.zip

    //Version 1.0.0
    //23.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
    
    //Vorarbeiten abarbeiten
    
    const sMainPath     = '0_userdata.0.Luftdaten.';
    //URL zum Auslesen - bitte anpassen - Anleitung beachten!!
    const sURL          = 'https://air.plumelabs.com/air-quality-in-bautzen-aw-171290?utm_source=accuweather&utm_medium=current_aq_widget&utm_campaign=#ae16'; // Ermittlung Schritt 1 - 4
    //nicht ändern!!!
    const airBasis      = 'O3,PM10,PM25,NO2';
    const airDetails    = 'hervorragend,angemessen,schlecht,ungesund,sehr ungesund,gefährlich';
    
    function Initalisierung(){
        let sAIR = airBasis.split(',');
        for (let i = 0; i <= sAIR.length-1; i++) {
            createState(sMainPath+sAIR[i]+'.value', 0, {name: 'Wert',type: 'number', read: true, write: true, unit: 'µg/m³'});
            createState(sMainPath+sAIR[i]+'.index', 0, {name: 'Index',type: 'number', read: true, write: true});
            createState(sMainPath+sAIR[i]+'.desc', '', {name: 'Beschreibung',type: 'string', read: true, write: true});
            createState(sMainPath+sAIR[i]+'.image', '', {name: 'VIS',type: 'string', read: true, write: true});
        }
        createState(sMainPath+'data_json', '', {name: 'JSON',type: 'string', def: '[]', read: true, write: true, desc: 'JSON Widget'});
        createState(sMainPath+'Gesamt.index', '', {name: 'Index',type: 'number', read: true, write: true});
        createState(sMainPath+'Gesamt.value', '', {name: 'Wert',type: 'number', read: true, write: true});
        createState(sMainPath+'Gesamt.desc', '', {name: 'Beschreibung',type: 'string', read: true, write: true});
        createState(sMainPath+'Gesamt.image', '', {name: 'VIS',type: 'string', read: true, write: true});
        //erster Datenabruf
        LuftMessDaten();
    }
    //START
    Initalisierung();
    
    //automatischer Abruf aller 15 Minuten - weniger nicht empfohlen
    schedule('*/15 * * * *', LuftMessDaten);
    
    
    function NormZahl(wert) {
        if(isNaN(wert)) {
            wert = 0;
        }
        return wert;
    }
    
    function LuftMessDaten() {
        httpGet(sURL, { timeout: 30000, "headers":{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"}}, (error, response) => {
            if (!error && response.statusCode == 200) {
                let info = response.data;
                let sAIR = airBasis.split(',');
                for (let i = 0; i <= sAIR.length-1; i++) {
                    AuswertungLuftMessDaten(info,sAIR[i]);
                }
                AuswertungLuftMessDatenEx();
                CreateJSON();
                info = '';
            } else {
                if (response.statusCode != 502) {
                    console.error('LuftMessDaten: ' + response.statusCode);
                }
            }    
        })
    }
    
    
    function CreateJSON() {
        let JSON_List   = [];
        let sAIR = airBasis.split(',');
        for (let i = 0; i <= sAIR.length-1; i++) {
            JSON_List.push({"air": sAIR[i], "index": getState(sMainPath+sAIR[i]+'.index').val, "value": getState(sMainPath+sAIR[i]+'.value').val, "desc": getState(sMainPath+sAIR[i]+'.desc').val, "image": getState(sMainPath+sAIR[i]+'.image').val});
        }
        setState(sMainPath+'data_json', JSON.stringify(JSON_List), true);
        JSON_List = [];
    }
    
    function AuswertungLuftMessDaten(sData='', sIndex=''){
        var info = sData;
        var Position = info.indexOf('window.current_data');
        var dummy = info.substr(Position, 1000);
        var Position = dummy.indexOf('"'+sIndex+'"');
        var dummy = dummy.substr(Position, 100);
    
        var Position = dummy.indexOf('"pi":');
        var dummy = dummy.substr(Position+6, 7);
        setState(sMainPath+sIndex+'.index', parseInt(dummy), true);
        var lIndex = LuftIndex(parseInt(dummy));
        setState(sMainPath+sIndex+'.desc', airDetails.split(',')[lIndex-1], true);
        setState(sMainPath+sIndex+'.image', '/vis.0/luftdaten/aqip'+lIndex+'.png', true);
    
        var Position = info.indexOf('window.current_data');
        var dummy = info.substr(Position, 1000);
        var Position = dummy.indexOf('"'+sIndex+'"');
        var dummy = dummy.substr(Position, 100);
    
        var Position = dummy.indexOf('"value_upm":');
        var dummy = dummy.substr(Position+13, 7);
        setState(sMainPath+sIndex+'.value', parseFloat(dummy), true);
    }
    
    function AuswertungLuftMessDatenEx(){
        let sAIR = airBasis.split(',');
        var aqi = Math.max(NormZahl(getState(sMainPath+sAIR[0]+'.index').val), NormZahl(getState(sMainPath+sAIR[1]+'.index').val), NormZahl(getState(sMainPath+sAIR[2]+'.index').val), NormZahl(getState(sMainPath+sAIR[3]+'.index').val));
        var lIndex = LuftIndex(aqi);
    
        setState(sMainPath+'Gesamt.value', aqi, true);
        setState(sMainPath+'Gesamt.index', lIndex, true);
        setState(sMainPath+'Gesamt.desc', airDetails.split(',')[lIndex-1], true);
        setState(sMainPath+'Gesamt.image', '/vis.0/luftdaten/aqip'+lIndex+'.png', true);
    }
    
    function LuftIndex(aqi){
        if (aqi <= 20) {
            return 1;
        } else if (aqi <= 50) {
            return 2;
        } else if (aqi <= 100) {
            return 3;
        } else if (aqi <= 150) {
            return 4;
        } else if (aqi <= 250) {
            return 5;
        } else {
            return 6;
        }
    }
    

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

    99be4083-ed00-4301-a5a4-94396ed1ac1f-image.png

    Ich wünsche euch viel Spaß.

    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

    S sigi234S 2 Antworten Letzte Antwort
    4
    • Ro75R Ro75

      Hallo. Heute stelle ich euch einmal mein Skript "Luftdaten" vor. Dieses Skript liest Daten einer Websiteaus. Es ermittelt wie auch andere Skripts (z.B. Wetter, Biowetter, AlleStörungen, usw.) Daten und schreibt diese zur Weiterverarbeitung in einzelne Datenpunkte.

      Ausgelesen werden Daten für Ozon, NO2, PM10 und PM25. Damit lassen sich einfache, individuelle Visualisierungen erstellen. Dies ist vielleicht ein weiteres Skript für Nutzer vom ioBroker.

      VORARBEITEN für SKRIPT - Anleitung um meinen Ort und damit die URL zu finden

      1. Adresse https://www.accuweather.com/ öffnen und im Suchfeld dein Ort eingeben und auswählen - Hinweis: Funktioniert mit Orten aus DE, AT, CH
        2d7aaaf9-e7ec-412d-aadf-6d492926ff1c-image.png

      2. Auf der neuen Seite, unterhalb des Suchfeldes auf den Link "LUFTQUALITÄT" klicken
        5284ee36-d54b-4b21-aa31-718b89226b41-image.png

      3. In der ersten Karte (LUFTQUALITÄT HEUTE) unten rechts auf den Link "plume labs" klicken
        65a95d62-4dc4-4dd5-a510-ff9274d4f03d-image.png

      4. Adresse im Browser kopieren und die Konstante sURL anpassen - sollte etwa so aussehen: https://air.plumelabs.com/air-quality-in-XXXXXX-aw-YYYYYYYY?utm_source=accuweather&utm_medium=current_aq_widget&utm_campaign=#ae16

      VORARBEITEN für Visualisierung (VIS) - ICON

      Nachfolgende Bilder müssen in den Ordner "luftdaten". Dieser ist ein Unterordner von "vis.0". Ergebnis: "/vis.0/luftdaten". Hinweis. Sollte eine andere Visualisierung genutzt werden, müssen ggfs. individuelle Anpassungen vorgenommen werden.

      aqip6.png
      aqip5.png
      aqip4.png
      aqip3.png
      aqip2.png
      aqip1.png
      luftdaten-images.zip

      //Version 1.0.0
      //23.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
      
      //Vorarbeiten abarbeiten
      
      const sMainPath     = '0_userdata.0.Luftdaten.';
      //URL zum Auslesen - bitte anpassen - Anleitung beachten!!
      const sURL          = 'https://air.plumelabs.com/air-quality-in-bautzen-aw-171290?utm_source=accuweather&utm_medium=current_aq_widget&utm_campaign=#ae16'; // Ermittlung Schritt 1 - 4
      //nicht ändern!!!
      const airBasis      = 'O3,PM10,PM25,NO2';
      const airDetails    = 'hervorragend,angemessen,schlecht,ungesund,sehr ungesund,gefährlich';
      
      function Initalisierung(){
          let sAIR = airBasis.split(',');
          for (let i = 0; i <= sAIR.length-1; i++) {
              createState(sMainPath+sAIR[i]+'.value', 0, {name: 'Wert',type: 'number', read: true, write: true, unit: 'µg/m³'});
              createState(sMainPath+sAIR[i]+'.index', 0, {name: 'Index',type: 'number', read: true, write: true});
              createState(sMainPath+sAIR[i]+'.desc', '', {name: 'Beschreibung',type: 'string', read: true, write: true});
              createState(sMainPath+sAIR[i]+'.image', '', {name: 'VIS',type: 'string', read: true, write: true});
          }
          createState(sMainPath+'data_json', '', {name: 'JSON',type: 'string', def: '[]', read: true, write: true, desc: 'JSON Widget'});
          createState(sMainPath+'Gesamt.index', '', {name: 'Index',type: 'number', read: true, write: true});
          createState(sMainPath+'Gesamt.value', '', {name: 'Wert',type: 'number', read: true, write: true});
          createState(sMainPath+'Gesamt.desc', '', {name: 'Beschreibung',type: 'string', read: true, write: true});
          createState(sMainPath+'Gesamt.image', '', {name: 'VIS',type: 'string', read: true, write: true});
          //erster Datenabruf
          LuftMessDaten();
      }
      //START
      Initalisierung();
      
      //automatischer Abruf aller 15 Minuten - weniger nicht empfohlen
      schedule('*/15 * * * *', LuftMessDaten);
      
      
      function NormZahl(wert) {
          if(isNaN(wert)) {
              wert = 0;
          }
          return wert;
      }
      
      function LuftMessDaten() {
          httpGet(sURL, { timeout: 30000, "headers":{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"}}, (error, response) => {
              if (!error && response.statusCode == 200) {
                  let info = response.data;
                  let sAIR = airBasis.split(',');
                  for (let i = 0; i <= sAIR.length-1; i++) {
                      AuswertungLuftMessDaten(info,sAIR[i]);
                  }
                  AuswertungLuftMessDatenEx();
                  CreateJSON();
                  info = '';
              } else {
                  if (response.statusCode != 502) {
                      console.error('LuftMessDaten: ' + response.statusCode);
                  }
              }    
          })
      }
      
      
      function CreateJSON() {
          let JSON_List   = [];
          let sAIR = airBasis.split(',');
          for (let i = 0; i <= sAIR.length-1; i++) {
              JSON_List.push({"air": sAIR[i], "index": getState(sMainPath+sAIR[i]+'.index').val, "value": getState(sMainPath+sAIR[i]+'.value').val, "desc": getState(sMainPath+sAIR[i]+'.desc').val, "image": getState(sMainPath+sAIR[i]+'.image').val});
          }
          setState(sMainPath+'data_json', JSON.stringify(JSON_List), true);
          JSON_List = [];
      }
      
      function AuswertungLuftMessDaten(sData='', sIndex=''){
          var info = sData;
          var Position = info.indexOf('window.current_data');
          var dummy = info.substr(Position, 1000);
          var Position = dummy.indexOf('"'+sIndex+'"');
          var dummy = dummy.substr(Position, 100);
      
          var Position = dummy.indexOf('"pi":');
          var dummy = dummy.substr(Position+6, 7);
          setState(sMainPath+sIndex+'.index', parseInt(dummy), true);
          var lIndex = LuftIndex(parseInt(dummy));
          setState(sMainPath+sIndex+'.desc', airDetails.split(',')[lIndex-1], true);
          setState(sMainPath+sIndex+'.image', '/vis.0/luftdaten/aqip'+lIndex+'.png', true);
      
          var Position = info.indexOf('window.current_data');
          var dummy = info.substr(Position, 1000);
          var Position = dummy.indexOf('"'+sIndex+'"');
          var dummy = dummy.substr(Position, 100);
      
          var Position = dummy.indexOf('"value_upm":');
          var dummy = dummy.substr(Position+13, 7);
          setState(sMainPath+sIndex+'.value', parseFloat(dummy), true);
      }
      
      function AuswertungLuftMessDatenEx(){
          let sAIR = airBasis.split(',');
          var aqi = Math.max(NormZahl(getState(sMainPath+sAIR[0]+'.index').val), NormZahl(getState(sMainPath+sAIR[1]+'.index').val), NormZahl(getState(sMainPath+sAIR[2]+'.index').val), NormZahl(getState(sMainPath+sAIR[3]+'.index').val));
          var lIndex = LuftIndex(aqi);
      
          setState(sMainPath+'Gesamt.value', aqi, true);
          setState(sMainPath+'Gesamt.index', lIndex, true);
          setState(sMainPath+'Gesamt.desc', airDetails.split(',')[lIndex-1], true);
          setState(sMainPath+'Gesamt.image', '/vis.0/luftdaten/aqip'+lIndex+'.png', true);
      }
      
      function LuftIndex(aqi){
          if (aqi <= 20) {
              return 1;
          } else if (aqi <= 50) {
              return 2;
          } else if (aqi <= 100) {
              return 3;
          } else if (aqi <= 150) {
              return 4;
          } else if (aqi <= 250) {
              return 5;
          } else {
              return 6;
          }
      }
      

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

      99be4083-ed00-4301-a5a4-94396ed1ac1f-image.png

      Ich wünsche euch viel Spaß.

      Ro75.

      S Online
      S Online
      spike2
      schrieb am zuletzt editiert von spike2
      #2

      @ro75 Dankeschön für das Script, funktioniert ohne Probleme :+1: :blush:

      Anbei ein Beispiel in VIS:

      1b693b42-90d5-4e6f-9e96-56e38c26b31d-grafik.png

      Grüße Spike

      1 Antwort Letzte Antwort
      1
      • Ro75R Ro75

        Hallo. Heute stelle ich euch einmal mein Skript "Luftdaten" vor. Dieses Skript liest Daten einer Websiteaus. Es ermittelt wie auch andere Skripts (z.B. Wetter, Biowetter, AlleStörungen, usw.) Daten und schreibt diese zur Weiterverarbeitung in einzelne Datenpunkte.

        Ausgelesen werden Daten für Ozon, NO2, PM10 und PM25. Damit lassen sich einfache, individuelle Visualisierungen erstellen. Dies ist vielleicht ein weiteres Skript für Nutzer vom ioBroker.

        VORARBEITEN für SKRIPT - Anleitung um meinen Ort und damit die URL zu finden

        1. Adresse https://www.accuweather.com/ öffnen und im Suchfeld dein Ort eingeben und auswählen - Hinweis: Funktioniert mit Orten aus DE, AT, CH
          2d7aaaf9-e7ec-412d-aadf-6d492926ff1c-image.png

        2. Auf der neuen Seite, unterhalb des Suchfeldes auf den Link "LUFTQUALITÄT" klicken
          5284ee36-d54b-4b21-aa31-718b89226b41-image.png

        3. In der ersten Karte (LUFTQUALITÄT HEUTE) unten rechts auf den Link "plume labs" klicken
          65a95d62-4dc4-4dd5-a510-ff9274d4f03d-image.png

        4. Adresse im Browser kopieren und die Konstante sURL anpassen - sollte etwa so aussehen: https://air.plumelabs.com/air-quality-in-XXXXXX-aw-YYYYYYYY?utm_source=accuweather&utm_medium=current_aq_widget&utm_campaign=#ae16

        VORARBEITEN für Visualisierung (VIS) - ICON

        Nachfolgende Bilder müssen in den Ordner "luftdaten". Dieser ist ein Unterordner von "vis.0". Ergebnis: "/vis.0/luftdaten". Hinweis. Sollte eine andere Visualisierung genutzt werden, müssen ggfs. individuelle Anpassungen vorgenommen werden.

        aqip6.png
        aqip5.png
        aqip4.png
        aqip3.png
        aqip2.png
        aqip1.png
        luftdaten-images.zip

        //Version 1.0.0
        //23.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
        
        //Vorarbeiten abarbeiten
        
        const sMainPath     = '0_userdata.0.Luftdaten.';
        //URL zum Auslesen - bitte anpassen - Anleitung beachten!!
        const sURL          = 'https://air.plumelabs.com/air-quality-in-bautzen-aw-171290?utm_source=accuweather&utm_medium=current_aq_widget&utm_campaign=#ae16'; // Ermittlung Schritt 1 - 4
        //nicht ändern!!!
        const airBasis      = 'O3,PM10,PM25,NO2';
        const airDetails    = 'hervorragend,angemessen,schlecht,ungesund,sehr ungesund,gefährlich';
        
        function Initalisierung(){
            let sAIR = airBasis.split(',');
            for (let i = 0; i <= sAIR.length-1; i++) {
                createState(sMainPath+sAIR[i]+'.value', 0, {name: 'Wert',type: 'number', read: true, write: true, unit: 'µg/m³'});
                createState(sMainPath+sAIR[i]+'.index', 0, {name: 'Index',type: 'number', read: true, write: true});
                createState(sMainPath+sAIR[i]+'.desc', '', {name: 'Beschreibung',type: 'string', read: true, write: true});
                createState(sMainPath+sAIR[i]+'.image', '', {name: 'VIS',type: 'string', read: true, write: true});
            }
            createState(sMainPath+'data_json', '', {name: 'JSON',type: 'string', def: '[]', read: true, write: true, desc: 'JSON Widget'});
            createState(sMainPath+'Gesamt.index', '', {name: 'Index',type: 'number', read: true, write: true});
            createState(sMainPath+'Gesamt.value', '', {name: 'Wert',type: 'number', read: true, write: true});
            createState(sMainPath+'Gesamt.desc', '', {name: 'Beschreibung',type: 'string', read: true, write: true});
            createState(sMainPath+'Gesamt.image', '', {name: 'VIS',type: 'string', read: true, write: true});
            //erster Datenabruf
            LuftMessDaten();
        }
        //START
        Initalisierung();
        
        //automatischer Abruf aller 15 Minuten - weniger nicht empfohlen
        schedule('*/15 * * * *', LuftMessDaten);
        
        
        function NormZahl(wert) {
            if(isNaN(wert)) {
                wert = 0;
            }
            return wert;
        }
        
        function LuftMessDaten() {
            httpGet(sURL, { timeout: 30000, "headers":{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"}}, (error, response) => {
                if (!error && response.statusCode == 200) {
                    let info = response.data;
                    let sAIR = airBasis.split(',');
                    for (let i = 0; i <= sAIR.length-1; i++) {
                        AuswertungLuftMessDaten(info,sAIR[i]);
                    }
                    AuswertungLuftMessDatenEx();
                    CreateJSON();
                    info = '';
                } else {
                    if (response.statusCode != 502) {
                        console.error('LuftMessDaten: ' + response.statusCode);
                    }
                }    
            })
        }
        
        
        function CreateJSON() {
            let JSON_List   = [];
            let sAIR = airBasis.split(',');
            for (let i = 0; i <= sAIR.length-1; i++) {
                JSON_List.push({"air": sAIR[i], "index": getState(sMainPath+sAIR[i]+'.index').val, "value": getState(sMainPath+sAIR[i]+'.value').val, "desc": getState(sMainPath+sAIR[i]+'.desc').val, "image": getState(sMainPath+sAIR[i]+'.image').val});
            }
            setState(sMainPath+'data_json', JSON.stringify(JSON_List), true);
            JSON_List = [];
        }
        
        function AuswertungLuftMessDaten(sData='', sIndex=''){
            var info = sData;
            var Position = info.indexOf('window.current_data');
            var dummy = info.substr(Position, 1000);
            var Position = dummy.indexOf('"'+sIndex+'"');
            var dummy = dummy.substr(Position, 100);
        
            var Position = dummy.indexOf('"pi":');
            var dummy = dummy.substr(Position+6, 7);
            setState(sMainPath+sIndex+'.index', parseInt(dummy), true);
            var lIndex = LuftIndex(parseInt(dummy));
            setState(sMainPath+sIndex+'.desc', airDetails.split(',')[lIndex-1], true);
            setState(sMainPath+sIndex+'.image', '/vis.0/luftdaten/aqip'+lIndex+'.png', true);
        
            var Position = info.indexOf('window.current_data');
            var dummy = info.substr(Position, 1000);
            var Position = dummy.indexOf('"'+sIndex+'"');
            var dummy = dummy.substr(Position, 100);
        
            var Position = dummy.indexOf('"value_upm":');
            var dummy = dummy.substr(Position+13, 7);
            setState(sMainPath+sIndex+'.value', parseFloat(dummy), true);
        }
        
        function AuswertungLuftMessDatenEx(){
            let sAIR = airBasis.split(',');
            var aqi = Math.max(NormZahl(getState(sMainPath+sAIR[0]+'.index').val), NormZahl(getState(sMainPath+sAIR[1]+'.index').val), NormZahl(getState(sMainPath+sAIR[2]+'.index').val), NormZahl(getState(sMainPath+sAIR[3]+'.index').val));
            var lIndex = LuftIndex(aqi);
        
            setState(sMainPath+'Gesamt.value', aqi, true);
            setState(sMainPath+'Gesamt.index', lIndex, true);
            setState(sMainPath+'Gesamt.desc', airDetails.split(',')[lIndex-1], true);
            setState(sMainPath+'Gesamt.image', '/vis.0/luftdaten/aqip'+lIndex+'.png', true);
        }
        
        function LuftIndex(aqi){
            if (aqi <= 20) {
                return 1;
            } else if (aqi <= 50) {
                return 2;
            } else if (aqi <= 100) {
                return 3;
            } else if (aqi <= 150) {
                return 4;
            } else if (aqi <= 250) {
                return 5;
            } else {
                return 6;
            }
        }
        

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

        99be4083-ed00-4301-a5a4-94396ed1ac1f-image.png

        Ich wünsche euch viel Spaß.

        Ro75.

        sigi234S Online
        sigi234S Online
        sigi234
        Forum Testing Most Active
        schrieb am zuletzt editiert von
        #3

        @ro75

        Super aber /vis.0/luftdaten/aqip0.png gibt es nicht?

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

        D 1 Antwort Letzte Antwort
        0
        • sigi234S sigi234

          @ro75

          Super aber /vis.0/luftdaten/aqip0.png gibt es nicht?

          D Online
          D Online
          Dischro
          schrieb am zuletzt editiert von
          #4

          @sigi234
          ich hab sie umbenannt, von 0-5

          Ro75R 1 Antwort Letzte Antwort
          0
          • D Dischro

            @sigi234
            ich hab sie umbenannt, von 0-5

            Ro75R Online
            Ro75R Online
            Ro75
            schrieb am zuletzt editiert von
            #5

            @dischro sollte so nicht sein. Passe das Skript an, hatte es etwas abgeändert.

            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

            bahnuhrB 1 Antwort Letzte Antwort
            1
            • Ro75R Ro75

              @dischro sollte so nicht sein. Passe das Skript an, hatte es etwas abgeändert.

              Ro75

              bahnuhrB Online
              bahnuhrB Online
              bahnuhr
              Forum Testing Most Active
              schrieb am zuletzt editiert von
              #6

              @ro75
              Auch ne Anmerkung von mir.

              Aufruf "Start" geht ins Leere -> diese Funktion gibt es nicht.
              (gilt auch für dein anderes Script -> Pollenflug)

              'info.substr' is deprecated.
              ersetze es durch substring

              769213d3-ee61-4bc0-9e2f-5cba8a599ddb-image.png
              Kann man auch die Texte rausholen ?

              Ansonsten top -> sofort umgesetzt
              Danke.


              Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
              Danke.
              gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
              ScreenToGif :https://www.screentogif.com/downloads.html

              Ro75R 1 Antwort Letzte Antwort
              0
              • bahnuhrB bahnuhr

                @ro75
                Auch ne Anmerkung von mir.

                Aufruf "Start" geht ins Leere -> diese Funktion gibt es nicht.
                (gilt auch für dein anderes Script -> Pollenflug)

                'info.substr' is deprecated.
                ersetze es durch substring

                769213d3-ee61-4bc0-9e2f-5cba8a599ddb-image.png
                Kann man auch die Texte rausholen ?

                Ansonsten top -> sofort umgesetzt
                Danke.

                Ro75R Online
                Ro75R Online
                Ro75
                schrieb am zuletzt editiert von
                #7

                @bahnuhr START ist ein Kommentar. Das andere schaue ich mir an

                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

                bahnuhrB 1 Antwort Letzte Antwort
                0
                • Ro75R Ro75

                  @bahnuhr START ist ein Kommentar. Das andere schaue ich mir an

                  Ro75

                  bahnuhrB Online
                  bahnuhrB Online
                  bahnuhr
                  Forum Testing Most Active
                  schrieb am zuletzt editiert von
                  #8

                  @ro75 sagte in Skript Luftdaten:

                  @bahnuhr START ist ein Kommentar. Das andere schaue ich mir an

                  Ro75

                  Hast recht.
                  zu schnell gekuckt und noch schneller geschrieben.
                  mfg


                  Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
                  Danke.
                  gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
                  ScreenToGif :https://www.screentogif.com/downloads.html

                  1 Antwort Letzte Antwort
                  0
                  • M Online
                    M Online
                    MCU
                    schrieb am zuletzt editiert von MCU
                    #9

                    @Ro75 Ist eine Raute in der URL gibt es einen Fehler.

                    httpGet(url=https://air.plumelabs.com/air-quality-in-hamburg-cdmq?utm_source=accuweather&utm_medium=current_aq_widget&utm_campaign=#ae16, error=timeout of 30000ms exceeded)
                    

                    Man muss # durch %23 ersetzen, dann geht es.

                    NUC i7 64GB mit Proxmox ---- Jarvis Infos Aktualisierungen der Doku auf Instagram verfolgen -> mcuiobroker Instagram
                    Wenn Euch mein Vorschlag geholfen hat, bitte rechts "^" klicken.

                    bahnuhrB 1 Antwort Letzte Antwort
                    0
                    • M MCU

                      @Ro75 Ist eine Raute in der URL gibt es einen Fehler.

                      httpGet(url=https://air.plumelabs.com/air-quality-in-hamburg-cdmq?utm_source=accuweather&utm_medium=current_aq_widget&utm_campaign=#ae16, error=timeout of 30000ms exceeded)
                      

                      Man muss # durch %23 ersetzen, dann geht es.

                      bahnuhrB Online
                      bahnuhrB Online
                      bahnuhr
                      Forum Testing Most Active
                      schrieb am zuletzt editiert von
                      #10

                      @Ro75

                      Zeile 92: setState(sMainPath+sIndex+'.image', '/vis.0/main/img/Luftdaten/aqip'+(lIndex-1)+'.png', true);
                      Zeile 112: setState(sMainPath+'Gesamt.image', '/vis.0/main/img/Luftdaten/aqip'+(lIndex-1)+'.png', true);

                      Bei beiden Zeilen habe ich den Pfad geändert.

                      In den Objekten steht aber trotzdem der alte Pfad:
                      d81ab6be-d487-481f-adf4-02b433982944-image.png

                      Was übersehe ich?
                      Finde den Gedankenfehler nicht.


                      Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
                      Danke.
                      gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
                      ScreenToGif :https://www.screentogif.com/downloads.html

                      bahnuhrB 1 Antwort Letzte Antwort
                      0
                      • bahnuhrB bahnuhr

                        @Ro75

                        Zeile 92: setState(sMainPath+sIndex+'.image', '/vis.0/main/img/Luftdaten/aqip'+(lIndex-1)+'.png', true);
                        Zeile 112: setState(sMainPath+'Gesamt.image', '/vis.0/main/img/Luftdaten/aqip'+(lIndex-1)+'.png', true);

                        Bei beiden Zeilen habe ich den Pfad geändert.

                        In den Objekten steht aber trotzdem der alte Pfad:
                        d81ab6be-d487-481f-adf4-02b433982944-image.png

                        Was übersehe ich?
                        Finde den Gedankenfehler nicht.

                        bahnuhrB Online
                        bahnuhrB Online
                        bahnuhr
                        Forum Testing Most Active
                        schrieb am zuletzt editiert von
                        #11

                        @bahnuhr

                        Hat sich erledigt.
                        Cache gelöscht. Dann stand es richtig drin.

                        mfg


                        Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
                        Danke.
                        gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
                        ScreenToGif :https://www.screentogif.com/downloads.html

                        S 1 Antwort Letzte Antwort
                        0
                        • bahnuhrB bahnuhr

                          @bahnuhr

                          Hat sich erledigt.
                          Cache gelöscht. Dann stand es richtig drin.

                          mfg

                          S Nicht stören
                          S Nicht stören
                          stenmic
                          schrieb am zuletzt editiert von stenmic
                          #12

                          script ist gut, aber… wie zufrieden seid ihr mit den Werten?
                          Ich hole mir den Index über iqair. die haben auch ne offene api (mit free token). Leider aber nur für die jeweiligen Messstationen.
                          zum Glück hab ich gleich eine vom Wetterdienst in der Nachbarstadt.

                          Hier mal zum Vergleich
                          iqair AQI 60
                          IMG_0765.jpeg

                          accuweather AQI 33
                          IMG_0764.jpeg

                          was stimmt denn jetzt 🤒

                          S 1 Antwort Letzte Antwort
                          0
                          • S stenmic

                            script ist gut, aber… wie zufrieden seid ihr mit den Werten?
                            Ich hole mir den Index über iqair. die haben auch ne offene api (mit free token). Leider aber nur für die jeweiligen Messstationen.
                            zum Glück hab ich gleich eine vom Wetterdienst in der Nachbarstadt.

                            Hier mal zum Vergleich
                            iqair AQI 60
                            IMG_0765.jpeg

                            accuweather AQI 33
                            IMG_0764.jpeg

                            was stimmt denn jetzt 🤒

                            S Online
                            S Online
                            spike2
                            schrieb am zuletzt editiert von
                            #13

                            @stenmic Das habe ich auch schon festgestellt, aber man muss auch mal prüfen wo genau die Messstationen der jeweiligen Anbieter sind ;)

                            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

                            873

                            Online

                            32.4k

                            Benutzer

                            81.5k

                            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