Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Pegelwerte Fritzbox 6490 Cable auslesen?

    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

    Pegelwerte Fritzbox 6490 Cable auslesen?

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

      @fastfoot Das hat auch nicht geholfen ...

      2024-07-04 07:22:00.197 - info: javascript.0 (33499) script.js.Fritzbox.DOCSISV01: status 200
      2024-07-04 07:22:00.198 - info: javascript.0 (33499) script.js.Fritzbox.DOCSISV01: headers cache-control: no-cache, no-cache, no-store, must-revalidate
      connection: close
      content-type: text/html; charset=utf-8
      date: Thu, 04 Jul 2024 05:22:00 GMT
      expires: -1
      pragma: no-cache
      x-frame-options: SAMEORIGIN
      x-xss-protection: 1; mode=block
      x-content-type-options: nosniff
      content-security-policy: default-src 'none'; connect-src 'self'; font-src 'self'; frame-src https://service.avm.de https://fritzhelp.avm.de/help/ https://help.avm.de https://www.avm.de https://avm.de https://assets.avm.de https://clickonce.avm.de http://clickonce.avm.de http://download.avm.de https://download.avm.de 'self'; img-src 'self' https://tv.avm.de https://help.avm.de/images/ http://help.avm.de/images/ data:; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; frame-ancestors 'self'; media-src 'self'
      2024-07-04 07:22:00.199 - info: javascript.0 (33499) script.js.Fritzbox.DOCSISV01: data:
      2024-07-04 07:22:00.204 - error: javascript.0 (33499) Error in callback: SyntaxError: Unexpected token '<', ")
      2024-07-04 07:22:00.205 - error: javascript.0 (33499) at Object. (script.js.Fritzbox.DOCSISV01:292:30)
      2024-07-04 07:22:00.205 - error: javascript.0 (33499) at /opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1242:38
      2024-07-04 07:22:00.206 - error: javascript.0 (33499) at processTicksAndRejections (node:internal/process/task_queues:95:5)
      
      
      MartinP 1 Reply Last reply Reply Quote 0
      • MartinP
        MartinP @MartinP last edited by MartinP

        Das ist der httpPost

        script.js.Fritzbox.DOCSISV01: httpPost(config={"method":"post","url":"http://192.168.2.1/data.lua","responseType":"text","responseEncoding":"utf8","timeout":2000,"headers":{"User-Agent":"Mozilla/5.0 (X11; Linux i686; rv:109.0) Gecko/20100101 Firefox/121.0","Content-Type":"application/x-www-form-urlencoded"},"data":{"title":"channels","body":"xhr=1&sid=4........................&lang=de&page=docInfo&xhrId=all&no_sidrenew=","user_id":"1"}}, data=[object Object])
        

        Auch das geht nicht:

        	script.js.Fritzbox.DOCSISV01: httpPost(config={"method":"post","url":"http://192.168.2.1/data.lua","responseType":"text","responseEncoding":"utf8","timeout":2000,"headers":{"User-Agent":"Mozilla/5.0 (X11; Linux i686; rv:109.0) Gecko/20100101 Firefox/121.0","Content-Type":"application/x-www-form-urlencoded","Authorization":"Bearer ae..............b"},"data":{"title":"channels","body":"xhr=1&sid=ae................b&lang=de&page=docInfo&xhrId=all&no_sidrenew=","user_id":"1"}}, data=[object Object])
        
        MartinP 1 Reply Last reply Reply Quote 0
        • MartinP
          MartinP @MartinP last edited by

          Da kann man ja manisch werden, bei dieser Bastelei... ziemlich sperrig die neuen Funktionen ...

          Das ist das, was zwischen Firefox und Fritzbox beim httpPost ausgetauscht wird ...

          02ee9ac1-2030-4889-9805-3a77d148b8b4-grafik.png

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

            @martinp ich mag diese httpGet und httpPost nicht sonderlich, obwohl die Idee dahinter schon sehr gut ist. Mir fehlen da die Async Functionen um die awaiten zu können. Deshalb bevorzuge ich axios direkt, schon wegen der Doku. Anyway, hier sind zwei simple Wrapper die du verwenden kannst, wenn es dir nur um den reinen Aufruf geht dann nimmst du nur die innersten Aufrufe. Ist getestet.

            const httpGetAsync = (url, options) => {
                return new Promise((resolve) => {
                    httpGet(url, options, (err, res) => {
                        if (res.statusCode === 200) {
                            resolve(res)
                        };
                    })
                })
            }
            const httpPostAsync = (url, data, options) => {
                return new Promise((resolve) => {
                    httpPost(url, data, options, (err, res) => {
                        if (res.statusCode === 200) {
                            resolve(res)
                        };
                    })
                })
            }
            // url und data können aus den Options extrahiert werden
            
            MartinP 1 Reply Last reply Reply Quote 0
            • MartinP
              MartinP @fastfoot last edited by

              @fastfoot Die Fritzbox schickt ja schon etwas zurück - das ist aber nicht die JSON-Tabelle, die ich erwarten würde ...

              Ich vermute ja noch immer, dass da irgendetwas in dem, was ich dem httpPost() übergebe nicht korrekt ist... Werde das aber trotzdem mal probieren

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

                @martinp das ist mit der FB getestet 🙂

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

                  @fastfoot den Status 200 habe ich ja auch schon hinbekommen, nur war der Rest des Ergebnisses zwar VIEL, aber völlig unbrauchbar .....Hilfstexte von AVM usw ...

                  	script.js.Fritzbox.DOCSISV01: data: <!DOCTYPE html> <html lang="de"> <head> <meta http-equiv=content-type content="text/html; charset=utf-8" /> <meta http-equiv="Cache-Control" content="private, no-transform" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="format-detection" content="telephone=no" /> <meta http-equiv="x-rim-auto-match" content="none" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes, minimal-ui" /> <meta name="mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> <meta http-equiv="cleartype" content="on"> <link rel="icon" href="/favicon.ico" size="16x16"/> <link rel="icon" href="/icon.svg" type="image/svg+xml"/> <link rel="icon" href="/icon.png" type="image/png"/> <link rel="apple-touch-icon" href="/apple-touch-icon.png" /> <link rel="apple-touch-startup-image" href="/apple-touch-icon.png" /> <style> /*@font-face { font-family: 'Source Sans Pro'; font-style: italic; font-stretch: normal; font-weight: 400; src: url('/assets/fonts/SourceSansPro-Italic.woff2') format('woff2'); }*/ @font-face { font-family: 'Source Sans Pro'; font-style: normal; font-stretch: normal; font-weight: 400; src: url('/assets/fonts/source-sans-pro-v11-latin-ext_latin-regular.woff2') format('woff2'); } @font-face { font-family: 'Source Sans Pro'; font-style: normal; font-stretch: normal; font-weight: 600; src: url('/assets/fonts/source-sans-pro-v11-latin-ext_latin-600.woff2') format('woff2'); } @font-face { font-family: 'Source Sans Pro'; font-style: normal; font-stretch: normal; font-weight: 900; src: url('/assets/fonts/SourceSansPro-Black.woff2') format('woff2'); } html, input, textarea, keygen, select, button { font-family: 'Source Sans Pro', Arial, sans-serif; font-size: 100%; } </style> <link rel="stylesheet" type="text/css" href="/css/box.css"> <link rel='stylesheet' type='text/css' href="/css/rd/login.css"/> <title> FRITZ!Box </title> </head> <body> <script> var gNbc = false; </script> <script src="/js/browser.js"></script> <script src="/js/vendor.js"></script> <script src="/js/box-login.js"></script> <script type="module"> import { setConfig } from "/js/config.js"; import login from "/js/login.js"; setConfig({"ZIGBEE":false,"GUI_IS_POWERLINE":false,"isDebug":false,"gu_type":"release","WLAN":{"is_double_wlan":false},"GUI_IS_REPEATER":false,"GUI_IS_GATEWAY":false,"language":"de","GUI_HIDE_TEASER":false}); const data = {"firstTenMin":fa
                  
                  F 1 Reply Last reply Reply Quote 0
                  • F
                    fastfoot @MartinP last edited by fastfoot

                    @martinp options und Aufruf?

                    Edit: Wenn wie weiter oben dann mal mit meinem Aufruf vergleichen!

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

                      @fastfoot

                      Das hatte ich als Gedächtnisstütze für die vorherige Version auskommentiert behalten

                      //    var options = {
                      //        url: docsisURL, 
                      //        method: 'POST',
                      //        headers: {
                      //            'Content-Type': 'application/x-www-form-urlencoded'
                      //        },
                      //        body: 'xhr=1&sid=' + sid + '&lang=de&page=docInfo&xhrId=all&no_sidrenew='
                      //    };toString
                      //    request(options, function(error, response, body) 
                      

                      Da der Beginn der Auswerteroutine - mit viel Logging aktuell -

                            httpPost(docsisURL, 
                              {
                      //            title : 'channels',
                                  body: 'xhr=1&sid=' + sid + '&lang=de&page=docinfo&xhrId=all&no_sidrenew=',
                      //            user_id : '1'
                              }, 
                              {
                      
                                  timeout: 2000,
                                  // responseType: 'arraybuffer',
                      //            bearerAuth: sid,
                                  headers: {
                                     'Content-Type': 'application/x-www-form-urlencoded'
                                  },
                              },
                              (error, response) => {
                              if (!error && response.statusCode == 200) {
                                  log ('status ' + response.statusCode);
                                  log ('headers ' + response.headers);
                                  log ('data: ' + response.data);
                                  const body = response.data;
                                  // tableData = JSON.parse(body);
                                  tableData = response.data;
                                  if(tableData){
                      
                      F 2 Replies Last reply Reply Quote 0
                      • F
                        fastfoot @MartinP last edited by

                        @martinp

                        httpPost(url,options.body, options,callback)
                        

                        der zweite Parameter muss ein String sein und options wie im Original.

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

                          @martinp oder ganz konkret:

                          let data = `xhr=1&sid=${SID}&lang=de&page=${page}&xhrId=all`
                          let url = docsisURL;
                          let options = {
                              headers: {
                                  "Content-Type": "application/x-www-form-urlencoded",
                              },
                          }
                          httpPost(url, data, options, (err, res) => {
                              if (res.statusCode === 200) {
                                  let fbData = JSON.parse(res.data); // nur wenn ein JSON erwartet wird, 
                              }
                          })
                          
                          MartinP 1 Reply Last reply Reply Quote 0
                          • MartinP
                            MartinP @fastfoot last edited by

                            @fastfoot Wollte doch gerade zum Abendbrot gehen, aber jetzt juckt es in den Fingern 😉

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

                              @martinp ein simpler Test wäre dann console.log(fbData.timeTillLogout)). Sollte 1200 zeigen. Die eigentlichen Kanal-Daten finden sich in fbbData.data

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

                                @martinp Funktioniert immer noch nicht ...

                                Das ist der Aufruf

                                      httpPost(docsisURL, 
                                        'xhr=1&sid=' + sid + '&lang=de&page=docinfo&xhrId=all&no_sidrenew=',
                                        {
                                            headers: {
                                               'Content-Type': 'application/x-www-form-urlencoded'
                                            },
                                        },
                                        (error, response) => {
                                        if (!error && response.statusCode == 200) {
                                ....
                                
                                script.js.Fritzbox.DOCSISV01: httpPost(config={"method":"post","url":"http://192.168.2.1/data.lua","responseType":"text","responseEncoding":"utf8","timeout":2000,"headers":{"User-Agent":"Mozilla/5.0 (X11; Linux i686; rv:109.0) Gecko/20100101 Firefox/121.0","Content-Type":"application/x-www-form-urlencoded"},"data":"xhr=1&sid=6xxxxxxxxxxxxxxxx3c&lang=de&page=docinfo&xhrId=all&no_sidrenew="}, data=xhr=1&sid=6.................c&lang=de&page=docinfo&xhrId=all&no_sidrenew=)
                                
                                MartinP 1 Reply Last reply Reply Quote 0
                                • MartinP
                                  MartinP @MartinP last edited by

                                  @martinp

                                  GAAHH "page=docInfo" und nicht "page=docinfo" ...

                                  Jetzt funktioniert es .... Ein paar Werte sind auch schon über Influx in Grafana gelandet ...

                                  Schnell eine Sicherung machen, und später noch alles etwas von Logging "säubern" ...

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

                                    @martinp na dann viel Spass beim weiterbasteln 🙂

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

                                      @fastfoot Habe seit neuestem eine Gitea-Instanz in einem LXC-Container auf dem Proxmox auf dem auch der iob in einem LXC läuft aufgesetzt, auf der ich meine Scripte auch noch einmal sichere ... ansonsten ist das immer so ein Gehampel, die "Secrets" secret zu halten ...

                                      Man will ja nicht nach Github sein Fritzbox-Password hochladen ...

                                      I F 2 Replies Last reply Reply Quote 0
                                      • I
                                        ichderarnd @MartinP last edited by

                                        Cool, ich würde gerne mitmachen, muss arbeiten. Quartalsabrechnung 😞

                                        MartinP F 2 Replies Last reply Reply Quote 0
                                        • MartinP
                                          MartinP @ichderarnd last edited by

                                          @ichderarnd

                                          Hier ein Full-Quote des ganzen Scripts. Das ist aber womöglich ansonsten ein älterer Stand ggüb. Deinen Code, ich habe wohl recht früh geforkt ...

                                          // Version 0.1 -Build 1 03-JUL-2024
                                          // removed double Lines first try with httpGet, httpPush MP
                                          // Version 0.1-2 ß4-JUL-2024
                                          
                                          
                                          var logging = false;
                                          const iconv = require('iconv-lite');
                                          const crypto = require('crypto');
                                          
                                          var DOCSIS30DSChannels = 30;
                                          var DOCSIS31DSChannels = 2;
                                          var DOCSIS30USChannels = 4;
                                          var DOCSIS31USChannels = 1;
                                          
                                          var NullValue = null;
                                          var sid;
                                          var fritzBenutzer = '..........';
                                          var fritzPasswort = '.............';
                                          var loginURL = 'http://192.168.2.1/login_sid.lua?username=';
                                          var docsisURL = 'http://192.168.2.1/data.lua';
                                          var fritzboxJsonVersion = 2; // Version 1: Fritz OS 7.29, Version 2: Fritz OS 7.56
                                          
                                          // Downstream DOCSIS 3.0
                                          for (var i = 1; i <= 30; i++) {
                                              var Channel = 'C' + (i < 10 ? '0' + i.toString() : i.toString());
                                              createState('Internet.Docsis.DS.' + Channel + '.Frequency', 0, false, {
                                                  name: 'Frequency',
                                                  unit: 'MHz',
                                                  type: 'mixed',
                                                  role: 'state'
                                              });
                                              createState('Internet.Docsis.DS.' + Channel + '.Modulation', 0, false, {
                                                  name: 'Modulation',
                                                  unit: 'QAM',
                                                  type: 'mixed',
                                                  role: 'state'
                                              });
                                              createState('Internet.Docsis.DS.' + Channel + '.PowerLevel', 0, false, {
                                                  name: 'PowerLevel',
                                                  unit: 'dBmV',
                                                  type: 'mixed',
                                                  role: 'state'
                                              });
                                              createState('Internet.Docsis.DS.' + Channel + '.MSE', 0, false, {
                                                  name: 'MSE',
                                                  unit: 'dB',
                                                  type: 'mixed',
                                                  role: 'state'
                                              });
                                              createState('Internet.Docsis.DS.' + Channel + '.Latency', 0, false, {
                                                  name: 'Latency',
                                                  unit: 'ms',
                                                  type: 'mixed',
                                                  role: 'state'
                                              });
                                              createState('Internet.Docsis.DS.' + Channel + '.CorrectableErrors', 0, false, {
                                                  name: 'CorrectableErrors',
                                                  type: 'mixed',
                                                  role: 'state'
                                              });
                                              createState('Internet.Docsis.DS.' + Channel + '.CorrectableErrorsPerMinute', 0, false, {
                                                  name: 'CorrectableErrorsPerMinute',
                                                  type: 'mixed',
                                                  role: 'state'
                                              });
                                              createState('Internet.Docsis.DS.' + Channel + '.UncorrectableErrors', 0, false, {
                                                  name: 'UncorrectableErrors',
                                                  type: 'mixed',
                                                  role: 'state'
                                              });
                                              createState('Internet.Docsis.DS.' + Channel + '.UncorrectableErrorsPerMinute', 0, false, {
                                                  name: 'UncorrectableErrorsPerMinute',
                                                  type: 'mixed',
                                                  role: 'state'
                                              });
                                          }
                                          
                                          // Upstream DOCSIS 3.0
                                          for (var i = 0; i < 4; i++) {
                                              var Channel = 'C0' + i.toString();
                                              createState('Internet.Docsis.US.' + Channel + '.Frequency', 0, false, {
                                                  name: 'Frequency',
                                                  unit: 'MHz',
                                                  type: 'mixed',
                                                  role: 'state'
                                              });
                                              createState('Internet.Docsis.US.' + Channel + '.Modulation', 0, false, {
                                                  name: 'Modulation',
                                                  unit: 'QAM',
                                                  type: 'mixed',
                                                  role: 'state'
                                              });
                                              createState('Internet.Docsis.US.' + Channel + '.MultiplexMethod', 0, false, {
                                                  name: 'MultiplexMethod',
                                                  type: 'mixed',
                                                  role: 'state'
                                              });
                                              createState('Internet.Docsis.US.' + Channel + '.PowerLevel', 0, false, {
                                                  name: 'PowerLevel',
                                                  unit: 'dBmV',
                                                  type: 'mixed',
                                                  role: 'state'
                                              });
                                              createState('Internet.Docsis.US.' + Channel + '.ChannelID', 0, false, {
                                                  name: 'ChannelID',
                                                  type: 'mixed',
                                                  role: 'state'
                                              });
                                          }
                                          
                                          // Downstream DOCSIS 3.1
                                          createState('Internet.Docsis31.DS.C01.Frequency', 0, false, {
                                              name: 'Frequency',
                                              unit: 'MHz',
                                              type: 'mixed',
                                              role: 'state'
                                          });
                                          createState('Internet.Docsis31.DS.C01.Modulation', 0, false, {
                                              name: 'Modulation',
                                              unit: 'QAM',
                                              type: 'mixed',
                                              role: 'state'
                                          });
                                          createState('Internet.Docsis31.DS.C01.PowerLevel', 0, false, {
                                              name: 'PowerLevel',
                                              unit: 'dBmV',
                                              type: 'mixed',
                                              role: 'state'
                                          });
                                          createState('Internet.Docsis31.DS.C01.MSE', 0, false, {
                                              name: 'MSE',
                                              unit: 'dB',
                                              type: 'mixed',
                                              role: 'state'
                                          });
                                          createState('Internet.Docsis31.DS.C01.UncorrectableErrors', 0, false, {
                                              name: 'UncorrectableErrors',
                                              type: 'mixed',
                                              role: 'state'
                                          });
                                          createState('Internet.Docsis31.DS.C01.UncorrectableErrorsPerMinute', 0, false, {
                                              name: 'UncorrectableErrorsPerMinute',
                                              type: 'mixed',
                                              role: 'state'
                                          });
                                          createState('Internet.Docsis31.DS.C02.Frequency', 0, false, {
                                              name: 'Frequency',
                                              unit: 'MHz',
                                              type: 'mixed',
                                              role: 'state'
                                          });
                                          createState('Internet.Docsis31.DS.C02.Modulation', 0, false, {
                                              name: 'Modulation',
                                              unit: 'QAM',
                                              type: 'mixed',
                                              role: 'state'
                                          });
                                          createState('Internet.Docsis31.DS.C02.PowerLevel', 0, false, {
                                              name: 'PowerLevel',
                                              unit: 'dBmV',
                                              type: 'mixed',
                                              role: 'state'
                                          });
                                          createState('Internet.Docsis31.DS.C02.MSE', 0, false, {
                                              name: 'MSE',
                                              unit: 'dB',
                                              type: 'mixed',
                                              role: 'state'
                                          });
                                          createState('Internet.Docsis31.DS.C02.UncorrectableErrors', 0, false, {
                                              name: 'UncorrectableErrors',
                                              type: 'mixed',
                                              role: 'state'
                                          });
                                          createState('Internet.Docsis31.DS.C02.UncorrectableErrorsPerMinute', 0, false, {
                                              name: 'UncorrectableErrorsPerMinute',
                                              type: 'mixed',
                                              role: 'state'
                                          });
                                          
                                          // Upstream DOCSIS 3.1
                                          createState('Internet.Docsis31.US.C00.Frequency', 0, false, {
                                              name: 'Frequency',
                                              unit: 'MHz',
                                              type: 'mixed',
                                              role: 'state'
                                          });
                                          createState('Internet.Docsis31.US.C00.Modulation', 0, false, {
                                              name: 'Modulation',
                                              unit: 'QAM',
                                              type: 'mixed',
                                              role: 'state'
                                          });
                                          createState('Internet.Docsis31.US.C00.MultiplexMethod', 0, false, {
                                              name: 'MultiplexMethod',
                                              type: 'mixed',
                                              role: 'state'
                                          });
                                          createState('Internet.Docsis31.US.C00.FFT', 0, false, {
                                              name: 'FFT',
                                              unit: 'K',
                                              type: 'mixed',
                                              role: 'state'
                                          });
                                          createState('Internet.Docsis31.US.C00.PowerLevel', 0, false, {
                                              name: 'PowerLevel',
                                              unit: 'dBmV',
                                              type: 'mixed',
                                              role: 'state'
                                          });
                                          
                                          /**
                                           * Simple XML parser
                                           * @param {String} xml
                                           * @return {Object}
                                           */
                                          function parseXML(xml) {
                                          
                                              var beg = -1;
                                              var end = 0;
                                              var tmp = 0;
                                              var current = [];
                                              var obj = {};
                                              var from = -1;
                                          
                                              while (true) {
                                          
                                                  beg = xml.indexOf('<', beg + 1);
                                                  if (beg === -1)
                                                      break;
                                          
                                                  end = xml.indexOf('>', beg + 1);
                                                  if (end === -1)
                                                      break;
                                          
                                                  var el = xml.substring(beg, end + 1);
                                                  var c = el[1];
                                          
                                                  if (c === '?' || c === '/') {
                                          
                                                      var o = current.pop();
                                          
                                                      if (from === -1 || o !== el.substring(2, el.length - 1))
                                                          continue;
                                          
                                                      var path = current.join('.') + '.' + o;
                                                      var value = xml.substring(from, beg);
                                          
                                                      if (typeof(obj[path]) === 'undefined')
                                                          obj[path] = value;
                                                      else if (obj[path]instanceof Array)
                                                          obj[path].push(value);
                                                      else
                                                          obj[path] = [obj[path], value];
                                          
                                                      from = -1;
                                                      continue;
                                                  }
                                          
                                                  tmp = el.indexOf(' ');
                                                  var hasAttributes = true;
                                          
                                                  if (tmp === -1) {
                                                      tmp = el.length - 1;
                                                      hasAttributes = false;
                                                  }
                                          
                                                  from = beg + el.length;
                                          
                                                  var isSingle = el[el.length - 2] === '/';
                                                  var name = el.substring(1, tmp);
                                          
                                                  if (!isSingle)
                                                      current.push(name);
                                          
                                                  if (!hasAttributes)
                                                      continue;
                                          
                                                  var match = el.match(/\w+\=\".*?\"/g);
                                                  if (match === null)
                                                      continue;
                                          
                                                  var attr = {};
                                                  var length = match.length;
                                          
                                                  for (var i = 0; i < length; i++) {
                                                      var index = match[i].indexOf('"');
                                                      attr[match[i].substring(0, index - 1)] = match[i].substring(index + 1, match[i].length - 1);
                                                  }
                                          
                                                  obj[current.join('.') + (isSingle ? '.' + name : '') + '[]'] = attr;
                                              }
                                          
                                              return obj;
                                          };
                                          
                                          function loginAndGetSID() {
                                          
                                              sid = null;
                                          
                                              // Challenge holen
                                              // var options = {
                                              //    url: loginURL + fritzBenutzer,
                                              //    method: 'GET'
                                              // };
                                              // request(options, function(error, response, body)
                                          
                                              httpGet(loginURL + fritzBenutzer, (error, response) => {
                                                  if (!error && response.statusCode == 200) {
                                                      const body = response.data;
                                                      // log(' response:      ' + ', body: ' + body, 'info');
                                                      var result = parseXML(body);
                                                      var challenge = result['SessionInfo.Challenge'];
                                                      if (logging)
                                                          log('Challenge: ' + challenge);
                                          
                                                      // Einloggen und SID holen
                                                      var utf16le_encoded = iconv.encode(challenge + '-' + fritzPasswort, 'UTF-16LE', {
                                                          addBOM: false
                                                      });
                                                      var challengeResponse = crypto.createHash('md5').update(utf16le_encoded).digest('hex');
                                          
                                                      // options = {
                                                      //     url: loginURL + fritzBenutzer + '&response=' + challenge + '-' + challengeResponse,
                                                      //     method: 'GET'
                                                      // (8 )};
                                                      // request(options, function(error, response, body)
                                                      httpGet(loginURL + fritzBenutzer + '&response=' + challenge + '-' + challengeResponse, (error, response) => {
                                                          if (!error && response.statusCode == 200) {
                                                              const body = response.data;
                                                              var result = parseXML(body);
                                                              sid = result['SessionInfo.SID'];
                                                              if (logging)
                                                                  log('Logged in. SID = ' + sid, 'info');
                                                          } else {
                                                              log('error: ' + error + ', response: ' + response.statusCode.toString(), 'info');
                                                          }
                                                      });
                                                  } else {
                                                      log('error: ' + error + ', response: ' + response.statusCode.toString(), 'info');
                                                  }
                                              });
                                          }
                                          
                                          // Wenn keine Daten abgerufen werden konnten, werden die States auf NULL gesetzt
                                          function setStates2NullValues() {
                                          
                                              var NullValue = null;
                                          
                                              // DOCSIS 3.0 Downstream Channels
                                              for (i = 0; i < DOCSIS30DSChannels; i++) {
                                                  setState('Internet.Docsis.DS.C' + (i < 10 ? '0' : '') + i.toString() + '.Frequency', NullValue, true);
                                                  setState('Internet.Docsis.DS.C' + (i < 10 ? '0' : '') + i.toString() + '.Modulation', NullValue, true);
                                                  setState('Internet.Docsis.DS.C' + (i < 10 ? '0' : '') + i.toString() + '.PowerLevel', NullValue, true);
                                                  setState('Internet.Docsis.DS.C' + (i < 10 ? '0' : '') + i.toString() + '.MSE', NullValue, true);
                                                  setState('Internet.Docsis.DS.C' + (i < 10 ? '0' : '') + i.toString() + '.Latency', NullValue, true);
                                                  setState('Internet.Docsis.DS.C' + (i < 10 ? '0' : '') + i.toString() + '.CorrectableErrors', NullValue, true);
                                                  setState('Internet.Docsis.DS.C' + (i < 10 ? '0' : '') + i.toString() + '.CorrectableErrorsPerMinute', NullValue, true);
                                                  setState('Internet.Docsis.DS.C' + (i < 10 ? '0' : '') + i.toString() + '.UncorrectableErrors', NullValue, true);
                                                  setState('Internet.Docsis.DS.C' + (i < 10 ? '0' : '') + i.toString() + '.UncorrectableErrorsPerMinute', NullValue, true);
                                              }
                                          
                                              // DOCSIS 3.1 Downstream Channel
                                              setState('Internet.Docsis31.DS.C01.PowerLevel', NullValue, true);
                                              setState('Internet.Docsis31.DS.C01.MSE', NullValue, true);
                                              setState('Internet.Docsis31.DS.C01.Modulation', NullValue, true);
                                              setState('Internet.Docsis31.DS.C01.Frequency', NullValue, true);
                                              setState('Internet.Docsis31.DS.C01.UncorrectableErrors', NullValue, true);
                                              setState('Internet.Docsis31.DS.C01.UncorrectableErrorsPerMinute', NullValue, true);
                                              setState('Internet.Docsis31.DS.C02.PowerLevel', NullValue, true);
                                              setState('Internet.Docsis31.DS.C02.MSE', NullValue, true);
                                              setState('Internet.Docsis31.DS.C02.Modulation', NullValue, true);
                                              setState('Internet.Docsis31.DS.C02.Frequency', NullValue, true);
                                              setState('Internet.Docsis31.DS.C02.UncorrectableErrors', NullValue, true);
                                              setState('Internet.Docsis31.DS.C02.UncorrectableErrorsPerMinute', NullValue, true);
                                          
                                              // DOCSIS 3.0 Upstream Channels
                                              for (i = 0; i < DOCSIS30USChannels; i++) {
                                                  setState('Internet.Docsis.US.C' + (i < 10 ? '0' : '') + i.toString() + '.Frequency', NullValue, true);
                                                  setState('Internet.Docsis.US.C' + (i < 10 ? '0' : '') + i.toString() + '.Modulation', NullValue, true);
                                                  setState('Internet.Docsis.US.C' + (i < 10 ? '0' : '') + i.toString() + '.MultiplexMethod', NullValue, true);
                                                  setState('Internet.Docsis.US.C' + (i < 10 ? '0' : '') + i.toString() + '.PowerLevel', NullValue, true);
                                                  setState('Internet.Docsis.US.C' + (i < 10 ? '0' : '') + i.toString() + '.ChannelID', NullValue, true);
                                              }
                                          
                                              // DOCSIS 3.1 Upstream Channel
                                              setState('Internet.Docsis31.US.C00.PowerLevel', NullValue, true);
                                              setState('Internet.Docsis31.US.C00.Modulation', NullValue, true);
                                              if (fritzboxJsonVersion == 1) {
                                                  setState('Internet.Docsis31.US.C00.MultiplexMethod', NullValue, true);
                                              } else {
                                                  setState('Internet.Docsis31.US.C00.FFT', NullValue, true);
                                              }
                                              setState('Internet.Docsis31.US.C00.Frequency', NullValue, true);
                                          }
                                          
                                          // Holt die Informationen von der Fritzbox Benutzeroberfläche. Ab fritz.OS Version 7.2x werden die Informationen als JSON-String übermittelt (getCableModemChannelInfos Version 2)
                                          function getCableModemChannelInfosV2() {
                                          
                                              // const list = getSchedules(true);
                                              // list.forEach(schedule => log(JSON.stringify(schedule)));
                                          
                                          
                                              if (logging)
                                                  log('Schedule V6 Started');
                                              var NullValue = null;
                                              var tableData;
                                          
                                              //    var options = {
                                              //        url: docsisURL,
                                              //        method: 'POST',
                                              //        headers: {
                                              //            'Content-Type': 'application/x-www-form-urlencoded'
                                              //        },
                                              //        body: 'xhr=1&sid=' + sid + '&lang=de&page=docInfo&xhrId=all&no_sidrenew='
                                              //    };toString
                                              //    request(options, function(error, response, body)
                                              // xhr	"1"
                                              // && sid	"e88a7fea301a9529"
                                              // lang	"de"
                                              // page	"docOv"
                                              // xhrId	"all"
                                              httpPost(docsisURL,
                                                  'xhr=1&sid=' + sid + '&lang=de&page=docInfo&xhrId=all&no_sidrenew=', {
                                                  headers: {
                                                      'Content-Type': 'application/x-www-form-urlencoded'
                                                  },
                                              },
                                                  (error, response) => {
                                                  if (!error && response.statusCode == 200) {
                                                      const body = response.data;
                                                      tableData = JSON.parse(body);
                                                      if (tableData) {
                                                          // console.log(tableData.timeTillLogout);
                                                          // DOCSIS 3.0 Downstream Channels
                                          
                                          
                                                          DOCSIS30DSChannels = Object.entries(tableData.data.channelDs.docsis30).length;
                                                          if (logging)
                                                              log('DOCSIS30DSChannels: ' + DOCSIS30DSChannels.toString(), 'info');
                                          
                                                          for (i = 0; i < DOCSIS30DSChannels; i++) {
                                          
                                                              var channelID = parseInt(tableData.data.channelDs.docsis30[i].channelID);
                                          
                                                              setState('Internet.Docsis.DS.C' + (channelID < 10 ? '0' : '') + tableData.data.channelDs.docsis30[i].channelID + '.Frequency', parseInt(tableData.data.channelDs.docsis30[i].frequency), true);
                                                              if (fritzboxJsonVersion == 1) {
                                                                  setState('Internet.Docsis.DS.C' + (channelID < 10 ? '0' : '') + tableData.data.channelDs.docsis30[i].channelID + '.Modulation', parseInt(tableData.data.channelDs.docsis30[i].type.replace('QAM', '')), true);
                                                              } else {
                                                                  setState('Internet.Docsis.DS.C' + (channelID < 10 ? '0' : '') + tableData.data.channelDs.docsis30[i].channelID + '.Modulation', parseInt(tableData.data.channelDs.docsis30[i].modulation.replace('QAM', '')), true);
                                                              }
                                                              setState('Internet.Docsis.DS.C' + (channelID < 10 ? '0' : '') + tableData.data.channelDs.docsis30[i].channelID + '.PowerLevel', parseFloat(tableData.data.channelDs.docsis30[i].powerLevel), true);
                                                              setState('Internet.Docsis.DS.C' + (channelID < 10 ? '0' : '') + tableData.data.channelDs.docsis30[i].channelID + '.MSE', parseFloat(tableData.data.channelDs.docsis30[i].mse), true);
                                                              setState('Internet.Docsis.DS.C' + (channelID < 10 ? '0' : '') + tableData.data.channelDs.docsis30[i].channelID + '.Latency', parseFloat(tableData.data.channelDs.docsis30[i].latency), true);
                                          
                                                              var correctableErrors = getState('Internet.Docsis.DS.C' + (channelID < 10 ? '0' : '') + tableData.data.channelDs.docsis30[i].channelID + '.CorrectableErrors');
                                                              var lastValue = correctableErrors.val;
                                                              var lastTimeStamp = correctableErrors.ts;
                                                              var newValue = parseInt(tableData.data.channelDs.docsis30[i].corrErrors);
                                                              setState('Internet.Docsis.DS.C' + (channelID < 10 ? '0' : '') + tableData.data.channelDs.docsis30[i].channelID + '.CorrectableErrors', newValue, true);
                                          
                                                              // Sicherstellen, dass der letzte und der neue Wert nicht NULL sind und dann die Differenz zum letzten Wert berechnen
                                                              if (lastValue != null && newValue != null && lastTimeStamp != null) {
                                                                  var ts_diff = new Date().getTime() - lastTimeStamp;
                                                                  // Die Differenz zum letzten Wert nur dann speichern, wenn dieser ca. 1 Min. alt ist
                                                                  if (ts_diff > 40000 && ts_diff < 80000 && newValue >= lastValue) {
                                                                      setState('Internet.Docsis.DS.C' + (channelID < 10 ? '0' : '') + tableData.data.channelDs.docsis30[i].channelID + '.CorrectableErrorsPerMinute', newValue - lastValue, true);
                                                                  } else {
                                                                      setState('Internet.Docsis.DS.C' + (channelID < 10 ? '0' : '') + tableData.data.channelDs.docsis30[i].channelID + '.CorrectableErrorsPerMinute', NullValue, true);
                                                                  }
                                                              }
                                          
                                                              var uncorrectableErrors = getState('Internet.Docsis.DS.C' + (channelID < 10 ? '0' : '') + tableData.data.channelDs.docsis30[i].channelID + '.UncorrectableErrors');
                                                              lastValue = uncorrectableErrors.val;
                                                              lastTimeStamp = uncorrectableErrors.ts;
                                                              newValue = parseInt(tableData.data.channelDs.docsis30[i].nonCorrErrors);
                                                              setState('Internet.Docsis.DS.C' + (channelID < 10 ? '0' : '') + tableData.data.channelDs.docsis30[i].channelID + '.UncorrectableErrors', newValue, true);
                                          
                                                              // Sicherstellen, dass der letzte und der neue Wert nicht NULL sind und dann die Differenz zum letzten Wert berechnen
                                                              if (lastValue != null && newValue != null && lastTimeStamp != null) {
                                                                  ts_diff = new Date().getTime() - lastTimeStamp;
                                                                  // Die Differenz zum letzten Wert nur dann speichern, wenn dieser ca. 1 Min. alt ist
                                                                  if (ts_diff > 40000 && ts_diff < 80000 && newValue >= lastValue) {
                                                                      setState('Internet.Docsis.DS.C' + (channelID < 10 ? '0' : '') + tableData.data.channelDs.docsis30[i].channelID + '.UncorrectableErrorsPerMinute', newValue - lastValue, true);
                                                                  } else {
                                                                      setState('Internet.Docsis.DS.C' + (channelID < 10 ? '0' : '') + tableData.data.channelDs.docsis30[i].channelID + '.UncorrectableErrorsPerMinute', NullValue, true);
                                                                  }
                                                              }
                                                          }
                                          
                                                          // DOCSIS 3.1 Downstream Channel
                                                          if (tableData.data.channelDs.docsis31 != null) {
                                                              DOCSIS31DSChannels = Object.entries(tableData.data.channelDs.docsis31).length;
                                                              if (logging)
                                                                  log('DOCSIS31DSChannels: ' + DOCSIS31DSChannels.toString(), 'info');
                                          
                                                              if (DOCSIS31DSChannels > 0) {
                                                                  setState('Internet.Docsis31.DS.C01.PowerLevel', parseFloat(tableData.data.channelDs.docsis31[0].powerLevel), true);
                                                                  if (fritzboxJsonVersion == 1) {
                                                                      setState('Internet.Docsis31.DS.C01.Modulation', parseInt(tableData.data.channelDs.docsis31[0].type.replace('K', '')), true);
                                                                  } else {
                                                                      setState('Internet.Docsis31.DS.C01.Modulation', parseInt(tableData.data.channelDs.docsis31[0].modulation.replace('QAM', '')), true);
                                                                      setState('Internet.Docsis31.DS.C01.MSE', parseInt(tableData.data.channelDs.docsis31[0].mer), true);
                                                                      //           "docsis31": [{
                                                                      //                    "powerLevel": "0.5",
                                                                      //                    "nonCorrErrors": 3717,
                                                                      //                    "modulation": "4096QAM",
                                                                      //                    "plc": "823",
                                                                      //                    "mer": "36",
                                                                      //                    "fft": "4K",
                                                                      //                    "channelID": 193,
                                                                      //                    "frequency": "750.975 - 860.975"
                                                                      var uncorrectableErrors = getState('Internet.Docsis31.DS.C01.UncorrectableErrors');
                                                                      lastValue = uncorrectableErrors.val;
                                                                      lastTimeStamp = uncorrectableErrors.ts;
                                                                      newValue = parseInt(tableData.data.channelDs.docsis31[0].nonCorrErrors);
                                                                      setState('Internet.Docsis31.DS.C01.UncorrectableErrors', newValue, true);
                                                                      setState('Internet.Docsis31.DS.C01.UncorrectableErrorsPerMinute', newValue - lastValue, true);
                                                                  }
                                                                  setState('Internet.Docsis31.DS.C01.Frequency', tableData.data.channelDs.docsis31[0].frequency, true);
                                                              }
                                                              if (DOCSIS31DSChannels > 1) {
                                                                  setState('Internet.Docsis31.DS.C02.PowerLevel', parseFloat(tableData.data.channelDs.docsis31[1].powerLevel), true);
                                                                  if (fritzboxJsonVersion == 1) {
                                                                      setState('Internet.Docsis31.DS.C02.Modulation', parseInt(tableData.data.channelDs.docsis31[1].type.replace('K', '')), true);
                                                                  } else {
                                                                      setState('Internet.Docsis31.DS.C02.Modulation', parseInt(tableData.data.channelDs.docsis31[1].modulation.replace('QAM', '')), true);
                                                                      setState('Internet.Docsis31.DS.C02.MSE', parseInt(tableData.data.channelDs.docsis31[1].mer), true);
                                                                      var uncorrectableErrors = getState('Internet.Docsis31.DS.C02.UncorrectableErrors');
                                                                      lastValue = uncorrectableErrors.val;
                                                                      lastTimeStamp = uncorrectableErrors.ts;
                                                                      newValue = parseInt(tableData.data.channelDs.docsis31[1].nonCorrErrors);
                                                                      setState('Internet.Docsis31.DS.C02.UncorrectableErrors', newValue, true);
                                                                      setState('Internet.Docsis31.DS.C02.UncorrectableErrorsPerMinute', newValue - lastValue, true);
                                                                  }
                                                                  setState('Internet.Docsis31.DS.C02.Frequency', tableData.data.channelDs.docsis31[1].frequency, true);
                                                              }
                                                          }
                                          
                                                          // DOCSIS 3.0 Upstream Channels
                                                          if (tableData.data.channelUs.docsis30 != null) {
                                                              DOCSIS30USChannels = Object.entries(tableData.data.channelUs.docsis30).length;
                                                              if (DOCSIS30USChannels > 0) {
                                                                  if (logging)
                                                                      log('DOCSIS30USChannels: ' + DOCSIS30USChannels.toString(), 'info');
                                                                  for (i = 0; i < DOCSIS30USChannels; i++) {
                                                                      // var channelID = parseInt(tableData.data.channelUs.docsis30[i].channelID);
                                                                      setState('Internet.Docsis.US.C' + (i < 10 ? '0' : '') + i.toString() + '.Frequency', parseFloat(tableData.data.channelUs.docsis30[i].frequency), true);
                                                                      if (fritzboxJsonVersion == 1) {
                                                                          setState('Internet.Docsis.US.C' + (i < 10 ? '0' : '') + i.toString() + '.Modulation', parseInt(tableData.data.channelUs.docsis30[i].type.replace('QAM', '')), true);
                                                                      } else {
                                                                          setState('Internet.Docsis.US.C' + (i < 10 ? '0' : '') + i.toString() + '.Modulation', parseInt(tableData.data.channelUs.docsis30[i].modulation.replace('QAM', '')), true);
                                                                      }
                                                                      setState('Internet.Docsis.US.C' + (i < 10 ? '0' : '') + i.toString() + '.MultiplexMethod', tableData.data.channelUs.docsis30[i].multiplex, true);
                                                                      setState('Internet.Docsis.US.C' + (i < 10 ? '0' : '') + i.toString() + '.PowerLevel', parseFloat(tableData.data.channelUs.docsis30[i].powerLevel), true);
                                                                      setState('Internet.Docsis.US.C' + (i < 10 ? '0' : '') + i.toString() + '.ChannelID', tableData.data.channelUs.docsis30[i].channelID, true);
                                                                  }
                                                              } else {
                                                                  for (i = 1; i <= 4; i++) {
                                                                      // var channelID = parseInt(tableData.data.channelUs.docsis30[i].channelID);
                                                                      setState('Internet.Docsis.US.C0' + i.toString() + '.Frequency', 0, true);
                                                                      setState('Internet.Docsis.US.C0' + i.toString() + '.Modulation', 0, true);
                                                                      setState('Internet.Docsis.US.C0' + i.toString() + '.MultiplexMethod', '', true);
                                                                      setState('Internet.Docsis.US.C0' + i.toString() + '.PowerLevel', 0, true);
                                                                      setState('Internet.Docsis.US.C0' + i.toString() + '.ChannelID', 0, true);
                                                                  }
                                                              }
                                                          }
                                          
                                                          // DOCSIS 3.1 Upstream Channel
                                                          if (tableData.data.channelUs.docsis31 != null) {
                                                              DOCSIS31USChannels = Object.entries(tableData.data.channelUs.docsis31).length; ;
                                                              if (DOCSIS31USChannels > 0) {
                                                                  if (logging)
                                                                      log('DOCSIS31USChannels: ' + DOCSIS31USChannels.toString(), 'info');
                                                                  setState('Internet.Docsis31.US.C00.PowerLevel', parseFloat(tableData.data.channelUs.docsis31[0].powerLevel), true);
                                                                  if (fritzboxJsonVersion == 1) {
                                                                      setState('Internet.Docsis31.US.C00.Modulation', parseInt(tableData.data.channelUs.docsis31[0].type.replace('K', '')), true);
                                                                  } else {
                                                                      setState('Internet.Docsis31.US.C00.Modulation', parseInt(tableData.data.channelUs.docsis31[0].modulation.replace('QAM', '')), true);
                                                                  }
                                                                  if (fritzboxJsonVersion == 1) {
                                                                      setState('Internet.Docsis31.US.C00.MultiplexMethod', tableData.data.channelUs.docsis31[0].multiplex, true);
                                                                  } else {
                                                                      setState('Internet.Docsis31.US.C00.FFT', parseInt(tableData.data.channelUs.docsis31[0].fft.replace('K', '')), true);
                                                                  }
                                                                  setState('Internet.Docsis31.US.C00.Frequency', parseInt(tableData.data.channelUs.docsis31[0].frequency), true);
                                                              } else {
                                                                  // Es ist kein DOCSIS 3.1 Kanal aktiv
                                                                  if (logging)
                                                                      log('DOCSIS31USChannels: ' + DOCSIS31USChannels.toString(), 'info');
                                                                  setState('Internet.Docsis31.US.C00.PowerLevel', 0, true);
                                                                  setState('Internet.Docsis31.US.C00.Modulation', 0, true);
                                                                  if (fritzboxJsonVersion == 1) {
                                                                      setState('Internet.Docsis31.US.C00.MultiplexMethod', NullValue, true);
                                                                  } else {
                                                                      setState('Internet.Docsis31.US.C00.FFT', NullValue, true);
                                                                  }
                                                                  setState('Internet.Docsis31.US.C00.Frequency', 0, true);
                                                              }
                                                          }
                                          
                                                      } else {
                                                          log('Empty response', 'error');
                                                          setStates2NullValues();
                                                          loginAndGetSID();
                                                      }
                                                  } else {
                                                      log('error: ' + error + ', response: ' + response.statusCode.toString(), 'error');
                                                      setStates2NullValues();
                                                      loginAndGetSID();
                                                  }
                                              });
                                          
                                          }
                                          
                                          if (logging)
                                              log('DocsisInfo starting', 'info');
                                          
                                          // SID holen und merken (User Token)
                                          loginAndGetSID();
                                          var getSIDinterval = setInterval(loginAndGetSID, 900000); // Alle 15 Minuten neue SID holen
                                          
                                          if (fritzboxJsonVersion == 1) {
                                              // FFT gibt es in Version 1 noch nicht. Feld leeren.
                                              if (getState('Internet.Docsis31.US.C00.FFT').val != NullValue) {
                                                  setState('Internet.Docsis31.US.C00.FFT', NullValue, true);
                                              }
                                          } else {
                                              // MultiplexMethod gibt es ab Version 2 nicht mehr. Feld leeren.
                                              if (getState('Internet.Docsis31.US.C00.MultiplexMethod').val != NullValue) {
                                                  setState('Internet.Docsis31.US.C00.MultiplexMethod', NullValue, true);
                                              }
                                          }
                                          
                                          schedule("* * * * *", function () { // Zu jeder vollen Minute die Fritzbox DOCSIS-Daten abfragen
                                              getCableModemChannelInfosV2();
                                          });
                                          
                                          
                                          D S 2 Replies Last reply Reply Quote 0
                                          • F
                                            fastfoot @MartinP last edited by

                                            @martinp sagte in Pegelwerte Fritzbox 6490 Cable auslesen?:

                                            Gitea

                                            ich habe alles herkömmlich, wobei ich in VS Code arbeite und so iobroker spezifische Sachen wie setState auskommentiere und später einfach in den iobroker paste. ich mache z.Zt. nicht so viel mit iobroker, bin mit anderen Projekten ziemlich ausgelastet.

                                            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

                                            860
                                            Online

                                            31.8k
                                            Users

                                            79.9k
                                            Topics

                                            1.3m
                                            Posts

                                            20
                                            199
                                            27835
                                            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