Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [Script] DWD/UWZ/NINA Warnungen als Push/Sprachnachrichten

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

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

    This topic has been deleted. Only users with topic management privileges can see it.
    • sigi234
      sigi234 Forum Testing Most Active @ticaki last edited by

      @ticaki sagte in [Script] DWD/UWZ Warnungen als Pushnachrichten:

      Danke für den Hinweis. Ist das 05.03. ohne Jahr?

      Ja

      1 Reply Last reply Reply Quote 0
      • T
        ticaki Developer @Latzi last edited by ticaki

        @Latzi sagte in [Script] DWD/UWZ Warnungen als Pushnachrichten:

        @ticaki
        Ist die Version 0.90.1 schon verwendbar oder arbeitest du noch dran?

        Es sollte vom Funktionsumfang her fertig sein, und soweit ich es testen konnte arbeitet so wie es soll. Liegen aber zur Zeit nicht viele Warnungen vor. Hab heute noch keine bekommen und das stimmt aktuell auch mit der Warnlage von DWD überein. UWZ hat nur eine über Regen drin seit gestern drin. l/m muß ich auch noch in liter pro Quadratmeter ändern.

        @sigi234
        ok
        TODO:

        • l/m in Liter pro Quadratmeter
        • dd.mm. in Tag Monatsname

        @all
        Hab im Moment eine Testfunktion drin die bei dem Senden von Ww? oder Wetterwarnung? über Telegramm das versenden von Nachrichten über Telegramm auslöst. Soll ich das drin lassen?

        1 Reply Last reply Reply Quote 0
        • sigi234
          sigi234 Forum Testing Most Active @ticaki last edited by

          @ticaki

          Test Sayit:

          sayit.0	2020-03-05 14:46:16.922	error	(15156) Cannot get file: received file is too short
          sayit.0	2020-03-05 14:46:16.797	info	(15156) saying: Achtung Unwetter Warnung der Unwetterzentrale vor Schneefall gültig vom 05 März 13:00 Uhr, bis 06 März 16:00 Uhr. Unwetterwarnung der Stufe Orange vor Starkschneefall mit mehr als 1
          sayit.0	2020-03-05 14:46:15.742	info	(15156) saying: C:\Program Files\iobroker\Test\node_modules\iobroker.sayit/gong.mp3
          
          T 1 Reply Last reply Reply Quote 0
          • T
            ticaki Developer @sigi234 last edited by ticaki

            @sigi234
            War der Text im SayIt Datenpunkt auch so abgeschnitten?

            sigi234 1 Reply Last reply Reply Quote 0
            • sigi234
              sigi234 Forum Testing Most Active @ticaki last edited by

              @ticaki sagte in [Script] DWD/UWZ Warnungen als Pushnachrichten:

              @sigi234
              War der Text im SayIt Datenpunkt auch so abgeschnitten?

              60;Achtung Unwetter Warnung der Unwetterzentrale vor Schneefall gültig vom 05 März  13:00 Uhr, bis 06 März  16:00 Uhr. Unwetterwarnung der Stufe Orange vor Starkschneefall mit mehr als 15 cm im Zeitraum von 12 Stunden, gültig von Donnerstag, 05.03. 13:00 Uhr bis Freitag, 06.03. 16:00 Uhr.  .   Insgesamt eine aktive Warnung.
              
              1 Reply Last reply Reply Quote 0
              • sigi234
                sigi234 Forum Testing Most Active @ticaki last edited by sigi234

                @ticaki

                Arbeite gerade an einer View, möchte einfach umschalten von UWZ to DWD
                Denke das geht nur mit einen 2. Skript und einer 2.View

                Screenshot (1909).png

                1 Reply Last reply Reply Quote 0
                • T
                  ticaki Developer last edited by

                  zu dem Fehler. Ich weiß nicht wie ich das beheben kann, da ist anscheinend bei SayIt was schief gelaufen. (denke ich)

                  Zu deiner 2. Frage:

                  Du möchtest im laufenden Betrieb von DWD auf UWZ umschalten?

                  sigi234 1 Reply Last reply Reply Quote 0
                  • sigi234
                    sigi234 Forum Testing Most Active @ticaki last edited by

                    @ticaki sagte in [Script] DWD/UWZ Warnungen als Pushnachrichten:

                    Du möchtest im laufenden Betrieb von DWD auf UWZ umschalten?

                    Jupp

                    T 1 Reply Last reply Reply Quote 0
                    • T
                      ticaki Developer @sigi234 last edited by

                      @sigi234
                      Ok ich überlege mir was

                      1 Reply Last reply Reply Quote 0
                      • T
                        ticaki Developer last edited by ticaki

                        Hab was, aber noch nicht getestet.
                        Ich baue einen State ein über den du den Mode einstellen kannst. Anschließend startet das Skript neu... Damit könnte ich auch den manuellen Restart raus bekommen beim ersten Start.

                        Wie wäre es, wenn man den Punkt Pushdienst auch über States einstellen könnte? Im Skript stellt man erlaubtes ein und das wird mit den States gegen geprüft. Der Automatikmodus würde da auch Sinn machen.

                        1 Reply Last reply Reply Quote 0
                        • T
                          ticaki Developer last edited by ticaki

                          Neue Version im Testordner.

                          dwd_uwz_script_iobroker.js

                          Vorweg bitte alte States löschen, hab Command in command umbenannt.

                          Was kann die neue Version von "test/dwd_uwz_script_iobroker.js":

                          • Autorestart nach Erstellung der States (restart ca. 1,5 sekunden offline)
                          • Mode lässt sich über State ändern ohne restart
                          • Mode kann 'UWZDWD' 'DWDUWZ enthalten
                          • Automode lässt sich über State ein/ausschalten
                          • Automode Pushdienste sind über States einstellbar (nur im Rahmen der Grundkonfiguration)
                          • Emails sind jetzt html mit Farbe ( Wenn da jemand was schöneres hat, her damit 🙂 )
                          • gibt ne alive anzeige, die stimmt aber natürlich nur, wenn das script oder die scripteditor instanz nicht abstürzt
                          • die Telegram Ww? Wetterwarnungen? ist mit drin. wenns stört kommts wieder raus.
                          • Sprachausgabe 21.03. / 03.03. / l/m werden richtig ausgegeben
                          • hab die kleine aber nervige Pause zwischen "60 km/h .... und 70 km/h ... bla bla" behoben
                          • .alert in .alert.dwd und .alert.uwz aufgeteilt
                          • uwz/dwd level sind jetzt vergleichbar

                          bis v0.93.1

                          • alert. start umbenannt in begin / Beschreibung, Schlagzeile und Warnlevel abhängige Farbnummer (bgcolor) hinzugefügt
                          • duplicate filtern. (konfigurierbar) hatte heute 2 Meldungen wobei eine die andere zeitlich überdeckte und der rest war identisch
                          • code umsortiert
                          • Fehler in alert. behoben, der war aber lange drin (fehlender . )
                          • Sprachausgabe: Wartezeit ist konfigurierbar in ms pro Zeichen die Rechnung für Alexa 85ms * Textlänge + 2 Sekunden(für den Gong)

                          bis v0.93.5

                          • kosmetische Korrektur
                          • Aufgehoben Mitteilung korrigiert von "Die Wetterwarnung'Warnung vor Starkregen" zu "Die Wetterwarnung des DWD 'Warnung vor...'
                          • Kleinen Fehler mit großer Wirkung behoben.

                          v0.94.1 ist aktuell

                          1 Reply Last reply Reply Quote 1
                          • T
                            ticaki Developer last edited by

                            Hab jetzt ordentlich mit DWD email/telegram/echo getestet und ne ganze Menge Kleinigkeiten richten müssen.

                            Die v0.94.2 ist ok. Kann jemand mit pushover, ioGo und SayIt das mal testen.

                            Das hier ist der Werbetext zu dem Script:

                            Unterstützt:

                            • Telegram, Pushover, Home24-Mediaplayer, SayIt, Alexa, Datenpunkt, eMail oder ioGo
                            • DWD-Adapter & Unwetterzentrale-Script
                            • Wetterwarnung
                            • Wetterentwarnung

                            Funktionen:

                            • Filter die Warnungen nach doppelt, Gefahr(level) und Höhe
                            • Umschalten über iobroker zwischen DWD und UWZ oder beides
                            • Autorestart bei Datenpunkterstellung
                            • Automatischer Versand und/oder manueller Nachrichtenversand
                            • Zeitschaltuhr für Sprachausgabe
                            • Datenpunkte mit der Startzeit, Endzeit, Type, Schlagzeile, Beschreibung, Farbe für Level(bgcolor) und höchstem Warnlevel dieses Typs
                            • Unterstützung für 0_userdata
                            • Datenpunkthauptpfade sind konfigurierbar incl. 0_userdata
                            • Konfigurationsprüfung soweit möglich
                            • Automodus und einzelne Pushdienste über iobroker schaltbar (hat nicht mit manuellem Versand zu tun)
                            • Optimierte Sprachausgabe
                            • Fingerweg vom .alive state 🙂

                            Kleinkram:

                            • Sprachausgabe: Sturmdetails werden ausgefiltert oder korrekt ausgesprochen (konfigurierbar)
                            • Sprachausgabe: Pause zwischen dem Absenden der einzelnen Warnungen an die Wiedergabeeinheit konfigurierbar.
                            • Manuelle Sprachnachrichten können die Zeitschaltuhr missachten. (konfigurierbar)
                            • Multi-User/Device bei fast allen Pushdiensten verfügbar (außer Datenpunkt & pushover)
                            • Alexa und SayIt mit Lautstärkeeinstellung. Alexagruppen unterstützen keine Lautstärke trotzdem konfigurieren.
                            • Zusätzliche Hervorhebung konfigurierbar über warnlevel (im Betreff/Ansage)
                            Latzi 1 Reply Last reply Reply Quote 0
                            • Latzi
                              Latzi @ticaki last edited by

                              @ticaki im Verzeichnis test ist noch die Version 0.94.0, ist das die Richtige?

                              1 Reply Last reply Reply Quote 0
                              • T
                                ticaki Developer last edited by

                                Nein... und das Äffchen drückt das Knöpfchen jetzt ist sie da

                                Danke 🙂

                                Latzi 1 Reply Last reply Reply Quote 1
                                • Latzi
                                  Latzi @ticaki last edited by

                                  @ticaki 👍 läuft 👍
                                  Etwas für die nächste Version: Bei mir kommt bei telegram "Alle Wetterwarnungenwurden aufgehoben", bitte ein Leerzeichen einfügen -> "Alle Wetterwarnungen wurden aufgehoben"

                                  T 1 Reply Last reply Reply Quote 0
                                  • T
                                    ticaki Developer @Latzi last edited by ticaki

                                    @Latzi
                                    .... ups

                                    Latzi 1 Reply Last reply Reply Quote 0
                                    • Latzi
                                      Latzi @ticaki last edited by

                                      @ticaki ja, UWZ und regionName ist konfiguriert (UWZ-Nummer und Ort), muss ich sonst noch was angeben? Der Ort kommt bei mir weder bei Alexa noch Telegram an.

                                      1 Reply Last reply Reply Quote 0
                                      • T
                                        ticaki Developer last edited by ticaki

                                        Ah ich lag falsch, manuell angestoßen und keinen Mode den er finden kann, ist behoben. Hab die Verionsnummer aber nicht angehoben.

                                        Ich kann bei "Alle Warnungen wurden aufgehoben" keinen Ort oder DWD/UWZ ausgeben.

                                        Diese Infos werden in der Warnung gespeichert und wenn alle Warnungen aufgehoben werden, könnte ich darauf noch zugriff bekommen, jedoch wenn du manuell anfragst weiß das Skript nur noch das es keine Warnungen gibt. Für DWD/UWZ schaut das Skript nach ob es Infos gibt.

                                        Vielleicht auch noch folgendes: Im Skript selbst gibt es keine Trennung zwischen DWD/UWZ wenn beides aktiv ist und beides 2 Warnungen hat, hast du 4 Warnungen in den mal "des DWD" und mal "der Unwetterzentrale" steht.

                                        Jetzt 16:30 ist das mit ' ' erst behoben, schon wieder nicht aufs knöpfchen gedrückt.

                                        C 1 Reply Last reply Reply Quote 0
                                        • C
                                          CruziX @ticaki last edited by

                                          @ticaki Ist das Skript für Nina funktionsfähig?
                                          Merke gerade, DWD hat keine Warnung, obwohl es den ganzen Tag regnet und Nina meldet gerade hochwasser ^^

                                          Wie geht das eig mit UWZ, muss ich das einfach im Skript aktivieren? Finde dazu keinen Adapter

                                          T 1 Reply Last reply Reply Quote 0
                                          • T
                                            ticaki Developer @CruziX last edited by ticaki

                                            @CruziX
                                            Es hat funktioniert, aber da ich kaum Warnungen zum testen hatte, hab ich das erstmal zur Seite gestellt. Ich baue das in nächster Zeit fertig für den Github Nina Adapter.

                                            var debuglevel = 1;
                                            var debugchannel = 'info';
                                            
                                            function dwmlog( message, level, channel) {
                                               if (typeof channel === 'undefined') {
                                                   channel = debugchannel;
                                               }
                                               if ( typeof level === 'undefined')
                                               {
                                                   level = debuglevel;
                                               }
                                               if ( debuglevel >= level ) {
                                                   log (message, channel );
                                               }
                                            }
                                            
                                            var AdapterId = "javascript."+instance;
                                            var ChannelId = "UWZ";
                                            
                                            var forceInitStates = false;
                                            var numOfWarnings = 7;
                                            
                                            var url='http://feed.alertspro.meteogroup.com/AlertsPro/AlertsProPollService.php?method=getWarning&language=de&areaID=XXXAREAXXX';
                                            
                                            
                                            /********************* Hier die Warnzellen-Id's eintragen *****************************/
                                            var warncellid = ['UWZXXXXXXX'];
                                            /**************************************************************************************/
                                            
                                            
                                            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 (var 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: 'string'});
                                                       createState(AreaChannelId+".warning."+i+".begin","",forceInitStates,{type: 'string'});
                                                       createState(AreaChannelId+".warning."+i+".end","",forceInitStates,{type: 'string'});
                                                       createState(AreaChannelId+".warning."+i+".severity",0,forceInitStates,{type: 'number'});
                                                       createState(AreaChannelId+".warning."+i+".type",0,forceInitStates,{min:0, max:11, type: 'number',states:UWZTypesArray});
                                                       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){
                                               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;
                                            }
                                            
                                            function getUWZUrgency (warnName){
                                               var result = 0;
                                            
                                               var alert = warnName.split("_");
                                               if (alert[1] == "forewarn") {
                                                   result = 1;
                                               }
                                               else {
                                                   result = 2; // immediate;
                                               }
                                               return result;
                                            }
                                            
                                            function getLevelColor(uwzLevel) {
                                               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;
                                            }
                                            
                                            function createHTMLShort(w){
                                               var html = '<div style="background: #'+w.uwzColor.toString(16)+'" border:"10px">';
                                            
                                               var theData = JSON.parse(w.object);
                                            
                                               html += '<h3>';
                                               if (w.uwzUrgency==1) html+="Vorwarnung vor "; else html+="Warnung vor ";
                                               html += UWZTypesArray[w.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>'+w.ShortText+'</p>';
                                               html += "</div>";
                                               return html;
                                            }
                                            
                                            function createHTMLLong(w){
                                               var html = '<div style="background: #'+w.uwzColor.toString(16)+'" border:"10px">';
                                            
                                               var theData = JSON.parse(w.object);
                                            
                                               html += '<h3>';
                                               if (w.uwzUrgency==1) html+="Vorwarnung vor "; else html+="Warnung vor ";
                                               html += UWZTypesArray[w.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>'+w.LongText+'</p>';
                                               html += "</div>";
                                               return html;
                                            }
                                            
                                            function processResultEntry(w) {
                                               this.object = JSON.stringify(w);
                                            
                                               this.begin=formatDate(new Date(w.dtgStart*1000),"DD.MM.YYYY hh:mm");
                                               this.end=formatDate(new Date(w.dtgEnd*1000),"DD.MM.YYYY hh:mm");
                                            
                                               // dwmlog (formatDate(this.begin,"DD.MM.YYYY hh:mm"),4);
                                               // dwmlog (formatDate(this.end,"DD.MM.YYYY hh:mm"),4);
                                            
                                               this.LongText = w.payload.translationsLongText.DE;
                                               this.ShortText = w.payload.translationsShortText.DE;
                                            
                                               this.severity = w.severity;
                                               this.type = w.type;
                                               this.uwzLevel = getUWZLevel(w.payload.levelName);
                                               this.uwzUrgency = getUWZUrgency(w.payload.levelName);
                                               this.uwzColor = getLevelColor(this.uwzLevel);
                                               var x = this;
                                               this.HTMLShort = createHTMLShort(x);
                                               this.HTMLLong  = createHTMLLong(x);
                                            }
                                            
                                            function processData(Area,data) {
                                               if (!data) {
                                                  return;
                                               }
                                               var AreaChannelId=ChannelId+"."+Area;
                                            
                                               var thedata = JSON.parse(data);
                                               var warnings= [];
                                            
                                               if (thedata.results.length>0) {
                                                   for (i=0; i<thedata.results.length; i++) {
                                                       warnings.push(new processResultEntry(thedata.results[i]));
                                                   }
                                               }
                                            
                                               warnings.sort(function(a,b){
                                                   var asort = a.severity;
                                                   var bsort = b.severity;
                                            
                                                   return bsort-asort;
                                               });
                                            
                                            
                                               dwmlog(JSON.stringify(warnings));
                                            
                                               for (i=0; i<numOfWarnings; i++) {
                                                   if (i<warnings.length) {
                                                       setState(AreaChannelId+".warning."+i+".LongText",warnings[i].LongText);
                                                       setState(AreaChannelId+".warning."+i+".ShortText",warnings[i].ShortText);
                                                       setState(AreaChannelId+".warning."+i+".object",warnings[i].object);
                                                       setState(AreaChannelId+".warning."+i+".begin",warnings[i].begin);
                                                       setState(AreaChannelId+".warning."+i+".end",warnings[i].end);
                                                       setState(AreaChannelId+".warning."+i+".severity",warnings[i].severity);
                                                       setState(AreaChannelId+".warning."+i+".type",warnings[i].type);
                                                       setState(AreaChannelId+".warning."+i+".uwzLevel",warnings[i].uwzLevel);
                                                       setState(AreaChannelId+".warning."+i+".uwzColor",warnings[i].uwzColor);
                                                       setState(AreaChannelId+".warning."+i+".HTMLShort",warnings[i].HTMLShort);
                                                       setState(AreaChannelId+".warning."+i+".HTMLLong",warnings[i].HTMLLong);
                                                   } else {
                                                       setState(AreaChannelId+".warning."+i+".LongText","");
                                                       setState(AreaChannelId+".warning."+i+".ShortText","");
                                                       setState(AreaChannelId+".warning."+i+".object","{}");
                                                       setState(AreaChannelId+".warning."+i+".begin","");
                                                       setState(AreaChannelId+".warning."+i+".end","");
                                                       setState(AreaChannelId+".warning."+i+".severity",0);
                                                       setState(AreaChannelId+".warning."+i+".type",0);
                                                       setState(AreaChannelId+".warning."+i+".uwzLevel",0);
                                                       setState(AreaChannelId+".warning."+i+".uwzColor",0);
                                                       setState(AreaChannelId+".warning."+i+".HTMLShort","");
                                                       setState(AreaChannelId+".warning."+i+".HTMLLong","");
                                                 }
                                               }
                                            }
                                            
                                            function getAreaFromURI(uri) {
                                               var searchstr = "&areaID=";
                                               var n = uri.search(searchstr);
                                               var result = uri.slice(n+searchstr.length,uri.length);
                                               return result;
                                            }
                                            
                                            createStates(numOfWarnings);
                                            // processData(jsond2);
                                            
                                            var request = require('request');
                                            schedule ("* * * * *", function(){
                                               for (var i=0; i<warncellid.length; i++) {
                                                       request({
                                                           uri: url.replace("XXXAREAXXX",warncellid[i]),
                                                           method: "GET",
                                                           timeout: 10000,
                                                           followRedirect: true,
                                                           maxRedirects: 10
                                                       }, function(error, response, body) {
                                                           // dwmlog("UWZ Error" + error,2);
                                                           // dwmlog("UWZ Response: " + JSON.stringify(response),4);
                                                           dwmlog("AREA: "+getAreaFromURI(response.request.uri.href),4);
                                                           dwmlog("UWZ Body: " + body,4);
                                                           if (response.statusCode == 200) {
                                                               processData(getAreaFromURI(response.request.uri.href),body);
                                                           }
                                                       });
                                               }
                                            });
                                            
                                            

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            589
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

                                            53
                                            1521
                                            465975
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo