Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. .js Dateien ins Blockly Format importieren/konvertieren?

    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

    .js Dateien ins Blockly Format importieren/konvertieren?

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

      @alyxabyss sagte: theoretisch die entsprechenden Dateien da raus ziehen können?

      Gespeichert sind die Blockly-Skripte in den Objekten unter script.js unter common.source. Es dürfte nicht einfach sein, sie daraus wieder herzustellen.
      Sichere die geänderten Javascript-Dateien und spiele das Backup zurück. Durch Vergleich des erzeugten Javascript-Codes mit dem gesicherten Javascript-Code kannst Du Änderungen von heute nachvollziehen.

      A 1 Reply Last reply Reply Quote 1
      • A
        AlyxAbyss @paul53 last edited by

        @paul53

        Es wäre ja auch zu schön gewesen, wenn es ausnahmsweise mal einfach nur einfach sein würde.
        Muss ich wohl in den sauren Apfel beißen und ein bisschen was neu machen. 😖

        Danke

        F 1 Reply Last reply Reply Quote 0
        • F
          fastfoot @AlyxAbyss last edited by

          @alyxabyss mich wundert wie aus Blocklies 'reine' JS-Dateien wurden. Ist da evtl eine letzte Zeile welche etwa so anfängt: //JTNDeG1..........?

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

            @fastfoot sagte: Ist da evtl eine letzte Zeile welche etwa so anfängt: //JTNDeG1..........?

            Da steckt Blockly drin, muss aber wohl gewandelt werden - keine Ahnung wie.

            F A 2 Replies Last reply Reply Quote 0
            • F
              fastfoot @paul53 last edited by

              @paul53 sagte in .js Dateien ins Blockly Format importieren/konvertieren?:

              @fastfoot sagte: Ist da evtl eine letzte Zeile welche etwa so anfängt: //JTNDeG1..........?

              Da steckt Blockly drin, muss aber wohl gewandelt werden - keine Ahnung wie.

              deshalb fragte ich, dann ist es easy zumindest ein xml für den Import zu generieren.

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

                @paul53 ich habe die Scripte in dem Ordner gefunden wo der Javascript Adapter die Spiegelungen ablegt.

                Inhaltlich sehen die Dateien so aus:

                schedule("13 13 * * *", async function () {
                  setState("tuya.0.bfc836b3c2278be1684tik.1"/*switch_1*/, true);
                  setState("alexa2.0.Echo-Devices.G091AA08114400T1.Commands.ssml"/*ssml*/, (['<speak><voice name="Vicki">','Hast du heute schon deine Pflanzen gegossen?','</voice></speak>'].join('')));
                  setStateDelayed("tuya.0.bfc836b3c2278be1684tik.1"/*switch_1*/, false, 5000, false);
                });
                
                //JTNDeG1sJTIweG1sbnMlM0QlMjJodHRwcyUzQSUyRiUyRmRldmVsb3BlcnMuZ29vZ2xlLmNvbSUyRmJsb2NrbHklMkZ4bWwlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJzY2hlZHVsZSUyMiUyMGlkJTNEJTIyJTVEa25FbkZ0NiFIVEIlNUQueSU0MCUzQVdRYyUyMiUyMHglM0QlMjItMzEyJTIyJTIweSUzRCUyMi00MzclMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTQ0hFRFVMRSUyMiUzRTEzJTIwMTMlMjAqJTIwKiUyMColM0MlMkZmaWVsZCUzRSUzQ3N0YXRlbWVudCUyMG5hbWUlM0QlMjJTVEFURU1FTlQlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJjb250cm9sJTIyJTIwaWQlM0QlMjJRNDA0S0wqTUd+OSUzQkkpTTBlJTJDVVQlMjIlM0UlM0NtdXRhdGlvbiUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYxOTk5JTJGeGh0bWwlMjIlMjBkZWxheV9pbnB1dCUzRCUyMmZhbHNlJTIyJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJPSUQlMjIlM0V0dXlhLjAuYmZjODM2YjNjMjI3OGJlMTY4NHRpay4xJTNDJTJGZmllbGQlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJXSVRIX0RFTEFZJTIyJTNFRkFMU0UlM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlZBTFVFJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIybG9naWNfYm9vbGVhbiUyMiUyMGlkJTNEJTIyKWpoaG4lNjBNeG8lM0RPTUYhYSU2MGUuMSUyNCUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMkJPT0wlMjIlM0VUUlVFJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmNvbnRyb2wlMjIlMjBpZCUzRCUyMnZ4JTNCJTdCJTQwKXNLY2IySTJ6JTIzd3R2T1MlMjIlM0UlM0NtdXRhdGlvbiUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYxOTk5JTJGeGh0bWwlMjIlMjBkZWxheV9pbnB1dCUzRCUyMmZhbHNlJTIyJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJPSUQlMjIlM0VhbGV4YTIuMC5FY2hvLURldmljZXMuRzA5MUFBMDgxMTQ0MDBUMS5Db21tYW5kcy5zc21sJTNDJTJGZmllbGQlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJXSVRIX0RFTEFZJTIyJTNFRkFMU0UlM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlZBTFVFJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dF9qb2luJTIyJTIwaWQlM0QlMjJWWEolM0IlNjAtcTBzazZOTSUzQW0lM0IlM0RlaHklMjIlM0UlM0NtdXRhdGlvbiUyMGl0ZW1zJTNEJTIyMyUyMiUzRSUzQyUyRm11dGF0aW9uJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyQUREMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnRleHQlMjIlMjBpZCUzRCUyMm9tRFolNUIlNUQ3RiUyRmElMjNBYTMydiUzQiUyRnIlMkMlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFJTI2bHQlM0JzcGVhayUyNmd0JTNCJTI2bHQlM0J2b2ljZSUyMG5hbWUlM0QlMjJWaWNraSUyMiUyNmd0JTNCJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyQUREMSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnRleHQlMjIlMjBpZCUzRCUyMmwlM0QlM0RxU1VVaiU2MGd5ZUMqaUJuSkYlNUQlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFSGFzdCUyMGR1JTIwaGV1dGUlMjBzY2hvbiUyMGRlaW5lJTIwUGZsYW56ZW4lMjBnZWdvc3NlbiUzRiUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMkFERDIlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJ0ZXh0JTIyJTIwaWQlM0QlMjJ+JTYwJTI1d3hqJTdDbTkzJTNCcjV0em4lNUJhdCUyNCUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlMjZsdCUzQiUyRnZvaWNlJTI2Z3QlM0IlMjZsdCUzQiUyRnNwZWFrJTI2Z3QlM0IlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmNvbnRyb2wlMjIlMjBpZCUzRCUyMmdsVCUyRjclMjRyenVXSV9oJTNGUCU1RThUZiUzQiUyMiUzRSUzQ211dGF0aW9uJTIweG1sbnMlM0QlMjJodHRwJTNBJTJGJTJGd3d3LnczLm9yZyUyRjE5OTklMkZ4aHRtbCUyMiUyMGRlbGF5X2lucHV0JTNEJTIydHJ1ZSUyMiUzRSUzQyUyRm11dGF0aW9uJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyT0lEJTIyJTNFdHV5YS4wLmJmYzgzNmIzYzIyNzhiZTE2ODR0aWsuMSUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyV0lUSF9ERUxBWSUyMiUzRVRSVUUlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMkRFTEFZX01TJTIyJTNFNSUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVU5JVCUyMiUzRXNlYyUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyQ0xFQVJfUlVOTklORyUyMiUzRUZBTFNFJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJWQUxVRSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmxvZ2ljX2Jvb2xlYW4lMjIlMjBpZCUzRCUyMkNZJTYwVDVYT1IlM0F3dDg1cHh1JTdCaGhZJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyQk9PTCUyMiUzRUZBTFNFJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZzdGF0ZW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnhtbCUzRQ==
                

                Das Problem ist zustande gekommen als ich den Javascript Adapter auf Version 5.5.0 upgedatet habe. Ich hatte zuvor auch eine Meldung erhalten, dass man das Update nicht durchführen darf, wenn die Scripte in bestimmten Ordnern liegen. Dachte bei mir wäre alles im grünen Bereich. Habe upgedatet und danach waren alle Scripte weg.
                Nur durch das Zurücksetzen auf einen älteren Zustand habe ich sie soweit wieder zurück bekommen.

                Jetzt traue ich mich nicht mehr den Adapter erneut upzudaten 😄

                paul53 F 2 Replies Last reply Reply Quote 0
                • paul53
                  paul53 @AlyxAbyss last edited by

                  @alyxabyss sagte: ich habe die Scripte in dem Ordner gefunden

                  Welcher Ordner ist es?

                  @alyxabyss sagte in .js Dateien ins Blockly Format importieren/konvertieren?:

                  Jetzt traue ich mich nicht mehr den Adapter erneut upzudaten

                  Es ist Version 5.5.2 verfügbar, die vor dem Update warnt, wenn das Spiegelverzeichnis unter /opt/iobroker liegt.

                  A 1 Reply Last reply Reply Quote 0
                  • F
                    fastfoot @AlyxAbyss last edited by

                    @alyxabyss sagte in .js Dateien ins Blockly Format importieren/konvertieren?:

                    Jetzt traue ich mich nicht mehr den Adapter erneut upzudaten

                    Das habe ich noch nie erlebt. Ich poste dir später ein Script mit dem du aus den Skripten im Mirrorpath XML-Dateien erstellen kannst welche du dann importieren kannst. Für dein Beispiel ist das diese Datei:

                    <xml xmlns="https://developers.google.com/blockly/xml">
                     <block type="schedule" id="]knEnFt6!HTB].y@:WQc" x="-312" y="-437">
                       <field name="SCHEDULE">13 13 * * *</field>
                       <statement name="STATEMENT">
                         <block type="control" id="Q404KL*MG~9;I)M0e,UT">
                           <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                           <field name="OID">tuya.0.bfc836b3c2278be1684tik.1</field>
                           <field name="WITH_DELAY">FALSE</field>
                           <value name="VALUE">
                             <block type="logic_boolean" id=")jhhn`Mxo=OMF!a`e.1$">
                               <field name="BOOL">TRUE</field>
                             </block>
                           </value>
                           <next>
                             <block type="control" id="vx;{@)sKcb2I2z#wtvOS">
                               <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                               <field name="OID">alexa2.0.Echo-Devices.G091AA08114400T1.Commands.ssml</field>
                               <field name="WITH_DELAY">FALSE</field>
                               <value name="VALUE">
                                 <block type="text_join" id="VXJ;`-q0sk6NM:m;=ehy">
                                   <mutation items="3"></mutation>
                                   <value name="ADD0">
                                     <block type="text" id="omDZ[]7F/a#Aa32v;/r,">
                                       <field name="TEXT">&lt;speak&gt;&lt;voice name="Vicki"&gt;</field>
                                     </block>
                                   </value>
                                   <value name="ADD1">
                                     <block type="text" id="l==qSUUj`gyeC*iBnJF]">
                                       <field name="TEXT">Hast du heute schon deine Pflanzen gegossen?</field>
                                     </block>
                                   </value>
                                   <value name="ADD2">
                                     <block type="text" id="~`%wxj|m93;r5tzn[at$">
                                       <field name="TEXT">&lt;/voice&gt;&lt;/speak&gt;</field>
                                     </block>
                                   </value>
                                 </block>
                               </value>
                               <next>
                                 <block type="control" id="glT/7$rzuWI_h?P^8Tf;">
                                   <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="true"></mutation>
                                   <field name="OID">tuya.0.bfc836b3c2278be1684tik.1</field>
                                   <field name="WITH_DELAY">TRUE</field>
                                   <field name="DELAY_MS">5</field>
                                   <field name="UNIT">sec</field>
                                   <field name="CLEAR_RUNNING">FALSE</field>
                                   <value name="VALUE">
                                     <block type="logic_boolean" id="CY`T5XOR:wt85pxu{hhY">
                                       <field name="BOOL">FALSE</field>
                                     </block>
                                   </value>
                                 </block>
                               </next>
                             </block>
                           </next>
                         </block>
                       </statement>
                     </block>
                    </xml>
                    

                    1 Reply Last reply Reply Quote 1
                    • A
                      AlyxAbyss @paul53 last edited by AlyxAbyss

                      @paul53 ich hatte die Spiegelung im Javascript Adapter auf /media/usb/iobroker gesetzt. Darum dachte ich, das Update sollte kein Problem darstellen. Falsch gedacht. Trotzdem waren die Scripte alle plötzlich weg.

                      Dann drüber gefreut, dass ich ja ein Backup habe, aber dann gemerkt, dass ich die bei Blockly nicht direkt importieren kann.
                      Wenn ich die allerdings direkt in die Scriptübersicht importiere, erscheinen sie dort als JavaScript und nicht als Blockly, aber funktionieren normal. Nur das editieren, macht es für mich als Laien dann auch wieder schwierig. Mit Blockly komm ich ja soweit klar, aber bei richtigen Scripts bin ich überfordert.

                      @fastfoot Danke. Das wäre wäre Klasse. Hab zwar soweit alles wieder ins laufen bekommen. Nur für die Zukunft wäre das natürlich prima. Sonst komme ich mit den Spiegelungen nicht zurecht, wenn ich nochmal das Problem habe.

                      BananaJoe F 2 Replies Last reply Reply Quote 0
                      • BananaJoe
                        BananaJoe Most Active @AlyxAbyss last edited by BananaJoe

                        @alyxabyss ich finde meinen eigenen verf....ten Beitrag dazu nicht wieder den ich mal gemacht habe ... aber es geht so:

                        • Im JavaScript Adapter die Spiegelung der Skripte ins Dateisystem konfigurieren
                        • Dann ein neues Blockly mit passenden Namen erstellen
                        • Es wird unmittelbar im Dateisystem auch eine passende Datei auftauchen. Die bearbeiten und den Inhalt den du hast inklusive der kryptischen letzten Zeile einfügen
                        • Speichern!
                        • Tata, im ScriptEditor sollte sich das auch gleich aktualisiert haben und der Blockly ist wieder da

                        Ich hab dazu mal eine Anleitung gemacht wie man das aus dem BackupItUp Adapter holt, finde das aber gerade nicht.

                        Doch gefunden: https://forum.iobroker.net/topic/51702/scripte-aus-backup-wiederherstellen/4?_=1648128711954

                        A 1 Reply Last reply Reply Quote 1
                        • A
                          AlyxAbyss @BananaJoe last edited by

                          @bananajoe Ah danke. Das sieht nützlich aus. Das schau ich mir heute Abend mal genauer an. 🙂

                          1 Reply Last reply Reply Quote 0
                          • F
                            fastfoot @AlyxAbyss last edited by

                            @alyxabyss Zeile 22 für den Pfad anpassen, es werden xml Dateien für alle Blocklies generiert, nichts wird gelöscht. Man kann also damit 'rumspielen'

                            /**
                            * Zweck:   Skript zum extrahieren der Blockly-XML aus Skript-Backup oder gespiegelten Skripten
                            * Datum:   24.03.2022
                            * Autor:   @fastfoot
                            * Forum:   https://forum.iobroker.net/topic/53653/js-dateien-ins-blockly-format-importieren-konvertieren/15
                            * 
                            * Anleitung:
                            * 
                            * 1. Dateipfad zu den gesicherten Skripten eintragen, default ==>  const restorePath = '/home/iobroker/scripts'
                            *      a) entweder der gespiegelte Pfad, wie er in der JS-Instanz angegeben ist, oder
                            *      b) der Pfad, in den die ZIP-Datei (aus 'Exportieren Sie alle Skripte') extrahiert wurde
                            * 
                            * 2. Dateiendung für Sourcefile eintragen, entweder .json oder .js, default ==>  const fExtIn = '.json'
                            * 
                            * 3. Dateiendung für Output eintragen, entweder .xml oder .txt, default ==>  const fExtOut = '.xml'
                            * 
                            * 4. Wählen, ob Originaldatei gelöscht wird, default ===> const DeleteSource = false
                            */
                            const dbg = false;                                 // Zusatzausgaben
                            const fExtOut = '.xml';                            // <==== Dateiendung für Output bestimmen, entweder .txt oder .xml
                            const fExtIn = '.js';                              // <==== Dateiendung bestimmen, entweder .json oder .js
                            const restorePath = '/home/iobroker/scripts';      // <==== Dateipfad zu den gesicherten Skripten
                            //const deleteSource = false;                        // <==== Lösche Original-Datei
                            const filesToSkip = [];                            // <==== Dateien und/oder Ordner ausschließen
                            
                            const fs = require('fs');
                            const path = require('path');
                            
                            var filesCollection = [];
                            
                            /**
                            * Extrahiere und schreibe Blockly-XML
                            */
                            function writeXML(fn) {
                               var fnOut = fn.replace(fExtIn, fExtOut);
                               var data = fs.readFileSync(fn, 'utf8')
                               if (dbg) log(fn)
                               const pos = data.lastIndexOf('\n');
                               if (pos !== -1) {
                                   data = data.substring(pos + 3);
                                   if (data.indexOf('JTNDeG1sJTIweG1') !== -1) {
                                       data = decodeURIComponent(Buffer.from(data, 'base64').toString('utf8'));
                                       fs.writeFile(fnOut, data, err => {
                                           if (err) {
                                               return console.log(err, 'error');
                                           } else {
                                               if (dbg) log(fnOut);
                                           }
                                       });
                                   }
                               }
                            }
                            
                            /**
                            * Lese Verzeichnis
                            */
                            function readDirectorySynchronously(directory) {
                               var currentDirectorypath = directory;
                            
                               var currentDirectory = fs.readdirSync(currentDirectorypath, 'utf8');
                            
                               currentDirectory.forEach(file => {
                                   var fileShouldBeSkipped = filesToSkip.indexOf(file) > -1;
                                   var pathOfCurrentItem = path.join(directory, file);
                                   if (!fileShouldBeSkipped && fs.statSync(pathOfCurrentItem).isFile()) {
                                       filesCollection.push(pathOfCurrentItem);
                                   }
                                   else if (!fileShouldBeSkipped) {
                                       var directorypath = path.join(directory, file);
                                       readDirectorySynchronously(directorypath);
                                   }
                               });
                            }
                            
                            function main() {
                               readDirectorySynchronously(restorePath);
                            
                               filesCollection.forEach(file => {
                                   if (dbg) log(file)
                                   if (file.indexOf(fExtIn) !== -1) {
                                       writeXML(file);
                                       /*if (deleteSource) {
                                           fs.unlinkSync(file);
                                       }*/
                                   }
                               });
                            
                               //setStateDelayed('javascript.' + instance + '.scriptEnabled.Tools.GetAllXmlFiles', false, false, parseInt('2000', 10), false);
                            };
                            
                            main();
                            

                            A 1 Reply Last reply Reply Quote 2
                            • A
                              AlyxAbyss @fastfoot last edited by

                              @fastfoot Wow danke. Einfach genial. Direkt mal sichern 🙂

                              I 1 Reply Last reply Reply Quote 0
                              • I
                                iobroker_Alex @AlyxAbyss last edited by

                                @fastfoot

                                Hab genau das selbe Problem. Mit deinem Skript komme ich allerdings nicht soweit, dass eine "Output-Datei" generiert wird. Kannst du bitte einmal versuchen die folgende Datei wiederherzustellen?
                                Vielen, vielen Dank!

                                Strommessung.json

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

                                Support us

                                ioBroker
                                Community Adapters
                                Donate

                                994
                                Online

                                31.9k
                                Users

                                80.2k
                                Topics

                                1.3m
                                Posts

                                5
                                17
                                1999
                                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