Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Fehler im Script

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Fehler im Script

    This topic has been deleted. Only users with topic management privileges can see it.
    • Chaot
      Chaot last edited by

      Ich habe ein Script vor einiger Zeit erstellt. Aber seit ein Bekannter von mir das verändert hat während ich weg war hat das Ding einen Fehler, den ich nicht richtig zuordnen kann.
      Es wäre nett wenn mir da jemand etwas zur Hand gehen könnte.
      Die Fehlermeldung:

      
      javascript.0 2024-07-07 10:24:14.691	error	at processImmediate (node:internal/timers:478:21)
      javascript.0 2024-07-07 10:24:14.691	error	at Immediate._onImmediate (/opt/iobroker/node_modules/@iobroker/js-controller-adapter/src/lib/adapter/adapter.ts:11200:62)
      javascript.0 2024-07-07 10:24:14.691	error	at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/main.js:644:29)
      javascript.0 2024-07-07 10:24:14.690	error	at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1427:38)
      javascript.0 2024-07-07 10:24:14.690	error	at Object.<anonymous> (script.js.Klingel.Klingelsequenz:32:26)
      javascript.0 2024-07-07 10:24:14.689	error	at ErstelleBildsequenz (script.js.Klingel.Klingelsequenz:39:5)
      javascript.0 2024-07-07 10:24:14.676	error	Error in callback: ReferenceError: request is not defined
      

      Das Script

      // Klingelscript
      // mit Alexa Routinenaufruf, Bilder erfassen, Versand an 2 Empfänger
      // Stand 06-2023
      
      const debug = false;
      //const cam_img = "http://192.168.xxxx:1984/api/frame.jpeg?src=door";
      const cam_img = "http://192.168.xxxx:8095/192_168_8_90_80"
      const img_path = '/opt/iobroker/iobroker-data/files/0_userdata.0';
      
      const fs = require('fs');
      
      var BildSequenz = 0;        // Sequenznummer 0:Bereit, 1: (0s) Bild1+Mail, 2: (+5s) Bild2+Mail, 3: (+10s) Bild3, 4: (+10s) Bild4
      var TBildsequenz = null;    // Timer-Objekt für die Bildsequenz
      var TVis = null;            // Timer um VIS umzuschalten
      
      
      on({id: 'sonoff.0.Eingang.POWER2', val: true}, function (obj) {
         
         // Benachrichtigung über Alexa das es geklingelt hat
         setState("alexa2.0.Echo-Devices.G2A0P30774xxxxxx.Routines.11242dac-bf4b-4ab1-9521-37fdf5dae51d", true); //Klingelt auf Echo Theke
         setState("alexa2.0.Echo-Devices.G2A0P30774xxxxxx.Routines.519a9af4-c186-4715-9e5d-cb4ac65c0c67", true); //Klingelt auf Dot Anrichte
         setState("onvif.0.192_168_8_90_80.remote.snapshot", true, false);
         setState("tr-064.0.states.ring"/*ring*/, '**610 ,20');
         // Soll jedesmal eine Bildsequenz neu gestartet werden, egal ob die vorherige Sequenz abgeschlossen ist, dann diesen Code:
         //BildSequenz = 0;
         //ErstelleBildsequenz();
         //
         // ...ODER soll das Speichern der Bildersequenz komplett abgeschlossen werden und auch ein erneuter Klingeldruck vorher keine neue
         // Sequenz auslösen dann diesen Code:
         if(debug) log("Bildsequenz: " + BildSequenz);
         if(BildSequenz == 0) ErstelleBildsequenz(); // Die Bildsequenz wird nur erstellt wenn vorherige Bildsequenz abgeschlossen ist
      });
      
      function ErstelleBildsequenz()
      {   if(BildSequenz == 0) BildSequenz=1;  // Bildsequenz
         if(debug) log("Bildsequenz: " + BildSequenz);
         // Bild von Cam holen
         request.get({url: cam_img, encoding: 'binary'}, function (err, response, body) {
             if(err) {
                 // Beim holen des Bildes von der Kamera ist ein Fehler aufgetreten
                 log('Beim holen des Bildes von der Kamera ist ein Fehler aufgetreten: ' + err);
                 BildSequenz = 0; // Die Bildsequenz zurück setzen
             } else
             {   // Bild wurde von der Kamera geladen. Jetzt speichern wir das Bild 
                 fs.writeFile(img_path+'/alarm' + BildSequenz + '.jpg', body, 'binary', function(err) {
                     if (err) {
                         // Beim Speichern des Bildes ist ein Fehler aufgetreten
                         log('Fehler beim Speichern von Bild ' + img_path + '/alarm' + BildSequenz + '.jpg   Fehler:' + err, 'warn');
                         BildSequenz = 0; // Die Bildsequenz zurück setzen
                     } else {
      
                          // Bild wurde jetzt gespeichert wir können das Bild jetzt weiterverarbeiten
                         switch(BildSequenz)
                         {   case 1: // Bild 1 direkt nach dem drücken des Klingelknopfes aufnehmen und per Mail verschicken
                                 // Vis umschalten: Setze View auf Kamerabild
                                 if(debug) log(" 1 Bildsequenz: " + BildSequenz);
                                 setState("vis.0.control.command", '{"instance": "FFFFFFFF", "command": "changeView", "data": "Neu/Tuer"}'); 
                                 if(TVis) clearTimeout(TVis); // Falls noch ein Timer läuft, diesen beenden.
                                 TVis = setTimeout(function () {
                                             setState("vis.0.control.command", '{"instance": "FFFFFFFF", "command": "changeView", "data": "Neu/Info"}');
         			                    }, 60000); // Nach 60 Sekunden, zeige wieder Start View
                                 
                                 // Nächstes Bild soll nach 5s aufgenommen werden
                                 BildSequenz = 2;                          
                                 if(TBildsequenz) clearTimeout(TBildsequenz);  // Falls es einen Timer gibt, diesen erst mal löschen
                                 TBildsequenz = setTimeout(function(){ErstelleBildsequenz();}, 5000);
                                 break;                            
                             case 2: // Bild 2, 5s nach dem drücken des Klingelknopfes aufnehmen und per Mail verschicken
                                 // Bild per Mail verschicken
                                 if(debug) log(" 2 Bildsequenz: " + BildSequenz);
                                 
                                 // Nächstes Bild soll nach 10s aufgenommen werden                            
                                 BildSequenz = 3;
                                 if(TBildsequenz) clearTimeout(TBildsequenz);  // Falls es einen Timer gibt, diesen erst mal löschen                           
                                 TBildsequenz = setTimeout(function(){ErstelleBildsequenz();}, 10000);
                                 break;                         
                             case 3: // Bild 3 soll nach weiteren 10s gespeichert werden
                                 
                                 // Nächstes Bild soll nach 10s aufgenommen werden
                                 if(debug) log(" 3 Bildsequenz: " + BildSequenz);                                                  
                                 BildSequenz = 4;
                                 if(TBildsequenz) clearTimeout(TBildsequenz);  // Falls es einen Timer gibt, diesen erst mal löschen
                                 TBildsequenz = setTimeout(function(){ErstelleBildsequenz();}, 10000);
                                 break;                                                    
                             case 4: // Bild 4 soll nach weiteren 10s gespeichert werden
                                 
                                 // Damit ist die Sequenz beendet und die Klingel ist wieder bereit
                                 if(debug) log(" 4 Bildsequenz: " + BildSequenz);
                                 sendTo("email", "send", {
                                         text: '',
                                         to: 'xxxxx.com',
                                         subject: 'Klingel',
                                         attachments:[{path: img_path + '/alarm1.jpg', cid: "file1"},{path: img_path + '/alarm2.jpg', cid: "file2"},{path: img_path + '/alarm3.jpg', cid: "file3"},{path: img_path + '/alarm4.jpg', cid: "file4"},] });
                                 sendTo("email", "send", {
                                         text: '',
                                         to: 'xxxxx@gmail.com',
                                         subject: 'Klingel',
                                         attachments:[{path: img_path + '/alarm1.jpg', cid: "file1"},{path: img_path + '/alarm2.jpg', cid: "file2"},{path: img_path + '/alarm3.jpg', cid: "file3"},{path: img_path + '/alarm4.jpg', cid: "file4"},] });
                                 
                                 BildSequenz = 0;
                                 if(TBildsequenz) clearTimeout(TBildsequenz);  // Falls es einen Timer gibt, diesen erst mal löschen
                              break;
                             default:
                                 // Nicht bekannter Sequenzschritt bzw. es gab einen Fehler beim holen oder speichern 
                             break;
                         };
                     };
                 });
             };
         });
      }
      

      haselchen T Homoran paul53 4 Replies Last reply Reply Quote 0
      • haselchen
        haselchen Most Active @Chaot last edited by haselchen

        @chaot

        Zeile 38 Cam URL?
        Bin überhaupt kein JS Typ, aber vielleicht hab ich ja den Fehler gefunden 😬

        Plus Zeile 6 und 7

        Davon ist eine URL ja auskommentiert

        1 Reply Last reply Reply Quote 0
        • T
          TT-Tom @Chaot last edited by TT-Tom

          @chaot

          
          Error in callback: ReferenceError: request is not defined
          
          

          request(request.get) ist nicht definiert.

          Du solltest das Script auf httpget umstellen, da request auch abgemeldet ist.

          Chaot 1 Reply Last reply Reply Quote 0
          • Chaot
            Chaot @TT-Tom last edited by

            @tt-tom Danke für die Info.
            Das wollte der Kumpel eigentlich machen, weil ich das nicht kapiere wie das geht.
            Aber da scheint was schiefgelaufen zu sein.

            1 Reply Last reply Reply Quote 0
            • Homoran
              Homoran Global Moderator Administrators @Chaot last edited by

              @chaot sagte in Fehler im Script:

              request.get({url: cam_img, encoding: 'b

              ist noch drin

              1 Reply Last reply Reply Quote 0
              • paul53
                paul53 @Chaot last edited by

                @chaot sagte: request is not defined

                Oben einfügen:

                const request = require('request');
                

                oder auf httpGet() umstellen.

                1 Reply Last reply Reply Quote 0
                • Chaot
                  Chaot last edited by

                  @paul53
                  Ok, habe das jetzt scheinbar fehlerfrei auf httpget umgestellt, laufe aber in den nächsten Fehler

                  // Klingelscript
                  // mit Alexa Routinenaufruf, Bilder erfassen, Versand an 2 Empfänger
                  // Stand 06-2023
                  
                  const debug = false;
                  //const cam_img = "http://192.168.xxxx:1984/api/frame.jpeg?src=door";
                  const cam_img = "http://192.168.xxxx:8095/192_168_8_xxxxx"
                  const img_path = '/opt/iobroker/iobroker-data/files/0_userdata.0';
                  
                  const fs = require('fs');
                  
                  var BildSequenz = 0;        // Sequenznummer 0:Bereit, 1: (0s) Bild1+Mail, 2: (+5s) Bild2+Mail, 3: (+10s) Bild3, 4: (+10s) Bild4
                  var TBildsequenz = null;    // Timer-Objekt für die Bildsequenz
                  var TVis = null;            // Timer um VIS umzuschalten
                  
                  
                  on({id: 'sonoff.0.Eingang.POWER2', val: true}, function (obj) {
                     
                     // Benachrichtigung über Alexa das es geklingelt hat
                     setState("alexa2.0.Echo-Devices.G2A0P3077406xxxx.Routines.11242dac-bf4b-4ab1-9521-37fdf5dae51d", true); //Klingelt auf Echo Theke
                     setState("alexa2.0.Echo-Devices.G2A0P3077406xxxx.Routines.519a9af4-c186-4715-9e5d-cb4ac65c0c67", true); //Klingelt auf Dot Anrichte
                     setState("onvif.0.192_168_8_xxxxx.remote.snapshot", true, false);
                     setState("tr-064.0.states.ring"/*ring*/, '**610 ,20');
                     // Soll jedesmal eine Bildsequenz neu gestartet werden, egal ob die vorherige Sequenz abgeschlossen ist, dann diesen Code:
                     //BildSequenz = 0;
                     //ErstelleBildsequenz();
                     //
                     // ...ODER soll das Speichern der Bildersequenz komplett abgeschlossen werden und auch ein erneuter Klingeldruck vorher keine neue
                     // Sequenz auslösen dann diesen Code:
                     if(debug) log("Bildsequenz: " + BildSequenz);
                     if(BildSequenz == 0) ErstelleBildsequenz(); // Die Bildsequenz wird nur erstellt wenn vorherige Bildsequenz abgeschlossen ist
                  });
                  
                  function ErstelleBildsequenz()
                  {   if(BildSequenz == 0) BildSequenz=1;  // Bildsequenz
                     if(debug) log("Bildsequenz: " + BildSequenz);
                     // Bild von Cam holen
                     httpGet(`http://192.168.xxxx:8095/192_168_8_xxxxx`, { responseType: 'arraybuffer' }, (err, response) => {
                     if (err) {
                             // Beim holen des Bildes von der Kamera ist ein Fehler aufgetreten
                             log('Beim holen des Bildes von der Kamera ist ein Fehler aufgetreten: ' + err);
                             BildSequenz = 0; // Die Bildsequenz zurück setzen
                         } else
                         {   // Bild wurde von der Kamera geladen. Jetzt speichern wir das Bild 
                             fs.writeFile(img_path+'/alarm' + BildSequenz + '.jpg', 'binary', function(err) {
                                 if (err) {
                                     // Beim Speichern des Bildes ist ein Fehler aufgetreten
                                     log('Fehler beim Speichern von Bild ' + img_path + '/alarm' + BildSequenz + '.jpg   Fehler:' + err, 'warn');
                                     BildSequenz = 0; // Die Bildsequenz zurück setzen
                                 } else {
                  
                                      // Bild wurde jetzt gespeichert wir können das Bild jetzt weiterverarbeiten
                                     switch(BildSequenz)
                                     {   case 1: // Bild 1 direkt nach dem drücken des Klingelknopfes aufnehmen und per Mail verschicken
                                             // Vis umschalten: Setze View auf Kamerabild
                                             if(debug) log(" 1 Bildsequenz: " + BildSequenz);
                                             setState("vis.0.control.command", '{"instance": "FFFFFFFF", "command": "changeView", "data": "Touch/Tuer"}'); 
                                             if(TVis) clearTimeout(TVis); // Falls noch ein Timer läuft, diesen beenden.
                                             TVis = setTimeout(function () {
                                                         setState("vis.0.control.command", '{"instance": "FFFFFFFF", "command": "changeView", "data": "Touch/Info"}');
                     			                    }, 60000); // Nach 60 Sekunden, zeige wieder Start View
                                             
                                             // Nächstes Bild soll nach 5s aufgenommen werden
                                             BildSequenz = 2;                          
                                             if(TBildsequenz) clearTimeout(TBildsequenz);  // Falls es einen Timer gibt, diesen erst mal löschen
                                             TBildsequenz = setTimeout(function(){ErstelleBildsequenz();}, 5000);
                                             break;                            
                                         case 2: // Bild 2, 5s nach dem drücken des Klingelknopfes aufnehmen und per Mail verschicken
                                             // Bild per Mail verschicken
                                             if(debug) log(" 2 Bildsequenz: " + BildSequenz);
                                             
                                             // Nächstes Bild soll nach 10s aufgenommen werden                            
                                             BildSequenz = 3;
                                             if(TBildsequenz) clearTimeout(TBildsequenz);  // Falls es einen Timer gibt, diesen erst mal löschen                           
                                             TBildsequenz = setTimeout(function(){ErstelleBildsequenz();}, 10000);
                                             break;                         
                                         case 3: // Bild 3 soll nach weiteren 10s gespeichert werden
                                             
                                             // Nächstes Bild soll nach 10s aufgenommen werden
                                             if(debug) log(" 3 Bildsequenz: " + BildSequenz);                                                  
                                             BildSequenz = 4;
                                             if(TBildsequenz) clearTimeout(TBildsequenz);  // Falls es einen Timer gibt, diesen erst mal löschen
                                             TBildsequenz = setTimeout(function(){ErstelleBildsequenz();}, 10000);
                                             break;                                                    
                                         case 4: // Bild 4 soll nach weiteren 10s gespeichert werden
                                             
                                             // Damit ist die Sequenz beendet und die Klingel ist wieder bereit
                                             if(debug) log(" 4 Bildsequenz: " + BildSequenz);
                                             sendTo("email", "send", {
                                                     text: '',
                                                     to: 'xxxx@gmail.com',
                                                     subject: 'Klingel',
                                                     attachments:[{path: img_path + '/alarm1.jpg', cid: "file1"},{path: img_path + '/alarm2.jpg', cid: "file2"},{path: img_path + '/alarm3.jpg', cid: "file3"},{path: img_path + '/alarm4.jpg', cid: "file4"},] });
                                             sendTo("email", "send", {
                                                     text: '',
                                                     to: 'xxxxx@gmail.com',
                                                     subject: 'Klingel',
                                                     attachments:[{path: img_path + '/alarm1.jpg', cid: "file1"},{path: img_path + '/alarm2.jpg', cid: "file2"},{path: img_path + '/alarm3.jpg', cid: "file3"},{path: img_path + '/alarm4.jpg', cid: "file4"},] });
                                             
                                             BildSequenz = 0;
                                             if(TBildsequenz) clearTimeout(TBildsequenz);  // Falls es einen Timer gibt, diesen erst mal löschen
                                          break;
                                         default:
                                             // Nicht bekannter Sequenzschritt bzw. es gab einen Fehler beim holen oder speichern 
                                         break;
                                     };
                                 };
                             });
                         };
                     });
                  }
                  

                  javascript.0 2024-07-07 12:22:35.274	error	at processTicksAndRejections (node:internal/process/task_queues:95:5)
                  javascript.0 2024-07-07 12:22:35.274	error	at /opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1203:38
                  javascript.0 2024-07-07 12:22:35.274	error	at Object.<anonymous> (script.js.Klingel.Klingelsequenz:46:16)
                  javascript.0 2024-07-07 12:22:35.274	error	at ProtectFs.writeFile (/opt/iobroker/node_modules/iobroker.javascript/lib/protectFs.js:70:9)
                  javascript.0 2024-07-07 12:22:35.273	error	at checkProtected (/opt/iobroker/node_modules/iobroker.javascript/lib/protectFs.js:21:19)
                  javascript.0 2024-07-07 12:22:35.273	error	Error in callback: Error: Permission denied
                  javascript.0 2024-07-07 12:22:35.265	error	May not read /opt/iobroker/iobroker-data/files/0_userdata.0/alarm1.jpg - use writeFile instead
                  
                  paul53 1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 @Chaot last edited by

                    @chaot sagte: nächsten Fehler

                    In Zeile 45 fehlen die zu schreibenden Daten.

                               fs.writeFile(img_path+'/alarm' + BildSequenz + '.jpg', response.data, 'binary', function(err) {
                    
                    Chaot 1 Reply Last reply Reply Quote 0
                    • Chaot
                      Chaot @paul53 last edited by

                      @paul53 sagte in Fehler im Script:

                      response.data,

                      Danke, das habe ich ergänzt. Aber ich denke, dass ich da irrgendein Rechteproblem habe.

                      javascript.0
                      2024-07-07 16:53:14.346	error	at processTicksAndRejections (node:internal/process/task_queues:95:5)
                      javascript.0
                      2024-07-07 16:53:14.346	error	at /opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1203:38
                      javascript.0
                      2024-07-07 16:53:14.345	error	at Object.<anonymous> (script.js.Klingel.Klingelsequenz:46:16)
                      javascript.0
                      2024-07-07 16:53:14.345	error	at ProtectFs.writeFile (/opt/iobroker/node_modules/iobroker.javascript/lib/protectFs.js:70:9)
                      javascript.0
                      2024-07-07 16:53:14.344	error	at checkProtected (/opt/iobroker/node_modules/iobroker.javascript/lib/protectFs.js:21:19)
                      javascript.0
                      2024-07-07 16:53:14.343	error	Error in callback: Error: Permission denied
                      javascript.0
                      2024-07-07 16:53:14.335	error	May not read /opt/iobroker/iobroker-data/files/0_userdata.0/alarm1.jpg - use writeFile instead
                      

                      Zeile 12 "premission denied"

                      T 1 Reply Last reply Reply Quote 0
                      • T
                        TT-Tom @Chaot last edited by TT-Tom

                        @chaot

                        Ja es gibt jetzt richtige schreib- und lese- Rechte in den Verzeichnissen. Die gab es vorher auch schon, wurden nur nicht konsequent kontrolliert.

                        Mit dem neuen JavaScript Adapter ist vieles erweitert worden. Es gab hier schon Beiträge zum Schreiben in Verzeichnisse.

                        Edit. Hier was zum lesen

                        Chaot 1 Reply Last reply Reply Quote 0
                        • Chaot
                          Chaot @TT-Tom last edited by

                          @tt-tom Hm, ok. Ich dachte, dass sich das nur auf Systemordner bezieht. In den Ordner 0_userdata.0 müsste ich doch schreiben können. Der ist doch dazu da oder verstehe ich das falsch?
                          Oder anders gefragt: Wo kann ich das hinschreiben?

                          T Homoran 2 Replies Last reply Reply Quote 0
                          • T
                            TT-Tom @Chaot last edited by

                            @chaot

                            Bin leider nur am Handy unterwegs. Aber soviel wie ich noch weiß, hat fs nicht alle Rechte oder schreib es nicht richtig. Es gibt aber dafür Befehle, glaube writeFile oder so. Schau mal in die Doku vom Adapter.

                            1 Reply Last reply Reply Quote 0
                            • Homoran
                              Homoran Global Moderator Administrators @Chaot last edited by

                              @chaot sagte in Fehler im Script:

                              Wo kann ich das hinschreiben?

                              nicht das wo ist das Problem sondern das wie!

                              @chaot sagte in Fehler im Script:

                              use writeFile instead

                              T Chaot 2 Replies Last reply Reply Quote 1
                              • T
                                TT-Tom @Homoran last edited by

                                @homoran sagte in Fehler im Script:

                                @chaot sagte in Fehler im Script:

                                use writeFile instead

                                Sag ich ja irgendwas war da. 😁

                                1 Reply Last reply Reply Quote 0
                                • Chaot
                                  Chaot @Homoran last edited by

                                  @homoran
                                  Ist das nicht so?

                                   fs.writeFile(img_path+'/alarm' + BildSequenz + '.jpg', 'binary', function(err) {
                                  
                                  paul53 1 Reply Last reply Reply Quote 0
                                  • paul53
                                    paul53 @Chaot last edited by paul53

                                    @chaot sagte: Ist das nicht so?

                                    Es gibt inzwischen eine Funktion writeFile() des Javascript-Adapters.
                                    Außerdem fehlen in der gezeigten Zeile wieder die zu schreibenden Daten.

                                    Chaot 1 Reply Last reply Reply Quote 1
                                    • Chaot
                                      Chaot @paul53 last edited by

                                      @paul53 Ach so.
                                      Kann ich das dann einfach ersetzen?
                                      aus

                                       fs.writeFile(img_path+'/alarm' + BildSequenz + '.jpg', response.data, 'binary', function(err) {
                                      

                                      wird

                                       writeFile(img_path+'/alarm' + BildSequenz + '.jpg', response.data, 'binary', function(err) {
                                      
                                      paul53 1 Reply Last reply Reply Quote 0
                                      • paul53
                                        paul53 @Chaot last edited by

                                        @chaot sagte: Kann ich das dann einfach ersetzen?

                                        Keine Ahnung. Ich habe die Funktion writeFile() noch nicht benutzt.

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

                                        Support us

                                        ioBroker
                                        Community Adapters
                                        Donate

                                        579
                                        Online

                                        31.8k
                                        Users

                                        80.0k
                                        Topics

                                        1.3m
                                        Posts

                                        5
                                        18
                                        575
                                        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