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 @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
                • F
                  fastfoot @ichderarnd last edited by

                  @ichderarnd

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

                  für mich war das Script so nicht zu gebrauchen, die Zuordnung der Kanäle passt so gar nicht. Also habe ich was Eigenes gemacht und nur die Routinen zum Einloggen übernommen.
                  Das Skript ist voll dynamisch, es werden keine starren State-Namen genutzt sondern das was von der FB kommt. Sollte sich etwas ändern so werden die neuen Infos einfach übernommen und die alten evtl. nicht mehr vorhandenen States stören nicht, man muss das Script nicht dafür ändern. Es erstellt auch die Einträge für die History und man kann auch einzelne (bekannte) States vom Erstellen oder der Historisierung ausschliessen. Ich wollte dir nicht in die Parade fahren sonst hätte ich es bereits gepostet, aber wenn Interesse besteht dann stelle ich es natürlich gerne hier zur Verfügung.

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

                    @fastfoot Was mich als gelernter C++ Programmierer irritiert, ist der Unterschied im jetzt funktionierenden httpPost und dem Beispiel aus der Github-Dokumentation

                    httpPost(docsisURL,
                            'xhr=1&sid=' + sid + '&lang=de&page=docInfo&xhrId=all&no_sidrenew=', {
                            headers: {
                                'Content-Type': 'application/x-www-form-urlencoded'
                            },
                        },
                            (error, response) => {
                    
                    

                    In den beiden Beispielen aus der Doku ist der zweite Parameter komischerweise JSON...

                    https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#httppost

                    httpPost('http://jsonplaceholder.typicode.com/posts',
                          { title: 'foo', body: 'bar', userId: 1 }, 
                         (error, response) => {
                        if (!error) {
                            console.log(response.statusCode);
                            console.log(response.data);
                            console.log(response.headers);
                        } else {
                            console.error(error);
                        }
                    });
                    

                    und...

                    httpPost(
                        'http://jsonplaceholder.typicode.com/posts',
                        {
                            title: 'foo',
                            body: 'bar',
                            userId: 1
                        },
                        {
                            timeout: 2000,
                            basicAuth: {
                                user: 'admin',
                                password: 'dg2LdALNznHFNo'
                            },
                            headers: {
                                'Cookie': 'PHPSESSID=298zf09hf012fh2; csrftoken=u32t4o3tb3gg43; _gat=1'
                            }
                        },
                        (error, response) => {
                            if (!error) {
                                console.log(response.statusCode);
                                console.log(response.data);
                                console.log(response.headers);
                            } else {
                                console.error(error);
                            }
                        }
                    );
                    
                    F 1 Reply Last reply Reply Quote 0
                    • MartinP
                      MartinP last edited by

                      Ich habe noch eine interessante Feststellung gemacht: Der Schedule im Code des Scriptes scheint manchmal nicht deregistriert zu werden, wenn man nach Code-Änderungen das Script wieder starten will - Geisterhaftes Logging, was nicht mehr im Quellcode des Scriptes vorhanden ist ... Da läuft dann wohl die Precompiled Version der vorigen Script-Version weiter ...

                      Einmal den Javascript - Adapter durchstarten bereinigt das aber ...

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

                        @martinp mir scheint die Doku falsch, siehe hier im Source.

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

                          @martinp ist mir auch aufgefallen, als Workaround:

                          //const intervalID = setInterval(() => getCableModemChannelInfosV2(), refreshRate);
                          const scheduleID = schedule('* * * * *', () => getCableModemChannelInfosV2())
                          
                          // Bei Stop Interval löschen, Bug im Adapter???
                          onStop(() => {
                              //clearInterval(intervalID)
                              clearSchedule(scheduleID);
                          })
                          
                          
                          1 Reply Last reply Reply Quote 0
                          • D
                            DasKind91 @MartinP last edited by

                            @MartinP
                            Danke! Läuft auf Anhieb

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

                              @fastfoot said in Pegelwerte Fritzbox 6490 Cable auslesen?:

                              @martinp mir scheint die Doku falsch, siehe hier im Source.

                              Sollte man da ggfs einen separaten Issue aufmachen?

                              habe eine bessere Test-Seite gefunden - die "echoed" das, was sie empfangen hat im Response Body

                              httpPost('https://httpbin.org/post', "[{ title: 'foo', body: 'bar', userId: 1 }]", (error, response) => {
                              // httpPost('https://httpbin.org/post', { title: 'foo', body: 'bar', userId: 1 }, (error, response) => {
                                  if (!error) {
                                      console.log('statusCode: ' + response.statusCode);
                                      console.log('data: ' + response.data);
                                      console.log('headers: ' + response.headers);
                                  } else {
                                      console.error(error);
                                  }
                              });
                              
                              
                              

                              Hier das Logging der oberen Variante

                              javascript.0	10:14:40.626	info	script.js.Spielwiese.Ressourcentest: statusCode: 200
                              javascript.0	10:14:40.626	info	script.js.Spielwiese.Ressourcentest: data: { "args": {}, "data": "", "files": {}, "form": { "[{ title: 'foo', body: 'bar', userId: 1 }]": "" }, "headers": { "Accept": "application/json, text/plain, */*", "Accept-Encoding": "gzip, compress, deflate, br", "Baggage": "sentry-environment=production,sentry-release=iobroker.javascript%408.3.1,sentry-public_key=f3b9740caaee4ee69eb68019d71526ff,sentry-trace_id=4e9d2599655c4da3ba2864550274d0a8", "Content-Length": "42", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "Sentry-Trace": "4e9d2599655c4da3ba2864550274d0a8-bb42ffe38676a38a", "User-Agent": "Mozilla/5.0 (X11; Linux i686; rv:109.0) Gecko/20100101 Firefox/121.0", "X-Amzn-Trace-Id": "Root=1-6688fcf0-44abb5ee167177b203eaf2e3" }, "json": null, "origin": "178.200.220.43", "url": "https://httpbin.org/post" }
                              javascript.0	10:14:40.627	info	script.js.Spielwiese.Ressourcentest: headers: date: Sat, 06 Jul 2024 08:14:40 GMT content-type: application/json content-length: 871 connection: keep-alive server: gunicorn/19.9.0 access-control-allow-origin: * access-control-allow-credentials: true
                              

                              Und das die im Listing auskommentierte Version:

                              javascript.0	10:13:50.731	info	script.js.Spielwiese.Ressourcentest: statusCode: 200
                              javascript.0	10:13:50.732	info	script.js.Spielwiese.Ressourcentest: data: { "args": {}, "data": "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}", "files": {}, "form": {}, "headers": { "Accept": "application/json, text/plain, */*", "Accept-Encoding": "gzip, compress, deflate, br", "Baggage": "sentry-environment=production,sentry-release=iobroker.javascript%408.3.1,sentry-public_key=f3b9740caaee4ee69eb68019d71526ff,sentry-trace_id=4e9d2599655c4da3ba2864550274d0a8", "Content-Length": "39", "Content-Type": "application/json", "Host": "httpbin.org", "Sentry-Trace": "4e9d2599655c4da3ba2864550274d0a8-ab0960d5e4e3bc86", "User-Agent": "Mozilla/5.0 (X11; Linux i686; rv:109.0) Gecko/20100101 Firefox/121.0", "X-Amzn-Trace-Id": "Root=1-6688fcbe-236bdbd352d2980c328604d5" }, "json": { "body": "bar", "title": "foo", "userId": 1 }, "origin": "178.200.220.43", "url": "https://httpbin.org/post" }
                              javascript.0	10:13:50.733	info	script.js.Spielwiese.Ressourcentest: headers: date: Sat, 06 Jul 2024 08:13:50 GMT content-type: application/json content-length: 905 connection: keep-alive server: gunicorn/19.9.0 access-control-allow-origin: * access-control-allow-credentials: true
                              

                              EDIT:
                              https://github.com/ioBroker/ioBroker.javascript/issues/1633

                              MartinP1 created this issue in ioBroker/ioBroker.javascript

                              closed [Bug]: second parameter of httpPost() - Usage of JSON (conforming to documentation) leads to strange behaviour #1633

                              1 Reply Last reply Reply Quote 0
                              • S
                                sugram @DasKind91 last edited by sugram

                                Hmm, aktuell habe ich mit dem "alten" script keine Probleme.
                                Zumindest zeigt es im log keine an.
                                Ich habe nur bemerkt, daß die Werte die in der FB angezeigt werden, nicht mehr mit den aufgezeigten stimmen.
                                Nutze eine 6690 v 7.57

                                Wenn es ein überarbeitetes Script gibt, bin ich absolut interessiert, da ich die Werte nach wie vor logge.

                                Ah, jetzt.
                                aber nur wenn ich in dem JS Script direkt auf das Request gehe

                                Bild_2024-07-13_220614327.png

                                Also das gleiche Problem.
                                Ich offe das ihr das gelöst bekommt, daß wäre wirklich klasse.

                                S 1 Reply Last reply Reply Quote 0
                                • S
                                  sugram @sugram last edited by

                                  Nur mal eine Nachfrage.

                                  Gibt es nun ein Script bei dem wieder alles funktioniert?

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

                                    @martinp Vielen Dank für deine Antwort.
                                    Dein Script funktioniert hier bei mir nun auch wieder

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

                                      Ich habe noch eine Nickeligkeit in Javascript Adapter 6.3.1 gefunden (in der Version 6.7.1 aus dem Latest - Repo tritt das Problem nicht auf):

                                      zum httpPost wird im Editor gesagt, response enthielte kein Element "statusCode"

                                      Lässt man sich beim Korrigieren vom Tooltip leiten, korrigiert man von "response.statusCode" auf "response.responseCode"...

                                      Dann funktioniert aber das Script nicht mehr. Um die roten Schlängel unter statusCode zu sehen, musste ich einen Screenshot machen.

                                      899abd4a-ee58-4b74-9cbf-0dc57431a271-grafik.png

                                      diese beiden im Screenshot auskommentierten Log-Meldungen ...

                                                       log ('response.statusCode' + response.statusCode.toString());
                                                       log ('response.responseCode' + response.responseCode.toString());
                                      
                                      

                                      Lösten folgendes Logging aus:

                                      javascript.0
                                      	2024-07-23 10:09:00.139	info	script.js.Fritzbox.DOCSISV01: response.statusCode200
                                      javascript.0
                                      	2024-07-23 10:09:00.143	error	Error in callback: TypeError: Cannot read properties of undefined (reading 'toString')
                                      javascript.0
                                      	2024-07-23 10:09:00.144	error	at Object.<anonymous> (script.js.Fritzbox.DOCSISV01:442:70)
                                      javascript.0
                                      	2024-07-23 10:09:00.144	error	at /opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1242:38
                                      javascript.0
                                      	2024-07-23 10:09:00.144	error	at processTicksAndRejections (node:internal/process/task_queues:95:5)
                                      j
                                      

                                      @haus-automatisierung habe extra jetzt Javascript 6.7.1 installiert, und da tritt der obige Fehler nicht auf. da wird responseCode mit einer roten Schlangenlinie unterlegt.... schreibe keinen Issue 😉

                                      haus-automatisierung 1 Reply Last reply Reply Quote 0
                                      • haus-automatisierung
                                        haus-automatisierung Developer Most Active @MartinP last edited by haus-automatisierung

                                        @martinp sagte in Pegelwerte Fritzbox 6490 Cable auslesen?:

                                        Ich habe noch eine Nickeligkeit in Javascript Adapter 6.3.1 gefunden (in der Version 6.7.1 aus dem Latest - Repo tritt das Problem nicht auf):

                                        Du meinst sicher 8.3.1 und 8.7.1?

                                        Dann hast du ja schon gemerkt, dass das bereits gefixt wurde 🙂

                                        MartinP 1 Reply Last reply Reply Quote 0
                                        • MartinP
                                          MartinP @haus-automatisierung last edited by

                                          @haus-automatisierung Ja, Tippfehler

                                          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

                                          627
                                          Online

                                          31.9k
                                          Users

                                          80.1k
                                          Topics

                                          1.3m
                                          Posts

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