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. [Script] DWD/UWZ/NINA Warnungen als Push/Sprachnachrichten

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.4k

[Script] DWD/UWZ/NINA Warnungen als Push/Sprachnachrichten

Scheduled Pinned Locked Moved JavaScript
1.5k Posts 53 Posters 592.5k Views 52 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.
  • NashraN Nashra

    @ticaki sagte in [Script] DWD/UWZ/NINA Warnungen als Push/Sprachnachrichten:

    @megawaldi
    .04 ist aktuell. Habs dieses mal getestet.

    Beim Start keine Fehler mehr:+1:

    T Do not disturb
    T Do not disturb
    ticaki
    wrote on last edited by
    #683

    @nashra
    Danke fürs Testen ohne meckern.

    Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

    Spenden

    M 1 Reply Last reply
    0
    • NashraN Nashra

      @ticaki sagte in [Script] DWD/UWZ/NINA Warnungen als Push/Sprachnachrichten:

      @megawaldi
      .04 ist aktuell. Habs dieses mal getestet.

      Beim Start keine Fehler mehr:+1:

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

      @nashra sagte in [Script] DWD/UWZ/NINA Warnungen als Push/Sprachnachrichten:

      Beim Start keine Fehler mehr

      Dito :+1:

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

      1 Reply Last reply
      0
      • T ticaki

        @nashra
        Danke fürs Testen ohne meckern.

        M Offline
        M Offline
        Megawaldi
        wrote on last edited by
        #685

        @ticaki
        Bei mir läuft es auch so wie es soll 👍

        T 1 Reply Last reply
        0
        • M Megawaldi

          @ticaki
          Bei mir läuft es auch so wie es soll 👍

          T Do not disturb
          T Do not disturb
          ticaki
          wrote on last edited by
          #686

          @megawaldi
          Werden die Warnungen auch erfasst?

          Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

          Spenden

          M 1 Reply Last reply
          0
          • T ticaki

            @megawaldi
            Werden die Warnungen auch erfasst?

            M Offline
            M Offline
            Megawaldi
            wrote on last edited by
            #687

            @ticaki
            Ja sieht gut aus bis jetzt

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

              Da sind wir wieder. Jetzt wieder alle halbe Stunde die gleiche Nachricht von DWD und UWZ.
              Was machen die Pappköppe da :thinking_face:

              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.

              T 1 Reply Last reply
              0
              • NashraN Nashra

                Da sind wir wieder. Jetzt wieder alle halbe Stunde die gleiche Nachricht von DWD und UWZ.
                Was machen die Pappköppe da :thinking_face:

                T Do not disturb
                T Do not disturb
                ticaki
                wrote on last edited by
                #689

                @nashra
                Ich benötige das log von 2 Wiederholungen mit DEBUG true

                Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                Spenden

                1 Reply Last reply
                0
                • T Do not disturb
                  T Do not disturb
                  ticaki
                  wrote on last edited by ticaki
                  #690

                  Mein DWD Adapter steht auf 10 Minuten und ich habe keine Wiederholungen. Aktuell fällt mir halt nur ein das du tatsächlich 2 mal die exakt gleiche Warnung drin stehen hast. Ich denke dann kommt das Skript durcheinander. Ich hab meinen DWD Datenbaum mal komplett gelöscht (wird beim nächsten Lauf wiedererstellt)und danach hatte ich einige Probleme weniger. Mußt aber natürlich das Skript neustarten wenn der Baum erstellt ist.

                  Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                  Spenden

                  M 1 Reply Last reply
                  0
                  • T ticaki

                    Mein DWD Adapter steht auf 10 Minuten und ich habe keine Wiederholungen. Aktuell fällt mir halt nur ein das du tatsächlich 2 mal die exakt gleiche Warnung drin stehen hast. Ich denke dann kommt das Skript durcheinander. Ich hab meinen DWD Datenbaum mal komplett gelöscht (wird beim nächsten Lauf wiedererstellt)und danach hatte ich einige Probleme weniger. Mußt aber natürlich das Skript neustarten wenn der Baum erstellt ist.

                    M Offline
                    M Offline
                    Megawaldi
                    wrote on last edited by
                    #691

                    @ticaki
                    Ich bin vom dwd Adapter weg, da mich der Restart im log gestört hat und mir das zu unübersichtlich wurde.
                    Daher habe ich mir ein Script geschrieben, das das selbe aber die Datenstruktur vom dwd Adapter nachahmt macht.
                    Auch das uwz script habe ich heute mal neu geschrieben.
                    Wenn dich das interessiert, kann ich die zwei scripte gerne zur Verfügung stellen.

                    T 1 Reply Last reply
                    0
                    • M Megawaldi

                      @ticaki
                      Ich bin vom dwd Adapter weg, da mich der Restart im log gestört hat und mir das zu unübersichtlich wurde.
                      Daher habe ich mir ein Script geschrieben, das das selbe aber die Datenstruktur vom dwd Adapter nachahmt macht.
                      Auch das uwz script habe ich heute mal neu geschrieben.
                      Wenn dich das interessiert, kann ich die zwei scripte gerne zur Verfügung stellen.

                      T Do not disturb
                      T Do not disturb
                      ticaki
                      wrote on last edited by ticaki
                      #692

                      @megawaldi
                      Poste sie und wenn du Github benutzt gib mir den Link und ich setzte sie ins erste Posting. Hoffe du benutzt Interval und nicht schedule :)

                      Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                      Spenden

                      M 1 Reply Last reply
                      0
                      • T ticaki

                        @megawaldi
                        Poste sie und wenn du Github benutzt gib mir den Link und ich setzte sie ins erste Posting. Hoffe du benutzt Interval und nicht schedule :)

                        M Offline
                        M Offline
                        Megawaldi
                        wrote on last edited by
                        #693

                        @ticaki
                        Ich hab mich eigendlich für schedule entschieden 😉. Gibt es aus deiner sicht nen Grund warum interval bessser ist?

                        T 1 Reply Last reply
                        0
                        • M Megawaldi

                          @ticaki
                          Ich hab mich eigendlich für schedule entschieden 😉. Gibt es aus deiner sicht nen Grund warum interval bessser ist?

                          T Do not disturb
                          T Do not disturb
                          ticaki
                          wrote on last edited by ticaki
                          #694

                          @megawaldi
                          Wenn alle Leute die bei DWD Daten abrufen schedule verwenden, freut sich der Server sicherlich zu jeder vollen Stunde ganz doll über das hohe Interesse. :) Intervall richtet sich nach dem Startzeitpunkt des Skriptes und damit werden die Zugriffe mehr verteilt und es gibt nicht diese Peaks wie mit schedule.

                          Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                          Spenden

                          M 1 Reply Last reply
                          0
                          • T ticaki

                            @megawaldi
                            Wenn alle Leute die bei DWD Daten abrufen schedule verwenden, freut sich der Server sicherlich zu jeder vollen Stunde ganz doll über das hohe Interesse. :) Intervall richtet sich nach dem Startzeitpunkt des Skriptes und damit werden die Zugriffe mehr verteilt und es gibt nicht diese Peaks wie mit schedule.

                            M Offline
                            M Offline
                            Megawaldi
                            wrote on last edited by
                            #695

                            @ticaki
                            Hier mal zum testen: Habs auf Intervall geändert 😉

                            const axios = require('axios'); 
                            
                            var debuglevel = 1;
                            var debugchannel = 'info';
                            
                            var channelId = "0_userdata.0.UWZ";
                            
                            var intervalMinutes = 5; 
                            var forceInitStates = false;
                            var numOfWarnings = 5;
                            
                            var url='http://feed.alertspro.meteogroup.com/AlertsPro/AlertsProPollService.php?method=getWarning&language=de&areaID=XXXAREAXXX';
                            
                            
                            /********************* Hier die Warnzellen-Id's eintragen *****************************/
                            var warncellid = ['UWZDE53879'];
                            /**************************************************************************************/
                            
                            createStates(numOfWarnings);
                            
                            setInterval(work,intervalMinutes * 60 * 1000);
                            work();
                            
                            var UWZTypesArray=["n/a","unbekannt","Sturm/Orkan","Schneefall","Starkregen","Extremfrost","Waldbrandgefahr","Gewitter","Glätte","Hitze","Glatteisregen","Bodenfrost"];
                            
                            function createStates(n){
                             var areaChannelId = null;
                            
                             for (var j=0; j<warncellid.length; j++) {
                                 areaChannelId=channelId+"."+warncellid[j];
                                 for (let i=0; i<n; i++) {
                                     createState(areaChannelId+".warning."+i+".ShortText","",forceInitStates,{type: 'string'});
                                     createState(areaChannelId+".warning."+i+".LongText","",forceInitStates,{type: 'string'});
                                     createState(areaChannelId+".warning."+i+".object","{}",forceInitStates,{type: 'object'});
                                     createState(areaChannelId+".warning."+i+".begin","",forceInitStates,{type: 'string'});
                                     createState(areaChannelId+".warning."+i+".end","",forceInitStates,{type: 'string'});
                                     createState(areaChannelId+".warning."+i+".severity",0,forceInitStates,{min:0, max:10, type: 'number'});
                                     createState(areaChannelId+".warning."+i+".type",0,forceInitStates,{min:0, max:11, type: 'number',states:{0:"n/a",1:"unbekannt",2:"Sturm/Orkan",3:"Schneefall",4:"Starkregen",5:"Extremfrost",6:"Waldbrandgefahr",7:"Gewitter",8:"Glätte",9:"Hitze",10:"Glatteisregen",11:"Bodenfrost"}});
                                     createState(areaChannelId+".warning."+i+".uwzLevel",0,forceInitStates,{min:0, max:5, type: 'number'});
                                     createState(areaChannelId+".warning."+i+".uwzColor",0,forceInitStates,{type:'number'});
                                     createState(areaChannelId+".warning."+i+".HTMLShort","",forceInitStates,{type: 'string'});
                                     createState(areaChannelId+".warning."+i+".HTMLLong","",forceInitStates,{type: 'string'});
                                 }
                             }
                            }
                            
                            function getUWZLevel (warnName){
                               if(warnName != undefined){
                                   var result = -1; // -1 is an error!
                                   var alert = warnName.split("_");
                                   var colors = ["green","darkgreen","yellow","orange","red","violet"];
                                   
                                   if (alert[0]=="notice") { result = 1; }
                                   else if (alert[1] == "forewarn") { result = 2; }
                                   else {
                                       result = colors.indexOf(alert[2]);
                                   }
                                   return result;
                               } else {
                                   return 0;
                               }
                            }
                            
                            function getUWZUrgency (warnName){
                               if(warnName != undefined){
                                   var result = 0;
                                   
                                   var alert = warnName.split("_");
                                   if (alert[1] == "forewarn") {
                                       result = 1;
                                   }
                                   else {
                                       result = 2; // immediate;
                                   }
                                   return result;
                               } else {
                                   return 0;
                               }
                            }
                            
                            function getLevelColor(uwzLevel,levelName) {
                               if(levelName != undefined){
                                   var uwzColor = [
                                   0x00ff00, // 0 - Grün
                                   0x009b00, // 1 - Dunkelgrün
                                   0xffff00, // 2 - Gelb Wetterwarnungen (Stufe 1)
                                   0xffb400, // 3 - Orange Warnungen vor markantem Wetter (Stufe 2)
                                   0xff0000, // 4 - Rot Unwetterwarnungen (Stufe 3)
                                   0xff00ff, // 5 - Violett Warnungen vor extremem Unwetter (Stufe 4)
                                   ];
                                   if (uwzLevel>=0 && uwzLevel<=5){
                                       return uwzColor[uwzLevel];
                                   } else {
                                       return 0;
                                   }
                               } else {
                                   return 0;
                               }
                            }
                            
                            function createHTMLShort(theData,uwzColor,uwzUrgency,shortText){
                               if(theData.type != undefined){
                                   var html = '<div style="background: #'+uwzColor.toString(16)+'" border:"10px">';
                                   html += '<h3>';
                                   if (uwzUrgency==1) html+="Vorwarnung vor "; else html+="Warnung vor ";
                                   html += UWZTypesArray[theData.type];
                                   html +="</h3>";
                                   html += "<p>Zeitraum von "+formatDate(new Date(theData.dtgStart*1000),"WW, DD. OO YYYY hh:mm")+" Uhr bis "+formatDate(new Date(theData.dtgEnd*1000),"WW, DD. OO YYYY hh:mm")+" Uhr </p>";
                                   html += '<p>'+shortText+'</p>';
                                   html += "</div>";
                                   return html;
                               } else {
                                   return '';
                               }
                            }
                            
                            function createHTMLLong(theData,uwzColor,uwzUrgency,longText){
                               if(theData.type != undefined){
                                   var html = '<div style="background: #'+uwzColor.toString(16)+'" border:"10px">';
                                   html += '<h3>';
                                   if (uwzUrgency==1) html+="Vorwarnung vor "; else html+="Warnung vor ";
                                   html += UWZTypesArray[theData.type];
                                   html +="</h3>";
                                   html += "<p>Zeitraum von "+formatDate(new Date(theData.dtgStart*1000),"WW, DD. OO YYYY hh:mm")+" Uhr bis "+formatDate(new Date(theData.dtgEnd*1000),"WW, DD. OO YYYY hh:mm")+" Uhr </p>";
                                   html += '<p>'+longText+'</p>';
                                   html += "</div>";
                                   return html;
                               } else {
                                   return '';
                               }
                            }
                            
                            async function writeResultEntry(_warnObj,_i,_area) {
                               let areaChannelId=channelId+"."+_area+".warning."+_i;
                               
                               var warnObjSting = JSON.stringify(_warnObj)|| '{}';
                               var warnObj = JSON.parse(warnObjSting);
                               
                               var object = _warnObj != undefined ? _warnObj : Object({});
                               var begin = _warnObj != undefined ? formatDate(new Date(warnObj.dtgStart*1000),"DD.MM.YYYY hh:mm") : "";
                               var end = _warnObj != undefined ? formatDate(new Date(warnObj.dtgEnd*1000),"DD.MM.YYYY hh:mm") : "";
                               var longText = _warnObj != undefined ? warnObj.payload.translationsLongText.DE : "";
                               var shortText = _warnObj != undefined ? warnObj.payload.translationsShortText.DE : ""; 
                               var severity = warnObj.severity || 0;
                               var type = warnObj.type || 0;
                               var uwzLevel = _warnObj != undefined ? getUWZLevel(warnObj.payload.levelName) : getUWZLevel(undefined);
                               var uwzUrgency = _warnObj != undefined ? getUWZUrgency(warnObj.payload.levelName) : getUWZUrgency(undefined);
                               var uwzColor = _warnObj != undefined ? getLevelColor(uwzLevel,warnObj.payload.levelName):  getLevelColor(uwzLevel,undefined) ;
                               var htmlShort = createHTMLShort(warnObj,uwzColor,uwzUrgency,shortText);
                               var htmlLong  = createHTMLLong(warnObj,uwzColor,uwzUrgency,longText);
                            
                               var oldObject = (await getStateAsync(areaChannelId+".object")).val;
                            
                               if(JSON.stringify(object) != JSON.stringify(oldObject)){
                                   setState(areaChannelId+".LongText",longText);
                                   setState(areaChannelId+".ShortText",shortText);
                                   setState(areaChannelId+".object",object);
                                   setState(areaChannelId+".begin",begin)
                                   setState(areaChannelId+".end",end);
                                   setState(areaChannelId+".severity",severity);
                                   setState(areaChannelId+".type",type);
                                   setState(areaChannelId+".uwzLevel",uwzLevel);
                                   setState(areaChannelId+".uwzColor",uwzColor);
                                   setState(areaChannelId+".HTMLShort",htmlShort);
                                   setState(areaChannelId+".HTMLLong",htmlLong);
                               } else {
                                   dwmlog('Datensatz '+_i+' ist schon vorhanden',4);
                               }
                               
                            }
                            
                            function processData(area, thedata) {
                               if (!thedata) {
                                   return;
                               }
                            
                               var jsonResults= [];
                               if (thedata.results.length>0) {
                                   for (let i=0; i<thedata.results.length; i++) {
                                       jsonResults.push(thedata.results[i]);
                                   }
                               }
                            
                               jsonResults.sort(function(a,b){
                                   var asort = a.severity;
                                   var bsort = b.severity;
                                   return bsort-asort;
                               });
                            
                               dwmlog(JSON.stringify(jsonResults),2);
                               for (let i=0; i<numOfWarnings; i++) {
                                   if (i<jsonResults.length) {
                                       //console.log(i+' -> mit Result'); 
                                       writeResultEntry(jsonResults[i],i,area);
                                   } else {
                                       //console.log(i+' -> ohne Result'); 
                                       writeResultEntry(undefined,i,area);
                                   }
                               }
                            }
                            
                            function getAreaFromURI(uri) {
                             var searchstr = "&areaID=";
                             var n = uri.search(searchstr);
                             var result = uri.slice(n+searchstr.length,uri.length);
                             return result;
                            }
                            
                            async function work() {
                               for (var i=0; i<warncellid.length; i++) {
                                   await axios.get(url.replace("XXXAREAXXX",warncellid[i]))
                                   .then(results => {
                                       dwmlog("AREA: "+warncellid[i],4);
                                       dwmlog("UWZ Body: " + JSON.stringify(results.data),4);
                                       dwmlog("Status: " + results.status,4);
                                       if (results.status == 200) {
                                           processData(getAreaFromURI(results.config.url),results.data);
                                       } else {
                                           dwmlog('Keine Daten empfangen',1);
                                       }
                                   })
                                   .catch(error => {
                                       if (error.response.status == 404){
                                           dwmlog(error.message, 1);
                                       } else {
                                           dwmlog(error.response.data, 1);
                                           dwmlog(error.response.status, 1);
                                           dwmlog(error.response.headers, 1);
                                       }
                                   })            
                               }
                            }
                            
                            function dwmlog( message, level, channel) {
                             if (channel === undefined) {
                                 channel = debugchannel;
                             }
                             if (level === undefined)
                             {
                                 level = debuglevel;
                             }
                             if ( debuglevel >= level ) {
                                 log (message, channel );
                             }
                            }
                            

                            const axios = require('axios');
                            
                            var debuglevel = 1;
                            var debugchannel = 'info';
                            
                            var channelId = '0_userdata.0.DWD.'+instance+'.warning';
                            
                            var intervalMinutes = 5;
                            var forceInitStates = false;
                            var numOfWarnings = 5;
                            
                            var url='https://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json';
                            
                            /********************* Hier die Warnzellen-Id's eintragen *****************************/
                            const warncellid = ['105366000'];
                            const land = 'nrw';
                            /**************************************************************************************/
                            
                            createStates(numOfWarnings);
                            
                            setInterval(work,intervalMinutes * 60 * 1000);
                            work();
                            
                            
                            
                            function createStates(anz){
                               for (let i=0; i<anz; i++) {
                                       if(i==0){
                                           var baseChannelId = channelId;
                                       } else {
                                           var baseChannelId = channelId+i;
                                       } 
                                       createState(baseChannelId+".begin","",forceInitStates,{name: "Warning begin",type: "number",role: "value.time",read: true,write: true});
                                       createState(baseChannelId+".description","",forceInitStates,{name: "Warning description",type: "string",role: "weather.state",read: true,write: true});
                                       createState(baseChannelId+".end","",forceInitStates,{name: "Warning end",type: "number",role: "value.time",read: true,write: true});
                                       createState(baseChannelId+".headline","",forceInitStates,{name: "Warning description",type: "string",role: "weather.state",read: true,write: true});
                                       createState(baseChannelId+".level",0,forceInitStates,{name: "Warning level",type: "number",role: "value.warning",read: true,write: true,states: {1: "Preliminary info",2: "Minor",3: "Moderate",4: "Severe",5: "Extreme"}});
                                       createState(baseChannelId+".map","",forceInitStates,{name: "Link to chart",type: "string",role: "weather.chart.url",read: true,write: true});
                                       createState(baseChannelId+".object","",forceInitStates,{name: "JSON object with warning",type: "object",role: "weather.json",read: true,write: true});
                                       createState(baseChannelId+".severity",0,forceInitStates,{name: "Warning severity",type: "number",role: "value.severity",read: true,write: true,states: {0: "None",1: "Minor",2: "Moderate",3: "Severe",4: "Extreme",9: "Heat Warning",11: "No Warning",19: "UV Warning",49: "Strong Heat",50: "Extreme Heat"}});
                                       createState(baseChannelId+".text","",forceInitStates,{name: "Warning text",type: "string",role: "weather.title.short",read: true,write: true});
                                       createState(baseChannelId+".type",0,forceInitStates,{name: "Warning type",type: "number",role: "weather.type",read: true,write: true,states: {0: "Thunderstorm",1: "Wind/Storm",2: "Rain",3: "Snow",4: "Fog",5: "Frost",6: "Ice",7: "Thawing",8: "Heat",9: "UV warning"}});  
                               }
                             
                            }
                            
                            async function writeResultEntry(_warnObj,_i) {
                               
                               if(_i==0){
                                   var baseChannelId = channelId;
                               } else {
                                   var baseChannelId = channelId+_i;
                               }
                                
                               const maps = ['gewitter', 'sturm', 'regen', 'schnee', 'nebel', 'frost', 'glatteis', 'tauwetter', 'hitze', 'uv'];
                               var warnObj = _warnObj || '{}';
                               
                               warnObj = JSON.parse(warnObj);
                               var begin=warnObj.start || Number("");
                               var description=warnObj.description || '';
                               var end=warnObj.end || Number("");
                               var headline=warnObj.headline || '';
                               var level = warnObj.level === undefined || warnObj.level === null ? null : parseInt(warnObj.level, 10);
                               var object = warnObj;
                               var severity = warnObj.level > 1 ? warnObj.level - 1 : 0;
                               var text=warnObj.event || '';
                               var type = warnObj.type  === undefined || warnObj.type  === null ? null : parseInt(warnObj.type, 10);
                               if (warnObj.type !== undefined && warnObj.type !== null) {
                                   var map = 'https://www.dwd.de/DWD/warnungen/warnapp_gemeinden/json/warnungen_gemeinde_map_'+land+'_'+maps[warnObj.type]+'.png';
                               } else {
                                   var map ='';
                               }
                               
                               var oldObject = (await getStateAsync(baseChannelId+".object")).val;
                            
                               if(JSON.stringify(object) != JSON.stringify(oldObject)){
                                   setState(baseChannelId+".begin",begin);
                                   setState(baseChannelId+".description",description);
                                   setState(baseChannelId+".end",end);
                                   setState(baseChannelId+".headline",headline);
                                   setState(baseChannelId+".level",Number(level));
                                   setState(baseChannelId+".map",map);
                                   setState(baseChannelId+".object",object);
                                   setState(baseChannelId+".severity",severity);
                                   setState(baseChannelId+".text",text);
                                   setState(baseChannelId+".type",Number(type));
                               } else {
                                   dwmlog('Datensatz '+_i+' ist schon vorhanden',4);
                               }
                            }
                            
                            function processData(area, thedata) {
                               if (!thedata) {
                                   return;
                               }
                               var jsonString = String(thedata);
                               var newString = jsonString.replace('warnWetter.loadWarnings(','');
                               newString = newString.replace(');','');
                               var newJSON = JSON.parse(newString);
                               
                               var jsonResults = [];
                               if (newJSON.warnings.hasOwnProperty(area)) {
                                   var anz = newJSON.warnings[area].length;
                                   for(var i=0;i<anz;i++){
                                       jsonResults.push(JSON.stringify(newJSON.warnings[area][i]));
                                   }
                               } 
                            
                               dwmlog(JSON.stringify(jsonResults),2);
                               for (let i=0; i<numOfWarnings; i++) {
                                   if (i<jsonResults.length) {
                                       //console.log(i+' -> mit Result'); 
                                       writeResultEntry(jsonResults[i],i);
                                   } else {
                                       //console.log(i+' -> ohne Result'); 
                                       writeResultEntry(undefined,i);
                                   }
                               }
                               
                            }
                              
                            async function work() {
                               for (var i=0; i<warncellid.length; i++) {
                                   await axios.get(url)
                                   .then(results => {
                                       dwmlog("AREA: "+warncellid[i],4);
                                       dwmlog("UWZ Body: " + JSON.stringify(results.data),4);
                                       dwmlog("Status: " + results.status,4);
                                       if (results.status == 200) {
                                           processData(+warncellid[i],results.data);
                                       } else {
                                           dwmlog('Keine Daten empfangen',1);
                                       }
                                   })
                                   .catch(error => {
                                       if (error.response.status == 404){
                                           dwmlog(error.message, 1);
                                       } else {
                                           dwmlog(error.response.data, 1);
                                           dwmlog(error.response.status, 1);
                                           dwmlog(error.response.headers, 1);
                                       }
                                   })            
                               }
                            }
                            
                            function dwmlog( message, level, channel) {
                               if (channel === undefined) {
                                   channel = debugchannel;
                               }
                               if (level === undefined) {
                                   level = debuglevel;
                               }
                               if ( debuglevel >= level ) {
                                   log (message, channel );
                               }
                            }
                            

                            T 1 Reply Last reply
                            0
                            • M Megawaldi

                              @ticaki
                              Hier mal zum testen: Habs auf Intervall geändert 😉

                              const axios = require('axios'); 
                              
                              var debuglevel = 1;
                              var debugchannel = 'info';
                              
                              var channelId = "0_userdata.0.UWZ";
                              
                              var intervalMinutes = 5; 
                              var forceInitStates = false;
                              var numOfWarnings = 5;
                              
                              var url='http://feed.alertspro.meteogroup.com/AlertsPro/AlertsProPollService.php?method=getWarning&language=de&areaID=XXXAREAXXX';
                              
                              
                              /********************* Hier die Warnzellen-Id's eintragen *****************************/
                              var warncellid = ['UWZDE53879'];
                              /**************************************************************************************/
                              
                              createStates(numOfWarnings);
                              
                              setInterval(work,intervalMinutes * 60 * 1000);
                              work();
                              
                              var UWZTypesArray=["n/a","unbekannt","Sturm/Orkan","Schneefall","Starkregen","Extremfrost","Waldbrandgefahr","Gewitter","Glätte","Hitze","Glatteisregen","Bodenfrost"];
                              
                              function createStates(n){
                               var areaChannelId = null;
                              
                               for (var j=0; j<warncellid.length; j++) {
                                   areaChannelId=channelId+"."+warncellid[j];
                                   for (let i=0; i<n; i++) {
                                       createState(areaChannelId+".warning."+i+".ShortText","",forceInitStates,{type: 'string'});
                                       createState(areaChannelId+".warning."+i+".LongText","",forceInitStates,{type: 'string'});
                                       createState(areaChannelId+".warning."+i+".object","{}",forceInitStates,{type: 'object'});
                                       createState(areaChannelId+".warning."+i+".begin","",forceInitStates,{type: 'string'});
                                       createState(areaChannelId+".warning."+i+".end","",forceInitStates,{type: 'string'});
                                       createState(areaChannelId+".warning."+i+".severity",0,forceInitStates,{min:0, max:10, type: 'number'});
                                       createState(areaChannelId+".warning."+i+".type",0,forceInitStates,{min:0, max:11, type: 'number',states:{0:"n/a",1:"unbekannt",2:"Sturm/Orkan",3:"Schneefall",4:"Starkregen",5:"Extremfrost",6:"Waldbrandgefahr",7:"Gewitter",8:"Glätte",9:"Hitze",10:"Glatteisregen",11:"Bodenfrost"}});
                                       createState(areaChannelId+".warning."+i+".uwzLevel",0,forceInitStates,{min:0, max:5, type: 'number'});
                                       createState(areaChannelId+".warning."+i+".uwzColor",0,forceInitStates,{type:'number'});
                                       createState(areaChannelId+".warning."+i+".HTMLShort","",forceInitStates,{type: 'string'});
                                       createState(areaChannelId+".warning."+i+".HTMLLong","",forceInitStates,{type: 'string'});
                                   }
                               }
                              }
                              
                              function getUWZLevel (warnName){
                                 if(warnName != undefined){
                                     var result = -1; // -1 is an error!
                                     var alert = warnName.split("_");
                                     var colors = ["green","darkgreen","yellow","orange","red","violet"];
                                     
                                     if (alert[0]=="notice") { result = 1; }
                                     else if (alert[1] == "forewarn") { result = 2; }
                                     else {
                                         result = colors.indexOf(alert[2]);
                                     }
                                     return result;
                                 } else {
                                     return 0;
                                 }
                              }
                              
                              function getUWZUrgency (warnName){
                                 if(warnName != undefined){
                                     var result = 0;
                                     
                                     var alert = warnName.split("_");
                                     if (alert[1] == "forewarn") {
                                         result = 1;
                                     }
                                     else {
                                         result = 2; // immediate;
                                     }
                                     return result;
                                 } else {
                                     return 0;
                                 }
                              }
                              
                              function getLevelColor(uwzLevel,levelName) {
                                 if(levelName != undefined){
                                     var uwzColor = [
                                     0x00ff00, // 0 - Grün
                                     0x009b00, // 1 - Dunkelgrün
                                     0xffff00, // 2 - Gelb Wetterwarnungen (Stufe 1)
                                     0xffb400, // 3 - Orange Warnungen vor markantem Wetter (Stufe 2)
                                     0xff0000, // 4 - Rot Unwetterwarnungen (Stufe 3)
                                     0xff00ff, // 5 - Violett Warnungen vor extremem Unwetter (Stufe 4)
                                     ];
                                     if (uwzLevel>=0 && uwzLevel<=5){
                                         return uwzColor[uwzLevel];
                                     } else {
                                         return 0;
                                     }
                                 } else {
                                     return 0;
                                 }
                              }
                              
                              function createHTMLShort(theData,uwzColor,uwzUrgency,shortText){
                                 if(theData.type != undefined){
                                     var html = '<div style="background: #'+uwzColor.toString(16)+'" border:"10px">';
                                     html += '<h3>';
                                     if (uwzUrgency==1) html+="Vorwarnung vor "; else html+="Warnung vor ";
                                     html += UWZTypesArray[theData.type];
                                     html +="</h3>";
                                     html += "<p>Zeitraum von "+formatDate(new Date(theData.dtgStart*1000),"WW, DD. OO YYYY hh:mm")+" Uhr bis "+formatDate(new Date(theData.dtgEnd*1000),"WW, DD. OO YYYY hh:mm")+" Uhr </p>";
                                     html += '<p>'+shortText+'</p>';
                                     html += "</div>";
                                     return html;
                                 } else {
                                     return '';
                                 }
                              }
                              
                              function createHTMLLong(theData,uwzColor,uwzUrgency,longText){
                                 if(theData.type != undefined){
                                     var html = '<div style="background: #'+uwzColor.toString(16)+'" border:"10px">';
                                     html += '<h3>';
                                     if (uwzUrgency==1) html+="Vorwarnung vor "; else html+="Warnung vor ";
                                     html += UWZTypesArray[theData.type];
                                     html +="</h3>";
                                     html += "<p>Zeitraum von "+formatDate(new Date(theData.dtgStart*1000),"WW, DD. OO YYYY hh:mm")+" Uhr bis "+formatDate(new Date(theData.dtgEnd*1000),"WW, DD. OO YYYY hh:mm")+" Uhr </p>";
                                     html += '<p>'+longText+'</p>';
                                     html += "</div>";
                                     return html;
                                 } else {
                                     return '';
                                 }
                              }
                              
                              async function writeResultEntry(_warnObj,_i,_area) {
                                 let areaChannelId=channelId+"."+_area+".warning."+_i;
                                 
                                 var warnObjSting = JSON.stringify(_warnObj)|| '{}';
                                 var warnObj = JSON.parse(warnObjSting);
                                 
                                 var object = _warnObj != undefined ? _warnObj : Object({});
                                 var begin = _warnObj != undefined ? formatDate(new Date(warnObj.dtgStart*1000),"DD.MM.YYYY hh:mm") : "";
                                 var end = _warnObj != undefined ? formatDate(new Date(warnObj.dtgEnd*1000),"DD.MM.YYYY hh:mm") : "";
                                 var longText = _warnObj != undefined ? warnObj.payload.translationsLongText.DE : "";
                                 var shortText = _warnObj != undefined ? warnObj.payload.translationsShortText.DE : ""; 
                                 var severity = warnObj.severity || 0;
                                 var type = warnObj.type || 0;
                                 var uwzLevel = _warnObj != undefined ? getUWZLevel(warnObj.payload.levelName) : getUWZLevel(undefined);
                                 var uwzUrgency = _warnObj != undefined ? getUWZUrgency(warnObj.payload.levelName) : getUWZUrgency(undefined);
                                 var uwzColor = _warnObj != undefined ? getLevelColor(uwzLevel,warnObj.payload.levelName):  getLevelColor(uwzLevel,undefined) ;
                                 var htmlShort = createHTMLShort(warnObj,uwzColor,uwzUrgency,shortText);
                                 var htmlLong  = createHTMLLong(warnObj,uwzColor,uwzUrgency,longText);
                              
                                 var oldObject = (await getStateAsync(areaChannelId+".object")).val;
                              
                                 if(JSON.stringify(object) != JSON.stringify(oldObject)){
                                     setState(areaChannelId+".LongText",longText);
                                     setState(areaChannelId+".ShortText",shortText);
                                     setState(areaChannelId+".object",object);
                                     setState(areaChannelId+".begin",begin)
                                     setState(areaChannelId+".end",end);
                                     setState(areaChannelId+".severity",severity);
                                     setState(areaChannelId+".type",type);
                                     setState(areaChannelId+".uwzLevel",uwzLevel);
                                     setState(areaChannelId+".uwzColor",uwzColor);
                                     setState(areaChannelId+".HTMLShort",htmlShort);
                                     setState(areaChannelId+".HTMLLong",htmlLong);
                                 } else {
                                     dwmlog('Datensatz '+_i+' ist schon vorhanden',4);
                                 }
                                 
                              }
                              
                              function processData(area, thedata) {
                                 if (!thedata) {
                                     return;
                                 }
                              
                                 var jsonResults= [];
                                 if (thedata.results.length>0) {
                                     for (let i=0; i<thedata.results.length; i++) {
                                         jsonResults.push(thedata.results[i]);
                                     }
                                 }
                              
                                 jsonResults.sort(function(a,b){
                                     var asort = a.severity;
                                     var bsort = b.severity;
                                     return bsort-asort;
                                 });
                              
                                 dwmlog(JSON.stringify(jsonResults),2);
                                 for (let i=0; i<numOfWarnings; i++) {
                                     if (i<jsonResults.length) {
                                         //console.log(i+' -> mit Result'); 
                                         writeResultEntry(jsonResults[i],i,area);
                                     } else {
                                         //console.log(i+' -> ohne Result'); 
                                         writeResultEntry(undefined,i,area);
                                     }
                                 }
                              }
                              
                              function getAreaFromURI(uri) {
                               var searchstr = "&areaID=";
                               var n = uri.search(searchstr);
                               var result = uri.slice(n+searchstr.length,uri.length);
                               return result;
                              }
                              
                              async function work() {
                                 for (var i=0; i<warncellid.length; i++) {
                                     await axios.get(url.replace("XXXAREAXXX",warncellid[i]))
                                     .then(results => {
                                         dwmlog("AREA: "+warncellid[i],4);
                                         dwmlog("UWZ Body: " + JSON.stringify(results.data),4);
                                         dwmlog("Status: " + results.status,4);
                                         if (results.status == 200) {
                                             processData(getAreaFromURI(results.config.url),results.data);
                                         } else {
                                             dwmlog('Keine Daten empfangen',1);
                                         }
                                     })
                                     .catch(error => {
                                         if (error.response.status == 404){
                                             dwmlog(error.message, 1);
                                         } else {
                                             dwmlog(error.response.data, 1);
                                             dwmlog(error.response.status, 1);
                                             dwmlog(error.response.headers, 1);
                                         }
                                     })            
                                 }
                              }
                              
                              function dwmlog( message, level, channel) {
                               if (channel === undefined) {
                                   channel = debugchannel;
                               }
                               if (level === undefined)
                               {
                                   level = debuglevel;
                               }
                               if ( debuglevel >= level ) {
                                   log (message, channel );
                               }
                              }
                              

                              const axios = require('axios');
                              
                              var debuglevel = 1;
                              var debugchannel = 'info';
                              
                              var channelId = '0_userdata.0.DWD.'+instance+'.warning';
                              
                              var intervalMinutes = 5;
                              var forceInitStates = false;
                              var numOfWarnings = 5;
                              
                              var url='https://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json';
                              
                              /********************* Hier die Warnzellen-Id's eintragen *****************************/
                              const warncellid = ['105366000'];
                              const land = 'nrw';
                              /**************************************************************************************/
                              
                              createStates(numOfWarnings);
                              
                              setInterval(work,intervalMinutes * 60 * 1000);
                              work();
                              
                              
                              
                              function createStates(anz){
                                 for (let i=0; i<anz; i++) {
                                         if(i==0){
                                             var baseChannelId = channelId;
                                         } else {
                                             var baseChannelId = channelId+i;
                                         } 
                                         createState(baseChannelId+".begin","",forceInitStates,{name: "Warning begin",type: "number",role: "value.time",read: true,write: true});
                                         createState(baseChannelId+".description","",forceInitStates,{name: "Warning description",type: "string",role: "weather.state",read: true,write: true});
                                         createState(baseChannelId+".end","",forceInitStates,{name: "Warning end",type: "number",role: "value.time",read: true,write: true});
                                         createState(baseChannelId+".headline","",forceInitStates,{name: "Warning description",type: "string",role: "weather.state",read: true,write: true});
                                         createState(baseChannelId+".level",0,forceInitStates,{name: "Warning level",type: "number",role: "value.warning",read: true,write: true,states: {1: "Preliminary info",2: "Minor",3: "Moderate",4: "Severe",5: "Extreme"}});
                                         createState(baseChannelId+".map","",forceInitStates,{name: "Link to chart",type: "string",role: "weather.chart.url",read: true,write: true});
                                         createState(baseChannelId+".object","",forceInitStates,{name: "JSON object with warning",type: "object",role: "weather.json",read: true,write: true});
                                         createState(baseChannelId+".severity",0,forceInitStates,{name: "Warning severity",type: "number",role: "value.severity",read: true,write: true,states: {0: "None",1: "Minor",2: "Moderate",3: "Severe",4: "Extreme",9: "Heat Warning",11: "No Warning",19: "UV Warning",49: "Strong Heat",50: "Extreme Heat"}});
                                         createState(baseChannelId+".text","",forceInitStates,{name: "Warning text",type: "string",role: "weather.title.short",read: true,write: true});
                                         createState(baseChannelId+".type",0,forceInitStates,{name: "Warning type",type: "number",role: "weather.type",read: true,write: true,states: {0: "Thunderstorm",1: "Wind/Storm",2: "Rain",3: "Snow",4: "Fog",5: "Frost",6: "Ice",7: "Thawing",8: "Heat",9: "UV warning"}});  
                                 }
                               
                              }
                              
                              async function writeResultEntry(_warnObj,_i) {
                                 
                                 if(_i==0){
                                     var baseChannelId = channelId;
                                 } else {
                                     var baseChannelId = channelId+_i;
                                 }
                                  
                                 const maps = ['gewitter', 'sturm', 'regen', 'schnee', 'nebel', 'frost', 'glatteis', 'tauwetter', 'hitze', 'uv'];
                                 var warnObj = _warnObj || '{}';
                                 
                                 warnObj = JSON.parse(warnObj);
                                 var begin=warnObj.start || Number("");
                                 var description=warnObj.description || '';
                                 var end=warnObj.end || Number("");
                                 var headline=warnObj.headline || '';
                                 var level = warnObj.level === undefined || warnObj.level === null ? null : parseInt(warnObj.level, 10);
                                 var object = warnObj;
                                 var severity = warnObj.level > 1 ? warnObj.level - 1 : 0;
                                 var text=warnObj.event || '';
                                 var type = warnObj.type  === undefined || warnObj.type  === null ? null : parseInt(warnObj.type, 10);
                                 if (warnObj.type !== undefined && warnObj.type !== null) {
                                     var map = 'https://www.dwd.de/DWD/warnungen/warnapp_gemeinden/json/warnungen_gemeinde_map_'+land+'_'+maps[warnObj.type]+'.png';
                                 } else {
                                     var map ='';
                                 }
                                 
                                 var oldObject = (await getStateAsync(baseChannelId+".object")).val;
                              
                                 if(JSON.stringify(object) != JSON.stringify(oldObject)){
                                     setState(baseChannelId+".begin",begin);
                                     setState(baseChannelId+".description",description);
                                     setState(baseChannelId+".end",end);
                                     setState(baseChannelId+".headline",headline);
                                     setState(baseChannelId+".level",Number(level));
                                     setState(baseChannelId+".map",map);
                                     setState(baseChannelId+".object",object);
                                     setState(baseChannelId+".severity",severity);
                                     setState(baseChannelId+".text",text);
                                     setState(baseChannelId+".type",Number(type));
                                 } else {
                                     dwmlog('Datensatz '+_i+' ist schon vorhanden',4);
                                 }
                              }
                              
                              function processData(area, thedata) {
                                 if (!thedata) {
                                     return;
                                 }
                                 var jsonString = String(thedata);
                                 var newString = jsonString.replace('warnWetter.loadWarnings(','');
                                 newString = newString.replace(');','');
                                 var newJSON = JSON.parse(newString);
                                 
                                 var jsonResults = [];
                                 if (newJSON.warnings.hasOwnProperty(area)) {
                                     var anz = newJSON.warnings[area].length;
                                     for(var i=0;i<anz;i++){
                                         jsonResults.push(JSON.stringify(newJSON.warnings[area][i]));
                                     }
                                 } 
                              
                                 dwmlog(JSON.stringify(jsonResults),2);
                                 for (let i=0; i<numOfWarnings; i++) {
                                     if (i<jsonResults.length) {
                                         //console.log(i+' -> mit Result'); 
                                         writeResultEntry(jsonResults[i],i);
                                     } else {
                                         //console.log(i+' -> ohne Result'); 
                                         writeResultEntry(undefined,i);
                                     }
                                 }
                                 
                              }
                                
                              async function work() {
                                 for (var i=0; i<warncellid.length; i++) {
                                     await axios.get(url)
                                     .then(results => {
                                         dwmlog("AREA: "+warncellid[i],4);
                                         dwmlog("UWZ Body: " + JSON.stringify(results.data),4);
                                         dwmlog("Status: " + results.status,4);
                                         if (results.status == 200) {
                                             processData(+warncellid[i],results.data);
                                         } else {
                                             dwmlog('Keine Daten empfangen',1);
                                         }
                                     })
                                     .catch(error => {
                                         if (error.response.status == 404){
                                             dwmlog(error.message, 1);
                                         } else {
                                             dwmlog(error.response.data, 1);
                                             dwmlog(error.response.status, 1);
                                             dwmlog(error.response.headers, 1);
                                         }
                                     })            
                                 }
                              }
                              
                              function dwmlog( message, level, channel) {
                                 if (channel === undefined) {
                                     channel = debugchannel;
                                 }
                                 if (level === undefined) {
                                     level = debuglevel;
                                 }
                                 if ( debuglevel >= level ) {
                                     log (message, channel );
                                 }
                              }
                              

                              T Do not disturb
                              T Do not disturb
                              ticaki
                              wrote on last edited by
                              #696

                              @megawaldi
                              Das DWD Script schaue ich mir an, aber das UWZ ist im Grunde das selbe wie meines.

                              Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                              Spenden

                              M 1 Reply Last reply
                              0
                              • T ticaki

                                @megawaldi
                                Das DWD Script schaue ich mir an, aber das UWZ ist im Grunde das selbe wie meines.

                                M Offline
                                M Offline
                                Megawaldi
                                wrote on last edited by
                                #697

                                @ticaki
                                Ja klar, deins war ja die Vorlage.
                                Ich hab das umwandeln in ein Object vor dem schreiben rausgenommen. Denke das wird etwas RAM sparen und performanter sein.
                                Dann schreibe ich nur in die Datenpunkte, bei einer tatsächlichen Änderung. Das müsste IO einsparen, was bei speicherkarten nicht dumm ist.

                                T 1 Reply Last reply
                                0
                                • M Megawaldi

                                  @ticaki
                                  Ja klar, deins war ja die Vorlage.
                                  Ich hab das umwandeln in ein Object vor dem schreiben rausgenommen. Denke das wird etwas RAM sparen und performanter sein.
                                  Dann schreibe ich nur in die Datenpunkte, bei einer tatsächlichen Änderung. Das müsste IO einsparen, was bei speicherkarten nicht dumm ist.

                                  T Do not disturb
                                  T Do not disturb
                                  ticaki
                                  wrote on last edited by ticaki
                                  #698

                                  @megawaldi
                                  Gute Idee, werde es mir nächstes Wochenende ansehen. Hab dieses keine Zeit. :)

                                  EDIT: Hab ich die Erlaubnis das in mein großes Skript einzubauen?

                                  Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                                  Spenden

                                  M 1 Reply Last reply
                                  0
                                  • T ticaki

                                    @megawaldi
                                    Gute Idee, werde es mir nächstes Wochenende ansehen. Hab dieses keine Zeit. :)

                                    EDIT: Hab ich die Erlaubnis das in mein großes Skript einzubauen?

                                    M Offline
                                    M Offline
                                    Megawaldi
                                    wrote on last edited by
                                    #699

                                    @ticaki
                                    Klar. Gib dann mal ne Rückmeldung

                                    T 2 Replies Last reply
                                    0
                                    • M Megawaldi

                                      @ticaki
                                      Klar. Gib dann mal ne Rückmeldung

                                      T Do not disturb
                                      T Do not disturb
                                      ticaki
                                      wrote on last edited by
                                      #700

                                      @megawaldi
                                      Edit gelesen?

                                      Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                                      Spenden

                                      M 1 Reply Last reply
                                      0
                                      • T ticaki

                                        @megawaldi
                                        Edit gelesen?

                                        M Offline
                                        M Offline
                                        Megawaldi
                                        wrote on last edited by
                                        #701

                                        @ticaki
                                        Klar mach nur, ein großes Script das alles macht hab ich mir auch schon überlegt. Würde auch das mit den doppelten Datenpunkten in den einzelnen Scripten und dann nochmal in deinem Script lösen.
                                        War mir nur zu stressig das selber umzusetzen ;-)

                                        1 Reply Last reply
                                        0
                                        • T Do not disturb
                                          T Do not disturb
                                          ticaki
                                          wrote on last edited by ticaki
                                          #702

                                          Hab an dem DWD Standalone Skript etwas gewerkelt, könnt ihr ja mal testen. Die Warnungen beim Erstellen der States werde ich wohl auch noch verstehen und demnächst beheben können.

                                          DWD Adapterersatz Beta

                                          EDIT war noch ein Fehler drin, hab ihn ohne Anmerkung behoben

                                          Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                                          Spenden

                                          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

                                          674

                                          Online

                                          32.6k

                                          Users

                                          82.3k

                                          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