Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. ehemalige Historydaten finden

    NEWS

    • [erledigt] 15. 05. Wartungsarbeiten am ioBroker Forum

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    ehemalige Historydaten finden

    This topic has been deleted. Only users with topic management privileges can see it.
    • Homoran
      Homoran Global Moderator Administrators @MCU last edited by

      @mcu sagte in ehemalige Historydaten finden:

      @homoran Steht in der Doku, also im Link.

      Ich weiß! DANKE!
      Da hast du ja einiges ergänzt

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

        @mcu sagte in ehemalige Historydaten finden:

        @homoran Zeig mal die Einstellungen von den DPs(findOldDPs) als Bild.

        Screenshot_20221106-221702_Firefox.jpg

        ich stell jetzt auf alias um und seh mir das mal an

        EDIT
        da war nicht viel
        javascript.1 2022-11-06 22:18:35.629 info script.js.historyLeichen104: Nicht aktive DPs in den ausgewählten Verzeichnissen: 0

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

          @homoran sagte in ehemalige Historydaten finden:

          dann lösvht er doch die aktuellen....

          Also wenn der "hm-rega.0.KEQ1065589.0.DUTY_CYCLE" aktuelle DP ist und der "hm-rega.0.43579" der alte, dann werden alle neuen Daten zurzeit in die Datei vom alten DP geschrieben. Richtig?

          Dann müsste man doch vorher die Daten vom alten DP "hm-rega.0.43579" auf den neuen DP "hm-rega.0.KEQ1065589.0.DUTY_CYCLE" kopieren?

          M Homoran 2 Replies Last reply Reply Quote 0
          • M
            MCU @MCU last edited by MCU

            @Homoran Hast du denn jetzt erstmal ne Sicherung gemacht, bevor du weiter Einstellungen probierst?

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

              @mcu sagte in ehemalige Historydaten finden:

              Also wenn der "hm-rega.0.KEQ1065589.0.DUTY_CYCLE" aktuelle DP ist und der "hm-rega.0.43579" der alte, dann werden alle neuen Daten zurzeit in die Datei vom alten DP geschrieben. Richtig?

              so hab ich es verstanden!

              @mcu sagte in ehemalige Historydaten finden:

              Dann müsste man doch vorher die Daten vom alten DP "hm-rega.0.43579" auf den neuen DP "hm-rega.0.KEQ1065589.0.DUTY_CYCLE" kopieren?

              aber wenn ich useAliasIdInEnabled nutze wird der alte ja nicht gelöscht.

              und der neue auch nicht

              so muss es IMHO auch laufen.

              @mcu sagte in ehemalige Historydaten finden:

              @Homoran Hast du denn jetzt erstmal ne Sicherung gemacht, bevor du weiter Einstellungen probierst?

              nöö, futsch is futsch !
              aber ich habe gerade erstcden ersten scharfen lauf gemacht un vorher alle IDs beim Dry Run kontrolliert.

              ich mache jetzt eh Schluss

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

                @homoran Es dürfte keine Dateien mit dem neuen DP "hm-rega.0.KEQ1065589.0.DUTY_CYCLE" geben! Da ja ein aliasID besteht und dessen Name für die Benennung der Dateien genutzt wird.
                Also bei den DPs vorsichtig sein. Es muss erst kopiert werden, sonst sind die Daten weg.
                Also als erstes morgen eine Sicherung machen!

                1 Reply Last reply Reply Quote 0
                • M
                  Matt77CHE last edited by

                  Hallo zusammen

                  Ich möchte gerne dieses Thema wieder aufgreifen - ich habe die Beiträge durchgeschaut und das Skript für die Löschung nicht mehr aktiver DPs gesucht.

                  Entweder bin ich zu müde, brauche eine neue Brille - oder einfach zu doof, denn das Skript habe ich nicht gefunden.....

                  Ich wäre euch dankbar, wenn mir jemand zeigen könnte, wo das Skript sich befindet; evtl gibt es ja auch schon eine neue Version - das Thema ist ja doch schon etwas älter....

                  Besten Dank für eure Mithilfe
                  Matt

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

                    @matt77che sagte in ehemalige Historydaten finden:

                    Entweder bin ich zu müde, brauche eine neue Brille - oder einfach zu doof, denn das Skript habe ich nicht gefunden.....

                    habe eben gesucht und den Link dazu gefunden im Thread.
                    Leider läuft der ins Leere.
                    In der Sammlung von @mcu gibt's nur ne 404 😞

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

                      @homoran Welcher Link ist das?
                      Die nicht jarvis spezifischen sind umgezogen.

                      https://mcuiobroker.gitbook.io/iobroker-tipps

                      https://mcuiobroker.gitbook.io/iobroker-tipps/tipps/scripte-blockly-javascript/javascript/history-adapter/nicht-mehr-geloggte-dps-in-history-verzeichnissen-finden

                      M 2 Replies Last reply Reply Quote 2
                      • M
                        Matt77CHE @MCU last edited by

                        @mcu

                        Vielen Dank 👍

                        Habe es gefunden bei deinem neuen Link

                        1 Reply Last reply Reply Quote 0
                        • M
                          Matt77CHE @MCU last edited by

                          @mcu

                          Ich habe den
                          History-Adapter V3.0.1
                          Javascript-adapter V8.8.3

                          und bekomme folgende Fehlermeldung im Javascript-Adapter :

                          14.10.2024, 19:46:32.458	[error]: javascript.0 (436) script.js.common.Alte_history_dp_löschen: TypeError: Cannot read properties of undefined (reading 'length')
                          14.10.2024, 19:46:32.459	[error]: javascript.0 (436)     at script.js.common.Alte_history_dp_löschen:238:18
                          14.10.2024, 19:46:32.986	[error]: host.iobroker Caught by controller[0]:     at script.js.common.Alte_history_dp_löschen:239:18
                          

                          Habe ich da was falsch gemacht?

                          • habe das Script im allgemeinen Ordner vom Javascript-Adapter in ein Java-script - Skript eingefügt; das Script ausgeführt und dann den Start-Button gedrückt.....
                          Homoran M 2 Replies Last reply Reply Quote 0
                          • Homoran
                            Homoran Global Moderator Administrators @Matt77CHE last edited by

                            @matt77che sagte in ehemalige Historydaten finden:

                            und dann den Start-Button gedrückt..

                            hast du die notwendigen Werte in die Datenpunkte eingetragen?

                            M 1 Reply Last reply Reply Quote 0
                            • M
                              MCU @Matt77CHE last edited by

                              @matt77che Muss ich mir anschauen, komme aber erst Mittwoch dazu.

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

                                @homoran
                                dirStart 0
                                dirEnd 10 ?

                                Ja

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

                                  @matt77che sagte in ehemalige Historydaten finden:

                                  @homoran
                                  dirStart 0
                                  dirEnd 10 ?

                                  Ja

                                  ich weiss nicht mehr alles, bitte zeigen!

                                  auch was in

                                  @matt77che sagte in ehemalige Historydaten finden:

                                  script.js.common.Alte_history_dp_löschen:239:18

                                  steht

                                  M 2 Replies Last reply Reply Quote 0
                                  • M
                                    Matt77CHE @Homoran last edited by

                                    @homoran

                                    // ********************************
                                    // findOldHistoryDPs v1.0.5
                                    // Copyright ©MCU
                                    // ********************************
                                    // v1.0.1 directDelete-> true  Möglichkeit die DatenDateien direkt löschen
                                    // v1.0.2 aliasId berücksichtigt bei enabledDPs
                                    // v1.0.3 zusätzliche Funktion listHistoryDPsWithaliasId('history.0');
                                    // v1.0.4 zusätzlich: fillAlias -> alle aktiven history-DPs mit alias in Array withAliasIdInEnabled
                                    //        fillEnabled_DPs -> nur die akitven History DPs in Array füllen -> enabled_DPs
                                    //        useAliasIdInEnabled -> true -> AliasId wird in enabled_DPs verwendet (was richtig ist, da die history-Werte mit alias geschrieben werden)
                                    // v1.0.5 zusätzliche Funktion: alias-Suche in allen ioBroker-DPs (unabhängig von history)
                                    
                                    let findOldDP                       = '0_userdata.0.history.findOldDPs';
                                    let findOldDPs_Old                  = findOldDP + '.old_DPs';
                                    let findOldDPs_Enabled              = findOldDP + '.enabled_DPs';
                                    let findOldDPs_InDB                 = findOldDP + '.inDB_DPS';
                                    let findOldDPs_BeginTS              = findOldDP + '.dirStart';
                                    let findOldDPs_EndTS                = findOldDP + '.dirEnd';
                                    let findOldDPs_Start                = findOldDP + '.start';
                                    let findOldDPs_DirectDel            = findOldDP + '.directDelete';
                                    let findOldDPs_fillEnabled          = findOldDP + '.fillEnabled_DPs';
                                    let findOldDPs_fillAlias            = findOldDP + '.fillWithAliasId';
                                    let findoldDPs_withAliasId          = findOldDP + '.withAliasId_DPs';
                                    let findOldDPs_useAliasInEnabled    = findOldDP + '.useAliasIdInEnabled';
                                    
                                    let findOldDPs_aliasDPs             = findOldDP + '.aliasDPs';
                                    let findOldDPs_aliasDPs_search      = findOldDP + '.aliasDPs_search'; 
                                    createStateAsync(findOldDPs_aliasDPs, {read: true, write: true, name: "ioBroker-DPs mit aliasId (unabhängig history)", type: "string", role: "text", def: JSON.stringify([]) });
                                    createStateAsync(findOldDPs_aliasDPs_search, {read: true, write: true, name: "Start Suche aliasIds in all ioBroker DPs", type: "boolean", role: "button", def: false });
                                    
                                    let dbNamespace = 'history.0';
                                    
                                    
                                    //createStateAsync(findOldDPs_Old, {read: true, write: true, name: "JSON für nicht genutzte DPs noch in DB", type: "string", role: "text", def: JSON.stringify([]) });
                                    createStateAsync(findOldDPs_Enabled, {read: true, write: true, name: "Aktive History-DPs in DB", type: "string", role: "text", def: JSON.stringify([]) });
                                    createStateAsync(findoldDPs_withAliasId, {read: true, write: true, name: "Aktive History-DPs mit aliasId", type: "string", role: "text", def: JSON.stringify([]) });
                                    //createStateAsync(findOldDPs_InDB, {read: true, write: true, name: "Genutzte DPs in DB", type: "string", role: "text", def: JSON.stringify([]) });
                                    createStateAsync(findOldDPs_BeginTS, {read: true, write: true, name: "Startverzeichnis", type: "number", role: "", def: 0 });
                                    createStateAsync(findOldDPs_EndTS, {read: true, write: true, name: "Endverzeichnis", type: "number", role: "", def: 10 }); //new Date().getTime()
                                    createStateAsync(findOldDPs_Start, {read: true, write: true, name: "Start Suche", type: "boolean", role: "button", def: false });
                                    createStateAsync(findOldDPs_fillEnabled, {read: true, write: true, name: "enabled_DPs suchen", type: "boolean", role: "button", def: false });
                                    createStateAsync(findOldDPs_fillAlias, {read: true, write: true, name: "withAliasId suchen", type: "boolean", role: "button", def: false });
                                    createStateAsync(findOldDPs_DirectDel, {read: true, write: true, name: "!!! Daten direkt löschen !!!", type: "boolean", role: "", def: false });
                                    createStateAsync(findOldDPs_useAliasInEnabled, {read: true, write: true, name: "AliasId in Enabled_DPs", type: "boolean", role: "", def: false });
                                    
                                    on({id: findOldDPs_Start, change: "any"}, function (obj) {
                                        let value = obj.state.val;
                                        if (value){
                                            //setState(findOldDPs_EndTS,parseInt(new Date().getTime()),false);
                                            getEnabledHistoryDPs(dbNamespace);
                                            let fromDir = getState(findOldDPs_BeginTS).val;
                                            let toDir = getState(findOldDPs_EndTS).val;
                                            setTimeout(function(){
                                                searchDir(fromDir,toDir);
                                            },5000);
                                            setStateDelayed(findOldDPs_Start,false,3000,false);
                                        }
                                    });
                                    
                                    on({id: findOldDPs_fillEnabled, change: "any"}, function (obj) {
                                        let value = obj.state.val;
                                        if (value){
                                            getEnabledHistoryDPs(dbNamespace);
                                            setStateDelayed(findOldDPs_fillEnabled,false,3000,false);
                                        }
                                    });
                                    
                                    on({id: findOldDPs_fillAlias, change: "any"}, function (obj) {
                                        let value = obj.state.val;
                                        if (value){
                                            listHistoryDPsWithaliasId(dbNamespace);
                                            setStateDelayed(findOldDPs_fillAlias,false,3000,false);
                                        }
                                    });
                                    
                                    on({id: findOldDPs_aliasDPs_search, change: "any"}, function (obj) {
                                        let value = obj.state.val;
                                        if (value){
                                            findDPsWithAliasId(); 
                                            setStateDelayed(findOldDPs_aliasDPs_search,false,3000,false);
                                        }
                                    });
                                    //listHistoryDPsWithaliasId('history.0');
                                    
                                    function listHistoryDPsWithaliasId(adp){
                                        let arr =[];
                                        sendTo(adp, 'getEnabledDPs', {}, function (result) {
                                            let count = 0;
                                            for ( let dp in result){
                                                let dpHistoryAlias = getObject(dp).common.custom[adp].aliasId;
                                                if (dpHistoryAlias != '' && dpHistoryAlias != undefined){
                                                    arr.push({'dpId':dp,'aliasId':dpHistoryAlias});
                                                    count++;
                                                }
                                            }
                                            log('Anzahl der aktiv geloggten DPs mit aliasId: '+count);        
                                            // setStateAsync(findOldDPs_Enabled,JSON.stringify(arr),false);
                                            //log(JSON.stringify(arr));
                                            setState(findoldDPs_withAliasId,JSON.stringify(arr),false);
                                        });
                                    }
                                    
                                    //findDPsWithAliasId(); 
                                    
                                    function findDPsWithAliasId(){
                                        let allDPs = $('*');
                                        let arr = [];
                                        log('Anzahl der States: '+allDPs.length);
                                        for (let i=0;i<allDPs.length;i++){
                                            if (existsObject(allDPs[i])){
                                                if (getObject(allDPs[i]).common != undefined){
                                                    if (getObject(allDPs[i]).common.alias!= undefined){
                                                        let aliasId = getObject(allDPs[i]).common.alias.id;
                                                        if (aliasId != undefined){
                                                            //log(allDPs[i] +' mit aliasId: '+aliasId);
                                                            //break;
                                                            arr.push({'id':allDPs[i],'aliasId':aliasId});
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                        //log(arr);
                                        setState(findOldDPs_aliasDPs,JSON.stringify(arr),false);
                                    }
                                    
                                    
                                    /*
                                    setTimeout(function(){
                                        getEnabledHistoryDPs(db);
                                        getHistoryDPinDB(db);
                                    },3000);
                                    */
                                    
                                    // getEnabledHistoryDPs('history.0');
                                    
                                    function getEnabledHistoryDPs(adp){
                                        let arr =[];
                                        let useAliasIdInenabled = getState(findOldDPs_useAliasInEnabled).val;
                                        sendTo(adp, 'getEnabledDPs', {}, function (result) {
                                            let count = 0;
                                            for ( let dp in result){
                                                let dpHistoryAlias = getObject(dp).common.custom[adp].aliasId;
                                                if (dpHistoryAlias != '' && dpHistoryAlias != undefined && useAliasIdInenabled){
                                                    arr.push(dpHistoryAlias);
                                                }else{
                                                    arr.push(dp);
                                                }
                                                count++;
                                            }
                                            log('Anzahl der aktiv geloggten DPs: '+count);        
                                            setStateAsync(findOldDPs_Enabled,JSON.stringify(arr),false);
                                        });
                                    }
                                    
                                    // getHistoryDPinDB('history.0');
                                    
                                    function getHistoryDPinDB(db){
                                        //Die 50 zuletzt gespeicherte Ereignisse für alle IDs holen:
                                        let beginTS = getState(findOldDPs_BeginTS).val;
                                        if (beginTS == 0){
                                            beginTS = parseInt(new Date().getTime()) - 30*24*60*60*1000;
                                        }
                                        let endTS = getState(findOldDPs_EndTS).val;
                                        if(endTS == 0){
                                            endTS = parseInt(new Date().getTime());
                                        }
                                        sendTo(db, 'getHistory', {
                                            id: '*',
                                            options: {
                                                begin: beginTS,
                                                end:   endTS,
                                                /* count:     50,*/
                                                addId:     true
                                            }
                                        }, function (result) {
                                            let dpArr =[];
                                            let count = 0;
                                            for (var i = 0; i < result.result.length; i++) {
                                                if (!isObjInArray(dpArr,result.result[i].id)){
                                                    dpArr.push(result.result[i].id);
                                                    count++;
                                                }
                                                //console.log(JSON.stringify(result.result[i]) + ' ' + new Date(result.result[i].ts).toISOString());
                                            }
                                            dpArr = dpArr.sort(function(a, b) {
                                                    return a > b;
                                                    });
                                            setStateAsync(findOldDPs_InDB,JSON.stringify(dpArr),false);
                                            //log('Anzahl der DPs in dem durchsuchten Bereich:'+count);
                                            log(count+' unterschiedliche DPs in "inDB" von '+ formatDate(beginTS,'DD.MM.YYYY hh:mm:ss')+' - '+formatDate(endTS,'DD.MM.YYYY hh:mm:ss'));
                                            //Vergleich der DPs
                                            let nonActiveArr = [];
                                            let activeDPs = JSON.parse(getState(findOldDPs_Enabled).val);
                                            for (let i=0; i< dpArr.length;i++){
                                                // dpArr[i]
                                                let vorhanden = false;
                                                for (let  j=0; j< activeDPs.length;j++ ){
                                                    if (dpArr[i] === activeDPs[j]){
                                                        vorhanden = true;
                                                        break; // vorhanden
                                                    }
                                                }
                                                if (!vorhanden){
                                                    // wird nicht mehr geloggt von active
                                                    nonActiveArr.push(dpArr[i]);
                                                }
                                            }
                                            setState(findOldDPs_Old,JSON.stringify(nonActiveArr),false);
                                        });
                                    }
                                    
                                    
                                    
                                    
                                    function isObjInArray(arr,itemObj){
                                        if (arr.length>0){
                                            for (let x=0;x<arr.length-1;x++){
                                                if (JSON.stringify(arr[x]) === JSON.stringify(itemObj)){
                                                    return true;
                                                }
                                            }
                                            return false;
                                        }else{
                                            return false;
                                        }
                                    }
                                    
                                    // searchDir(0,10);
                                    
                                    function searchDir(fromDir, toDir){
                                        let fs = require('fs');
                                        let activeDPs = JSON.parse(getState(findOldDPs_Enabled).val);
                                        let notActiveDPs = [];
                                        let sysAdaptDir = getObject('system.adapter.'+dbNamespace).native.storeDir;
                                        fs.readdir(sysAdaptDir , function (erro, file) {
                                            log(file.length+' Verzeichnisse wurde(n) gelesen!');
                                            log('fromDir und toDir dürfen nur im Bereich von 0 bis '+file.length +' sein! Bitte in 10er-Schritten verwenden!');
                                            log('Es wurde ein Bereich von '+fromDir +' bis '+ toDir+' gewählt-> es dauert '+(toDir-fromDir)*2 +' Sekunden');
                                            if (fromDir <0 || toDir >file.length){
                                    
                                            }else{
                                                for (let j=fromDir; j<toDir; j++){
                                                    //log(file[j]);
                                                    if (file[j].indexOf('.')>=0 && file[j].length >8){
                                    
                                                    }else{
                                                        fs.readdir(sysAdaptDir+'/'+file[j] , function (error, files) {
                                                            log(files.length+' DPs im Verzeichnis: '+file[j]);
                                                            for (let i=0;i< files.length; i++){
                                                                let dpFiles = files[i].substring(8,files[i].length-5);
                                                                if (isObjInArray(activeDPs,dpFiles)){
                                                                }else{
                                                                    notActiveDPs.push({'id':dpFiles,'dir':file[j]});
                                                                }
                                                            }
                                                        });
                                                        //fs.unlinkSync('/opt/iobroker/iobroker-data/files/vis.0/'+jarvisDirName+'/'+files[i]+'/'+file[j]);
                                                    }
                                                }
                                                setTimeout(function(){
                                                    log('Nicht aktive DPs in den ausgewählten Verzeichnissen: '+notActiveDPs.length);
                                                    let olddir= '';
                                                    let directDelete = getState(findOldDPs_DirectDel).val;
                                                    for (let i=0;i<notActiveDPs.length;i++){
                                                        if (directDelete){
                                                            // Direkt löschen
                                                            fs.unlinkSync(sysAdaptDir+'/'+notActiveDPs[i].dir+'/history.'+notActiveDPs[i].id+'.json');
                                                        }
                                                        if (notActiveDPs[i].dir != olddir){
                                                            if (directDelete){
                                                                log('Im Verzeichnis: '+notActiveDPs[i].dir +' folgende Dateien sind gelöscht!:','warn');
                                                            }else{
                                                                log('Im Verzeichnis: '+notActiveDPs[i].dir +' können folgende Dateien gelöscht werden:','warn');
                                                            }
                                                            olddir = notActiveDPs[i].dir;
                                                        }
                                                        log(notActiveDPs[i].id);
                                                    }
                                                },2000 * (toDir-fromDir)); // file.length
                                            }
                                        });
                                        
                                    }
                                    
                                    Homoran 1 Reply Last reply Reply Quote 0
                                    • Homoran
                                      Homoran Global Moderator Administrators @Matt77CHE last edited by Homoran

                                      @matt77che da steht kein length an der genannten Stelle

                                      @matt77che sagte in ehemalige Historydaten finden:

                                      let fs = require('fs');

                                      kann es sein, dass du fs noch als npm modul hinzufügen musst?

                                      M 2 Replies Last reply Reply Quote 0
                                      • M
                                        Matt77CHE @Homoran last edited by

                                        @homoran

                                        Im To Do steht, die dirStart und dirEnd setzen und dann den Start Button drücken; mehr nicht

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

                                          @homoran sagte in ehemalige Historydaten finden:

                                          @matt77che da steht kein length an der genannten Stelle

                                          @matt77che sagte in ehemalige Historydaten finden:

                                          let fs = require('fs');

                                          kann es sein, dass du fs noch als npm modul hinzufügen musst?

                                          habe ich gerade kontrolliert - ja dem ist so, das fehlt noch! - was muss ich da genau eintragen?

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

                                            @matt77che sagte in ehemalige Historydaten finden:

                                            was muss ich da genau eintragen?

                                            fs <enter>

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate
                                            FAQ Cloud / IOT
                                            HowTo: Node.js-Update
                                            HowTo: Backup/Restore
                                            Downloads
                                            BLOG

                                            701
                                            Online

                                            31.6k
                                            Users

                                            79.5k
                                            Topics

                                            1.3m
                                            Posts

                                            7
                                            148
                                            7343
                                            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