Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Off Topic
    4. [gelöst] FritzBox Routen ein oder ausschalten

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst] FritzBox Routen ein oder ausschalten

    This topic has been deleted. Only users with topic management privileges can see it.
    • BananaJoe
      BananaJoe Most Active @peterfido last edited by

      @peterfido sagte in FritzBox Routen ein oder ausschalten:

      Die FritzBoxen unterstützen ja LTE Sticks. Hat schonmal jemand probiert, ein USB-Lan-Adapter zu nutzen, wo ein zweites WAN dranhängt? Müsste dann nur ein anderer IP-Adressbereich als der der Ur-FritzBox sein.

      Also ein USB-LAN den ich hier liegen habe erkennt er schon mal nicht (RTL Chip)

      1 Reply Last reply Reply Quote 1
      • D
        Dieter_P @BananaJoe last edited by Dieter_P

        @bananajoe said in FritzBox Routen ein oder ausschalten:

        Zudem ich ja eben keine Benachrichtigung nach extern bekäme solange die Route nicht aktiv ist

        Wieso nicht. Simpleste Form wäre ein ESP mit Gateway 5530 und der per SMPT aktiv wird wenn die Internetverbindung der 6591 gestört ist.

        So ein Ding hab ich auch laufen als Watchdog ob der IObroker noch läuft.

        Oder Du lässt die 5530 über eine VOIP Nummer bei dir auf dem Handy anrufen.

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

          @dieter_p Prinzipiell ist das Problem ja schon gelöst, aber eben nur manuell.
          Für eine automatische Aktivierung der Route müsste man eruieren welcher LUA Seite der Fritzbox man was schicken muss, wenn das Ganze nicht per TR Interface machbar ist

          Hier gibt es Hinweise https://mehm.net/blog/?p=1713

          Aus eigener Erfahrung habe ich aber Vorbehalte, dass eine Fritzbox, die ihre Kabel-Internet Verbindung verloren hat klaglos die gewünschten Routen abarbeitet, und ansonsten wartet, dass das Kabel-Internet sich wieder heilt.

          Ich habe schon beobachtet dass die Firmware Programmierer da auch durchaus Holzhammer Methoden programmiert haben, und die Fritzbox komplett neu starten, um die Internet Verbindung zu heilen..

          Samson71 BananaJoe 2 Replies Last reply Reply Quote 0
          • Samson71
            Samson71 Global Moderator @MartinP last edited by

            @martinp sagte in FritzBox Routen ein oder ausschalten:

            Für eine automatische Aktivierung der Route müsste man eruieren welcher LUA Seite der Fritzbox man was schicken muss,

            Vorausgesetzt es handelt sich nicht um eine gebrandete Provider-Box, bei der der LUA-Aufruf unterbunden ist bzw. wo dieser nicht funktioniert. Insbesondere Vodafone (vormals KD) mit ihren Kabel-Boxen ist da ganz vorne mit dabei.

            MartinP BananaJoe 2 Replies Last reply Reply Quote 0
            • MartinP
              MartinP @Samson71 last edited by

              @samson71 ich habe eine Unitymedia Box zumindest die LUA Seite mit den Kabel-Signalqualitätsseiten kann man per Javascript absaugen..
              Stabil wird das Ganze aber wohl eh nicht, wenn sich die Fritzbox alle 10 Minuten neu startet, solange die Kabel- Internet Verbindung fehlschlägt.....

              Samson71 BananaJoe 2 Replies Last reply Reply Quote 0
              • Samson71
                Samson71 Global Moderator @MartinP last edited by

                @martinp
                Meine startet nicht neu. Die "pollt" nur in regelmäßigen Abständen und versucht einen Re-Connect.

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

                  @bananajoe sagte in FritzBox Routen ein oder ausschalten:

                  So, fritz-route will schon mal bei mir nicht:

                  das Skript geht noch von html Daten aus, die aber mittlerweile auf JSON umgestellt wurden. Ich hab mal mein Kabeldatenscript erweitert, bei mir funktioniert die Umstellung aktiv/disabled. Wenn das bei Dir grundsätzlich funktioniert dann könnte man die Aktivierung der Route von den Kabeldaten abhängig machen. schau mal ab Zeile 217. data.activatedroute0 = 0; schalted die erste Route inaktiv.
                  Das Skript läuft alle Minute und die Aktivierung der Route ist fest verdrahted, probier erstmal
                  dann kann man das anpassen

                  /**
                   * Zweck:       Liest FritzBox Kabeldaten
                   * Datum:       14.08.2024
                   * Autor:       @fastfoot
                   * Idee:        @ichderarnd
                   * Forum:       https://forum.iobroker.net/post/609832
                   *              https://forum.iobroker.net/post/685421
                   *              https://forum.iobroker.net/post/1078839
                   */
                  
                  const fs = require("node:fs");
                  const crypto = require("node:crypto");
                  
                  /**
                   * Alle Einstellungen bis Zeile 44 durchsehen um alle Features einzurichten(History+JSON Tables)
                   */
                  
                  // Wo werden die States erstellt?
                  const baseId = "0_userdata.0.FB6591Cable";
                  
                  // FritzBox Credentials, wenn String leer können User/Passwort von einem File gelesen werden
                  const filePath = "/home/iobroker";
                  const fritzBenutzer = "" || fs.readFileSync(`${filePath}/fbUser`, "utf8").replace(/$[\r\n]/gm, "");
                  const fritzPasswort = "" || fs.readFileSync(`${filePath}/fbPassword`, "utf8").replace(/$[\r\n]/gm, "");
                  
                  // Wie oft werden die Daten abgerufen? 60e3 = 1 Min. Angaben müssen in Millisekunden sein
                  const refreshRate = 1 * 60e3; // 1 Min.
                  
                  // Sollen Einträge für History erstellt werden? Feintuning ist in createStateAndOrSetValue() möglich
                  // Einstellung ist nur bis zur Erstellung der States gültig, danach hat sie keine Auswirkungen
                  const setupHistory = true;
                  const historyInstance = "sql.0";
                  // Nur Änderungen historisieren? Der iobroker-default ist true!!!
                  const changesOnly = true;
                  
                  // Maximale Versuche nach einem Fehler, danach wird das Skript gestoppt.
                  // 10 Versuche sollten einen FB-Restart überstehen bei refreshRate von 1 Min.
                  const maxRetries = 10;
                  
                  // Sollen States für JSON Daten erstellt werden? Nützlich für VIS-Tabellen
                  const createJson = true;
                  
                  // Hilfsausgaben
                  const dbg = false;
                  
                  /**
                   * Ab hier nichts abändern
                   */
                  
                  // Zeit bis zum Holen einer neuen sessionID
                  let timeTillLogout = 20 * 60e3; // 20 Min. FritzBox default,
                  
                  // Fehlerzähler
                  let errorCounter = 0;
                  
                  let sessionID = '0000000000000000';
                  
                  // Abzufragende URLs der FritzBox
                  const loginURL = `http://fritz.box/login_sid.lua?username=${fritzBenutzer}`;
                  const dataURL = "http://fritz.box/data.lua";
                  // setTimeout(() => docsisURL = "http://fritz.box/data.lua", 61e3)
                  
                  // Zwischenspeicher für Fehler pro Minute
                  const errorTable = {};
                  
                  function logout() {
                      httpPostAsync(loginURL, `logout=1&sid=${sessionID}`).then((response) => {
                          if (/<SID>(0{16})<\/SID>/.test(response.data)) console.log("Successfully logged out");
                          // log(response.data)
                      });
                  }
                  
                  async function getSid() {
                      const tstChallenge = new RegExp(/<Challenge>([a-f0-9]{8})<\/Challenge>/);
                      const tstSid = new RegExp(/<SID>([a-f0-9]{16})<\/SID>/);
                      // const loginURL = `http://fritz.box/login_sid.lua?username=${fritzBenutzer}`;
                      let challenge = '';
                      let sid = '';
                      let response = await httpGetAsync(loginURL);
                      if (response.statusCode === 200) {
                          if (tstChallenge.test(response.data)) {
                              challenge = response.data.match(tstChallenge)[1];
                          }
                      } else throw new Error('Fehler beim Holen der Challenge!');
                      const utf16le_encoded = Buffer.from(`${challenge}-${fritzPasswort}`, "utf-16le");
                      const challengeResponse = crypto.createHash("md5").update(utf16le_encoded).digest("hex");
                      // let data = { response: `${challenge}-${challengeResponse}`, username: `${fritzBenutzer}` };
                      const options = {
                          headers: {
                              "Content-Type": "application/x-www-form-urlencoded",
                          },
                      };
                      const data = { response: `${challenge}-${challengeResponse}`, username: `${fritzBenutzer}` };
                  
                      response = await httpPostAsync(loginURL, data, options);
                      if (response.statusCode === 200) {
                          if (tstSid.test(response.data)) {
                              sid = response.data.match(tstSid)[1];
                          }
                      } else throw new Error('Fehler beim Holen der sid!');
                      if (sid) return sid;
                  }
                  
                  async function getFritzBoxData() {
                      let page = 'docInfo';
                      if (!sessionID || sessionID === '0000000000000000' || timeTillLogout <= refreshRate) {
                          sessionID = await getSid();
                          /*dbg && */console.log(`sessionID: ${sessionID}`);
                      }
                  
                      const config = {
                          headers: { "Content-Type": "application/x-www-form-urlencoded", },
                      };
                      const data = { xhr: 1, sid: sessionID, lang: "de", page: 'xxxxxx', xhrId: "all", no_sidrenew: null };
                  
                      data.page = page;
                      let resp = await httpPostAsync(dataURL, data, config);
                      if (resp.statusCode === 200) {
                          const response = JSON.parse(resp.data);
                          timeTillLogout = response.timeTillLogout * 1000;
                          dbg && console.log("Logout in " + timeTillLogout / 60e3 + " Min.");
                          dbg && filePath && fs.writeFileSync(`${filePath}/docInfo.json`, JSON.stringify(response.data, null, 2));
                          const tables = response.data ?? "Fehler";
                          dbg && fs.writeFileSync(`${filePath}/docsis.json`, JSON.stringify(tables, null, 2));
                          if (tables === "Fehler") throw new Error(`Falsche Daten für Seite ${page}`, { cause: page, });
                          const docsis30 = {};
                          const docsis31 = {};
                          docsis30.us = [...tables.channelUs.docsis30];
                          docsis30.ds = [...tables.channelDs.docsis30];
                          docsis31.us = [...tables.channelUs.docsis31];
                          docsis31.ds = [...tables.channelDs.docsis31];
                          handleDocsis(docsis30, 30);
                          handleDocsis(docsis31, 31);
                      }
                  
                      page = "docOv";
                      data.page = page;
                      resp = await httpPostAsync(dataURL, data, config);
                      if (resp.statusCode === 200) {
                          const response = JSON.parse(resp.data)
                          const table = response.data?.connectionData ?? "Fehler";
                          if (table === "Fehler") throw new Error(`Falsche Daten für Seite ${page}`, { cause: page, });
                          dbg && fs.writeFileSync(`${filePath}/${page}.json`, JSON.stringify(table, null, 2));
                          const connection = {
                              dsRate: table.dsRate.replace(",", "."),
                              usRate: table.usRate.replace(",", "."),
                              dsChannels30: table.dsCount,
                              dsChannels31: table.dsCountSecond,
                              usChannels30: table.usCount,
                              usChannels31: table.usCountSecond,
                              timeTillLogout: timeTillLogout / 1000,
                          };
                          handleConnectionData(connection);
                      }
                  
                      page = "overview";
                      data.page = page;
                      resp = await httpPostAsync(dataURL, data, config);
                      if (resp.statusCode === 200) {
                          const response = JSON.parse(resp.data);
                          const table = response.data ?? "Fehler";
                          if (table === "Fehler") throw new Error(`Falsche Daten für Seite ${page}`, { cause: page, });
                          dbg && fs.writeFileSync(`${filePath}/${page}.json`, JSON.stringify(table, null, 2));
                      }
                  
                      page = "netDev";
                      data.page = page;
                      resp = await httpPostAsync(dataURL, data, config);
                      if (resp.statusCode === 200) {
                          const response = JSON.parse(resp.data);
                          const table = response.data ?? "Fehler";
                          if (table === "Fehler") throw new Error(`Falsche Daten für Seite ${page}`, { cause: page, });
                          dbg && fs.writeFileSync(`${filePath}/${page}.json`, JSON.stringify(table, null, 2));
                      }
                  
                      page = "log";
                      data.page = page;
                      resp = await httpPostAsync(dataURL, data, config);
                      if (resp.statusCode === 200) {
                          const response = JSON.parse(resp.data);
                          const table = response.data ?? "Fehler";
                          if (table === "Fehler") throw new Error(`Falsche Daten für Seite ${page}`, { cause: page, });
                          dbg && fs.writeFileSync(`${filePath}/${page}.json`, JSON.stringify(table, null, 2));
                          let logs = table.log;
                          let i = 0;
                          let devices = [];
                          logs.forEach(record => {
                              let d = record.date.replace(/(\d+).(\d+).(\d+)/, '20$3-$2-$1 ' + record.time);
                              record.ts = new Date(d).getTime();
                              // if(i++===0)log(new Date(d))
                              // delete record.time
                              delete record.helplink
                              delete record.nohelp
                              let msg = record.msg.replace('2,4 GHz', '2.4 GHz');
                              let arr = msg.split(',');
                              if (msg.indexOf('MAC') >= 0) {
                                  // arr.forEach((rec) => {
                                  //     console.log(rec)
                                  // })
                              }
                              if (record.id === 748) {
                                  devices.push({
                                      txt: arr[0],
                                      conn: arr[1],
                                      name: arr[2],
                                      ip: arr[3].replace('IP ', ''),
                                      mac: arr[4].replace('MAC ', ''),
                                  })
                              }
                              // record.msg=arr;
                          })
                          logs = logs.sort((a, b) => a.id - b.id).filter((o) => o.id === 748 && o.group === 'wlan');
                          dbg && fs.writeFileSync(`${filePath}/${page}2.json`, JSON.stringify(table, null, 2));
                          // fs.writeFileSync(`${filePath}/devices.json`, JSON.stringify(devices, null, 2));
                      }
                  
                      page = "static_route_table";
                      data.page = page;
                      data.activatedroute0 = 0;
                      data.apply = "ok";
                      resp = await httpPostAsync(dataURL, data, config);
                      if (resp.statusCode === 200) {
                          const response = JSON.parse(resp.data);
                          log(JSON.stringify(response.data));
                      }
                  
                  }
                  
                  function handleConnectionData(connectionData) {
                      let base = `${baseId}.Connection`;
                      Object.entries(connectionData).forEach((key) => createStateAndOrSetValue(base, key));
                  }
                  
                  function handleDocsis({ us, ds }, typ) {
                      // Downstream
                      let base = `${baseId}.Docsis${typ}.DS`;
                      // für den inneren Monk
                      ds.sort((a, b) => a.channelID - b.channelID);
                      createStateAndOrSetValue(base, ["json", JSON.stringify(ds)]);
                      for (let i = 0; i < ds.length; i++) {
                          const channel = "C" + ("0" + ds[i].channelID).slice(-2);
                          const id = `${base}.${channel}`;
                          Object.entries(ds[i]).forEach((key) => {
                              if (key[0].indexOf("orrError") >= 0) {
                                  let result;
                                  if (key[1] === 0) {
                                      result = [`${key[0]}PerMinute`, 0];
                                  } else {
                                      result = handleErrors(key, channel);
                                  }
                                  if (result) {
                                      createStateAndOrSetValue(id, result);
                                  }
                              }
                              createStateAndOrSetValue(id, key);
                          });
                      }
                  
                      // Upstream
                      base = `${baseId}.Docsis${typ}.US`;
                      us.sort((a, b) => a.channelID - b.channelID);
                      createStateAndOrSetValue(base, ["json", JSON.stringify(us)]);
                      for (let i = 0; i < us.length; i++) {
                          // Zum Testen neuer/bisher unbekannter Einträge
                          // ds[i].test2=45;
                          // ds[i].test='test';
                          const ch = "C" + ("0" + us[i].channelID).slice(-2);
                          const id = `${base}.${ch}`;
                          Object.entries(us[i]).forEach((key) => createStateAndOrSetValue(id, key));
                      }
                  }
                  
                  function handleErrors([name, value], ch) {
                      let errDiff;
                      let timeDiff;
                      const now = Date.now();
                  
                      errorTable[ch] = errorTable[ch] ?? {};
                      errorTable[ch][name] = errorTable[ch][name] ?? [value, now];
                      // if (errorTable[ch][name][1] === now) {
                      //     return null;
                      // }
                      let record = errorTable[ch][name];
                      errDiff = value - record[0];
                      timeDiff = Math.round((now - record[1]) / 60e3) || 1;
                      // if (timeDiff < 1 || errDiff === -10) return null;
                      record[0] = value;
                      record[1] = now;
                      // errDiff && dbg && console.error("New Errors: " + errDiff + "   " + now + "  " + timeDiff + "   " + ch);
                      return [`${name}PerMinute`, Math.round((errDiff / timeDiff) * 100) / 100];
                  }
                  
                  async function createStateAndOrSetValue(baseID, key) {
                      // Bekannte Attribute, history: 0 schaltet Historisierung ab, create:0 verhindert createState()
                      const states = {
                          powerLevel: { create: 1, history: 1, name: "PowerLevel", unit: "dBmV", type: "number", desc: "Der Signalpegel auf dem Kanal" },
                          modulation: { name: "Modulation", unit: "QAM", type: "number", desc: "Das verwendete Modulationsverfahren: Quadraturamplitudenmodulation" },
                          frequency: { name: "Frequency", unit: "MHz", type: "number", desc: "Die Frequenz, auf der ein Kanal aktiv ist" },
                          latency: { name: "Latency", unit: "ms", type: "number", desc: "Latenz" },
                          mse: { name: "MSE", unit: "dB", type: "number", desc: "Signalgüte (Mean Squared Error)" },
                          mer: { name: "MER", unit: "dB", type: "number", desc: "Maß für die Qualität von digitalen Modulationsverfahren (Modulation Error Ratio)" },
                          fft: { name: "FFT", unit: "K", type: "number", desc: "Die Anzahl der Subcarrier die ein OFDM Kanal haben kann" },
                          plc: { name: "PLC", unit: "MHz", type: "number", desc: "Kanal für Metainformationen (Physical Layer Link Channel)" },
                          channelID: { create: 1, name: "ChannelID", unit: "", type: "number", desc: " Identifikationsnummer, die jedem Kanal vom Kabelnetzbetreiber zugewiesen wird" },
                          nonCorrErrors: { name: "UncorrectableErrors", unit: "", type: "number", desc: "Nicht korrigierbare Fehler" },
                          corrErrors: { name: "CorrectableErrors", unit: "", type: "number", desc: "Korrigierbare Fehler" },
                          multiplex: { name: "MultiplexMethod", unit: "", type: "string", desc: "Multiplexverfahren, Methode zur Signal- und Nachrichtenübertragung" },
                          activesub: { name: "ActiveSubcarrier", unit: "", type: "number", desc: "Minikanäle, auf denen Nutzdaten übertragen werden." },
                          // Eintrag für unbekannte Attribute
                          others: { name: key[0].toUpperCase(), unit: "", type: "number", desc: "Unbekannter Wert" },
                          // eigene Werte aus Werten der docOV page
                          dsChannels30: { name: "DownStreamKanäle30", unit: "", type: "number", desc: "DownStreamKanäle30" },
                          dsChannels31: { name: "DownStreamKanäle31", unit: "", type: "number", desc: "DownStreamKanäle31" },
                          usChannels30: { name: "UpStreamKanäle30", unit: "", type: "number", desc: "UpStreamKanäle30" },
                          usChannels31: { name: "UpStreamKanäle31", unit: "", type: "number", desc: "UpStreamKanäle31" },
                          dsRate: { name: "DownStreamSpeed", unit: "Mbit/s", type: "number", desc: "DownStreamSpeed" },
                          usRate: { name: "UpStreamSpeed", unit: "Mbit/s", type: "number", desc: "UpStreamSpeed" },
                          timeTillLogout: { create: 0, name: "Logout", unit: "s", type: "number", desc: "Zeit bis zum Logout" },
                          json: { create: createJson, history: 0, name: "json", unit: "", type: "string", desc: "Daten als JSON für VIS" },
                          errorMessage: { history: 1, name: "LastError", unit: "", type: "string", desc: "Letzter aufgetretener Fehler" },
                          nonCorrErrorsPerMinute: { name: "UncorrectableErrorsPerMinute", unit: "", type: "number", desc: "Nicht korrigierbare Fehler pro Minute" },
                          corrErrorsPerMinute: { name: "CorrectableErrorsPerMinute", unit: "", type: "number", desc: "Korrigierbare Fehler pro Minute" },
                      };
                  
                      const common = states?.[key[0]] ?? states.others;
                      const id = `${baseID}.${common.name}`;
                      let value = parseFloat(key[1]);
                      if (isNaN(value)) {
                          value = key[1];
                          common.type = "string";
                      }
                      // Frequenz gibt es als Wert und als String, für String Historisierung abschalten
                      if (key[0] === "frequency" && key[1].indexOf("-") >= 0) {
                          value = key[1];
                          common.type = "string";
                          common.history = 0;
                      }
                  
                      // Erstelle State wenn nicht vorhanden und schalte ggf. Historisierung ein
                      if (!(await existsStateAsync(id))) {
                          if (!(common.create ?? true)) return;
                          // Für bisher unbekannte Werte
                          if (typeof value === "string") common.type = "string";
                  
                          // Löschen der Sonderparameter aus common, die haben da nichts verloren
                          if ("create" in common) delete common.create;
                          if ("history" in common) delete common.history;
                          // common.read = true;
                          common.write = false;
                          await createStateAsync(id, common);
                          // Ist Historisierung eingeschaltet? Standaedwerte ausser changesOnly
                          if (setupHistory && historyInstance && (common.history ?? true)) {
                              const historyOptions = {
                                  enabled: true,
                                  storageType: "",
                                  counter: false,
                                  aliasId: "",
                                  debounceTime: 0,
                                  blockTime: 0,
                                  changesOnly: changesOnly,
                                  changesRelogInterval: 0,
                                  changesMinDelta: 0,
                                  ignoreBelowNumber: "",
                                  disableSkippedValueLogging: false,
                                  retention: 31536000,
                                  customRetentionDuration: 365,
                                  maxLength: 0,
                                  enableDebugLogs: false,
                                  debounce: 1000,
                              };
                              sendTo(historyInstance, "enableHistory", { id, options: historyOptions }, (result) => {
                                  if (result.error) {
                                      dbg && console.log(result);
                                      throw Error("Einschalten der Historisierung fehlgeschlagen");
                                  }
                              });
                          }
                      }
                  
                      setStateAsync(id, value, true);
                  }
                  
                  function setStatesToNull() {
                      const ids = $(`${baseId}.*`);
                      ids.each((id) => setState(id, null, true));
                  }
                  
                  async function start() {
                      try {
                          await getFritzBoxData();
                          if (errorCounter > 0) {
                              console.log('');
                              console.warn('Die Fehlerursache scheint behoben zu sein!');
                              console.log('');
                              errorCounter = 0;
                          }
                      } catch (e) {
                          console.error("Huch! Ein Fehler => " + e.message);
                          setStatesToNull();
                          createStateAndOrSetValue(baseId, ["errorMessage", e.message]);
                          errorCounter++;
                          if (errorCounter >= maxRetries) stopScript(scriptName)
                          else console.warn(`Noch ${maxRetries - errorCounter} Versuche, dann wird das Script beendet`);
                      }
                  }
                  
                  start();
                  
                  let intervalID;
                  intervalID = setInterval(start, refreshRate);
                  //const scheduleID = schedule('* * * * *', () => getCableModemChannelInfosV2())
                  
                  // Bei Stop Interval löschen, Bug im Adapter???
                  onStop(() => {
                      if (intervalID) clearInterval(intervalID);
                      //clearSchedule(scheduleID);
                  
                      // Invalidate SessionID
                      logout();
                  });
                  
                  

                  1 Reply Last reply Reply Quote 2
                  • BananaJoe
                    BananaJoe Most Active @MartinP last edited by

                    @martinp sagte in FritzBox Routen ein oder ausschalten:

                    Hier gibt es Hinweise https://mehm.net/blog/?p=1713

                    Ich habe bei dem Herrn auf GitHub mal ein Issue hinterlegt.
                    Ich muss leider zugeben das ich auf Anhieb nicht erkannt habe was genau er da Abfragt bzw. wie er es macht.

                    1 Reply Last reply Reply Quote 0
                    • BananaJoe
                      BananaJoe Most Active @Samson71 last edited by

                      @samson71 sagte in FritzBox Routen ein oder ausschalten:

                      Vorausgesetzt es handelt sich nicht um eine gebrandete Provider-Box, bei der der LUA-Aufruf unterbunden ist bzw. wo dieser nicht funktioniert. Insbesondere Vodafone (vormals KD) mit ihren Kabel-Boxen ist da ganz vorne mit dabei.

                      Ist eine gebrandete Kabel-Deutschland-Box,
                      meine Glasfaser-Box ist aber nicht gebrandet und den gleichen Fehler.

                      1 Reply Last reply Reply Quote 0
                      • BananaJoe
                        BananaJoe Most Active @MartinP last edited by

                        @martinp sagte in FritzBox Routen ein oder ausschalten:

                        Stabil wird das Ganze aber wohl eh nicht, wenn sich die Fritzbox alle 10 Minuten neu startet, solange die Kabel- Internet Verbindung fehlschlägt.....

                        wie @Samson71 schrieb: Da wird nichts neu gestartet, die wartet einfach bis die Verbindung wieder da ist.
                        Route war auch sofort aktiv

                        1 Reply Last reply Reply Quote 0
                        • BananaJoe
                          BananaJoe Most Active last edited by BananaJoe

                          @fastfoot Klasse, das funktioniert schon mal!

                          Hier das Log für Aus und wieder ein:

                          2024-08-14 19:29:56.877  - info: javascript.1 (1635) script.js.001_Routinen.FritzBoxen.Test_Routen: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
                          2024-08-14 19:29:56.984  - info: javascript.1 (1635) script.js.001_Routinen.FritzBoxen.Test_Routen: sessionID: 9dd765637c35a8b1
                          2024-08-14 19:29:57.139  - info: javascript.1 (1635) script.js.001_Routinen.FritzBoxen.Test_Routen: Logout in 20 Min.
                          2024-08-14 19:30:14.653  - info: javascript.1 (1635) script.js.001_Routinen.FritzBoxen.Test_Routen: {"staticRoutes":{"route":[{"_node":"route0","ipaddr":"192.168.128.0","netmask":"255.255.255.0","activated":"0","gateway":"192.168.1.200"},{"_node":"route1","ipaddr":"0.0.0.0","netmask":"0.0.0.0","activated":"0","gateway":"192.168.1.200"}]},"apply":"ok"}
                          2024-08-14 19:30:20.056  - info: javascript.1 (1635) Stopping script script.js.001_Routinen.FritzBoxen.Test_Routen
                          2024-08-14 19:30:20.108  - info: javascript.1 (1635) script.js.001_Routinen.FritzBoxen.Test_Routen: Successfully logged out
                          2024-08-14 19:31:41.275  - info: javascript.1 (1635) Stopping script script.js.001_Routinen.FritzBoxen.Test_Routen
                          2024-08-14 19:31:41.275  - info: javascript.0 (242636) Stopping script script.js.001_Routinen.FritzBoxen.Test_Routen
                          2024-08-14 19:31:44.327  - info: javascript.1 (1635) Start JavaScript script.js.001_Routinen.FritzBoxen.Test_Routen (Javascript/js)
                          2024-08-14 19:31:44.335  - info: javascript.1 (1635) script.js.001_Routinen.FritzBoxen.Test_Routen: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
                          2024-08-14 19:31:44.437  - info: javascript.1 (1635) script.js.001_Routinen.FritzBoxen.Test_Routen: sessionID: 406dfb960655f6f5
                          2024-08-14 19:31:44.598  - info: javascript.1 (1635) script.js.001_Routinen.FritzBoxen.Test_Routen: Logout in 20 Min.
                          2024-08-14 19:32:01.839  - info: javascript.1 (1635) script.js.001_Routinen.FritzBoxen.Test_Routen: {"staticRoutes":{"route":[{"_node":"route0","ipaddr":"192.168.128.0","netmask":"255.255.255.0","activated":"1","gateway":"192.168.1.200"},{"_node":"route1","ipaddr":"0.0.0.0","netmask":"0.0.0.0","activated":"0","gateway":"192.168.1.200"}]},"apply":"ok"}
                          2024-08-14 19:32:02.646  - info: javascript.1 (1635) Stopping script script.js.001_Routinen.FritzBoxen.Test_Routen
                          2024-08-14 19:32:02.699  - info: javascript.1 (1635) script.js.001_Routinen.FritzBoxen.Test_Routen: Successfully logged out
                          
                          

                          Ich musste das Timeout für den Zugriff auf data.lua erhöhen, das dauert bei mir so 15 bis 20 Sekunden bis da was kommt (bis er beim Ändern der Route ist), ich habe den Wert mal auf 30 Sekunden gesetzt. Die Default 2 Sekunden reichten dafür nicht.

                          291cfe27-4c45-4cbc-b400-16d4c9f0d064-image.png

                          Und wie du geschrieben hast, schaltet er die erste Regel. Was nicht automatisch mit der Reihenfolge der dargestellten Routen übereinstimmt sondern die Reihenfolge ist in der die Routen angelegt sind.
                          Aber das lässt sich ja ausklingeln.

                          F 1 Reply Last reply Reply Quote 0
                          • BananaJoe
                            BananaJoe Most Active last edited by

                            Nachtrag: Und die Routen werden sofort übernommen. so 2 bis 3 Sekunden nachdem die Meldung zur Änderung der Route im Log kommt, funktioniert auch ein Dauerping über die Route (oder eben nicht mehr).

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

                              @bananajoe Hattest du einen timeout Fehler, kann ich mir fast nicht vorstellen! Das Skript würde das auch anzeigen! Das dauert halt etwas da ja die anderen Pages vorher abgearbeitet werden. Das Ganze war sehr quick'n dirty weil ich keine Lust hatte die anderen Sachen zu entfernen um dann zu hören dass es bei dir nicht funktioniert 🙂 Da du wohl nicht ständig Routen hinzufügst oder löscht sollte ein fixer Wert ausreichen.

                              Das Skript als solches ist eigentlich auch nicht fertig, ich hatte da erstmal alles eingetragen was mir wichtig schien, wirklich ausgereift ist eig. nur der erste Teil mit den Kabeldaten(docInfo). Den würde ich auch nehmen um den Switch der Route zu steuern

                              BananaJoe 1 Reply Last reply Reply Quote 0
                              • BananaJoe
                                BananaJoe Most Active @fastfoot last edited by

                                @fastfoot sagte in FritzBox Routen ein oder ausschalten:

                                Hattest du einen timeout Fehler, kann ich mir fast nicht vorstellen! Das Skript würde das auch anzeigen!

                                Genau:

                                2024-08-14 19:27:02.191  - error: javascript.1 (1635) script.js.001_Routinen.FritzBoxen.Test_Routen: httpPost(url=http://192.168.1.198/data.lua, error=timeout of 2000ms exceeded)
                                2024-08-14 19:27:02.191  - error: javascript.1 (1635) script.js.001_Routinen.FritzBoxen.Test_Routen: Huch! Ein Fehler => timeout of 2000ms exceeded
                                2024-08-14 19:27:02.197  - warn: javascript.1 (1635) script.js.001_Routinen.FritzBoxen.Test_Routen: Noch 9 Versuche, dann wird das Script beendet
                                

                                Schnelle Suche im Internet ergab das manche Boxen nicht so schnell sind bzw. es lange dauert
                                Hängt eventuell auch damit zusammen was die noch alles machen.
                                Meine Box wird ja nun auch schon vom FritzDECT-Adapter und vom TR-064 Adapter beackert, jetzt noch dieses Skript dazu.

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

                                  @bananajoe interessant! Dann kansst Du ja noch die 'unnötigen' Pages auskommentieren, dann wird die Belastung auch weniger. Wenn dich nur der Routeswitch interessiert dann kann man auch noch das docInfo verkürzen und da nur auf online/offline abfragen

                                  BananaJoe 1 Reply Last reply Reply Quote 0
                                  • BananaJoe
                                    BananaJoe Most Active last edited by

                                    wie mache ich denn das dynamisch?

                                    data.activatedroute0 = 1;
                                    

                                    Ich baue das gerade so um das er die Routen ausliest und Datenpunkte dafür anlegt.
                                    Dementsprechend wird es dann route0, route1, route2 und so weiter geben.
                                    activated wollte ich als Wahr/Falsch Datenpunkt anlegen mit einem Trigger darauf und dann entsprechend umschalten.
                                    Soweit, so gut, das bekomme ich hin.

                                    Aber dann müsste ich mir das ja für das Senden/Schreiben zusammenbauen.

                                    data.activated${myroute} = 1;
                                    

                                    ?

                                    BananaJoe 1 Reply Last reply Reply Quote 0
                                    • BananaJoe
                                      BananaJoe Most Active @BananaJoe last edited by

                                      @bananajoe ok, etwas in Blockly abschauen und googeln:

                                      let sessionID = '0000000000000000';
                                      const data = { xhr: 1, sid: sessionID, lang: "de", page: 'xxxxxx', xhrId: "all", no_sidrenew: null };
                                      let targetroute = 'route1';
                                      data['activated' + targetroute] = 1;
                                      console.warn(data);
                                      

                                      In Zeile 4 baue ich mir den Attributnamen dynamisch aus einen festen Text und den Inhalt der Variable targetroute zusammen. Ausgabe:

                                      2024-08-14 21:22:29.393  - warn: javascript.1 (1635) script.js.001_Routinen.FritzBoxen.Test_Dynamisch: {
                                        xhr: 1,
                                        sid: '0000000000000000',
                                        lang: 'de',
                                        page: 'xxxxxx',
                                        xhrId: 'all',
                                        no_sidrenew: null,
                                        activatedroute1: 1
                                      }
                                      
                                      
                                      F 1 Reply Last reply Reply Quote 0
                                      • BananaJoe
                                        BananaJoe Most Active @fastfoot last edited by

                                        @fastfoot sagte in FritzBox Routen ein oder ausschalten:

                                        Dann kansst Du ja noch die 'unnötigen' Pages auskommentieren, dann wird die Belastung auch weniger.

                                        Jepp, wenn ich nur noch die Routen abfrage oder setze, dauert es nur um die 200ms

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

                                          @bananajoe so ganz verstehe ich nicht was du vorhast. Warum die Routen in States ablegen, die sind doch in der FB? Und was ist dann der Trigger?

                                          1 Reply Last reply Reply Quote 0
                                          • BananaJoe
                                            BananaJoe Most Active last edited by BananaJoe

                                            So, vielen Dank an @fastfoot, ich habe mal seine Skriptvorlage (aus der man noch vieles andere lernen kann) mal heruntergebrochen auf folgendes:

                                            Im Skript gibt man die Parameter

                                            // Wo werden die States erstellt?
                                            const baseId = "0_userdata.0.FritzBoxen.FB6591Cable";
                                            
                                            // FritzBox URL
                                            const fritzURL = "http://192.168.1.198";
                                            
                                            // FritzBox Credentials
                                            const fritzBenutzer = "benutzername";
                                            const fritzPasswort = "passwort";
                                            

                                            an. Unterhalb von baseId werden beim Start des Skriptes nun Datenpunkte für jede vorhandene Route erstellt:
                                            eb250215-6461-4fd3-b019-1dd10f0cb461-image.png

                                            Die Werte sind bis auf activated Schreibgeschützt.
                                            Wird activated unbestätigt geändert, so wird die Route auf der FritzBox entsprechend aktiviert oder deaktiviert.

                                            Der aktuelle Status wird alle 30 Minuten erneuert, den Intervall könnt Ihr über die Variable refreshRate anpassen

                                            /**
                                             * Zweck:       Route in FritzBox ein- oder aussschalten
                                             * Datum:       14.08.2024
                                             * Autor:       @fastfoot
                                             * Umbau auf nur Routen : @BananaJoe
                                             *              https://forum.iobroker.net/post/1190975
                                             */
                                            
                                            /**
                                             * Beschreibung:
                                             * -------------
                                             * Das Skript ließt alle vorhandenen Routen einer FritzBox aus
                                             * für jede Route wird unterhalb von Objektpfad "baseId" ein Channel mit dem Namen der Route (route0, route1 usw.) angelegt
                                             * Unterhalb des Channels gibt es Datenpunkte - nur lesend - für Netz/IP / Maske / Gateway
                                             * Und ein Datenpunkt "activated" der anzeigt ob die Route aktiv ist.
                                             * Dieser ist beschreibar, wird dieser unbestätigt geändert, wird der Wert auf der FritzBox gesetzt.
                                             * Der Wert wird regelmäßig mit der FritzBox abgeglichen (refreshRate)
                                             * Routen die auf der FritzBox gelöscht werden, werden nicht automatisch in ioBroker gelöscht.
                                             */
                                            
                                            const crypto = require("node:crypto");
                                             
                                            // Wo werden die States erstellt?
                                            const baseId = "0_userdata.0.FritzBoxen.FB6591Cable";
                                            
                                            // FritzBox URL
                                            const fritzURL = "http://192.168.1.198";
                                            
                                            // FritzBox Credentials
                                            const fritzBenutzer = "benutzername";
                                            const fritzPasswort = "passwort";
                                             
                                            // Wie oft werden die Daten abgerufen? 60e3 = 1 Min. Angaben müssen in Millisekunden sein
                                            const refreshRate = 30 * 60e3; // 30 Min.
                                             
                                            // Maximale Versuche nach einem Fehler, danach wird das Skript gestoppt.
                                            // 10 Versuche sollten einen FB-Restart überstehen bei refreshRate von 1 Min.
                                            const maxRetries = 10;
                                             
                                            // Hilfsausgaben / Debugausgaben
                                            const b_debugMessages = true;
                                             
                                            /**
                                             * Ab hier nichts abändern
                                             */
                                             
                                            // Zeit bis zum Holen einer neuen sessionID
                                            let timeTillLogout = 20 * 60e3; // 20 Min. FritzBox default,
                                             
                                            // Fehlerzähler
                                            let errorCounter = 0;
                                             
                                            let sessionID = '0000000000000000';
                                             
                                            // Abzufragende URLs der FritzBox
                                            const loginURL = fritzURL + "/login_sid.lua?username=" + fritzBenutzer;
                                            const dataURL = fritzURL + "/data.lua";
                                             
                                            // Zwischenspeicher für Fehler pro Minute
                                            const errorTable = {};
                                             
                                            function logout() {
                                                httpPostAsync(loginURL, `logout=1&sid=${sessionID}`).then((response) => {
                                                    if (/<SID>(0{16})<\/SID>/.test(response.data)) console.log("Successfully logged out");
                                                    // log(response.data)
                                                });
                                            }
                                             
                                            async function getSid() {
                                                const tstChallenge = new RegExp(/<Challenge>([a-f0-9]{8})<\/Challenge>/);
                                                const tstSid = new RegExp(/<SID>([a-f0-9]{16})<\/SID>/);
                                                // const loginURL = `http://fritz.box/login_sid.lua?username=${fritzBenutzer}`;
                                                let challenge = '';
                                                let sid = '';
                                                let response = await httpGetAsync(loginURL);
                                                if (response.statusCode === 200) {
                                                    if (tstChallenge.test(response.data)) {
                                                        challenge = response.data.match(tstChallenge)[1];
                                                    }
                                                } else throw new Error('Fehler beim Holen der Challenge!');
                                                const utf16le_encoded = Buffer.from(`${challenge}-${fritzPasswort}`, "utf-16le");
                                                const challengeResponse = crypto.createHash("md5").update(utf16le_encoded).digest("hex");
                                                // let data = { response: `${challenge}-${challengeResponse}`, username: `${fritzBenutzer}` };
                                                const options = {
                                                    headers: {
                                                        "Content-Type": "application/x-www-form-urlencoded",
                                                    },
                                                };
                                                const data = { response: `${challenge}-${challengeResponse}`, username: `${fritzBenutzer}` };
                                             
                                                response = await httpPostAsync(loginURL, data, options);
                                                if (response.statusCode === 200) {
                                                    if (tstSid.test(response.data)) {
                                                        sid = response.data.match(tstSid)[1];
                                                    }
                                                } else throw new Error('Fehler beim Holen der sid!');
                                                if (sid) return sid;
                                            }
                                             
                                            async function getFritzBoxData() {
                                                let page = 'docInfo';
                                                if (!sessionID || sessionID === '0000000000000000' || timeTillLogout <= refreshRate) {
                                                    sessionID = await getSid();
                                                    if (b_debugMessages == true) {
                                                        console.log(`sessionID: ${sessionID}`);
                                                    }
                                                }
                                             
                                                const config = {
                                                    timeout: 30000,
                                                    headers: { "Content-Type": "application/x-www-form-urlencoded", },
                                                };
                                                const data = { xhr: 1, sid: sessionID, lang: "de", page: 'xxxxxx', xhrId: "all", no_sidrenew: null };
                                             
                                                page = "static_route_table";
                                                data.page = page;
                                                resp = await httpPostAsync(dataURL, data, config);
                                                if (resp.statusCode === 200) {
                                                    const response = JSON.parse(resp.data);
                                                    log(JSON.stringify(response.data));
                                                    routeList = getAttr(response.data, 'staticRoutes.route');
                                                    //console.warn(routeList);
                                                    let activated = false;
                                                    for (var route_index in routeList) {
                                                        route = routeList[route_index];
                                                        await CreatyMyStateV4(baseId + "." + getAttr(route, '_node'), 'ipaddr', 'string', false, '', '', getAttr(route, 'ipaddr'))
                                                        setStateAsync(baseId + "." + getAttr(route, '_node') + ".ipaddr", getAttr(route, 'ipaddr'), true);
                                                        await CreatyMyStateV4(baseId + "." + getAttr(route, '_node'), 'netmask', 'string', false, '', '', getAttr(route, 'netmask'))
                                                        setStateAsync(baseId + "." + getAttr(route, '_node') + ".netmask", getAttr(route, 'netmask'), true);
                                                        await CreatyMyStateV4(baseId + "." + getAttr(route, '_node'), 'gateway', 'string', false, '', '', getAttr(route, 'gateway'))
                                                        setStateAsync(baseId + "." + getAttr(route, '_node') + ".gateway", getAttr(route, 'gateway'), true);
                                                        if (getAttr(route, 'activated') == "0") {
                                                            activated = false;
                                                        } else {
                                                            activated = true;
                                                        }
                                                        await CreatyMyStateV4(baseId + "." + getAttr(route, '_node'), 'activated', 'boolean', true, '', '', activated)
                                                        setStateAsync(baseId + "." + getAttr(route, '_node') + ".activated", activated, true);
                                                    }
                                                }
                                            }
                                            
                                            async function setFritzBoxRoute(s_NameofRoute, b_activated) {
                                                let page = 'docInfo';
                                                if (!sessionID || sessionID === '0000000000000000' || timeTillLogout <= refreshRate) {
                                                    sessionID = await getSid();
                                                    if (b_debugMessages == true) {
                                                        console.log(`sessionID: ${sessionID}`);
                                                    }
                                                }
                                             
                                                const config = {
                                                    timeout: 30000,
                                                    headers: { "Content-Type": "application/x-www-form-urlencoded", },
                                                };
                                                const data = { xhr: 1, sid: sessionID, lang: "de", page: 'xxxxxx', xhrId: "all", no_sidrenew: null };
                                             
                                                page = "static_route_table";
                                                data.page = page;
                                            
                                                if (b_activated === true) {
                                                    data['activated' + s_NameofRoute] = 1;
                                                } else {
                                                    data['activated' + s_NameofRoute] = 0;
                                                }
                                                data.apply = "ok";
                                                
                                                resp = await httpPostAsync(dataURL, data, config);
                                                if (resp.statusCode === 200) {
                                                    const response = JSON.parse(resp.data);
                                                    log(JSON.stringify(response.data));
                                            
                                                    routeList = getAttr(response.data, 'staticRoutes.route');
                                                    //console.warn(routeList);
                                                    let activated = false;
                                                    for (var route_index in routeList) {
                                                        route = routeList[route_index];
                                                        setStateAsync(baseId + "." + getAttr(route, '_node') + ".ipaddr", getAttr(route, 'ipaddr'), true);
                                                        setStateAsync(baseId + "." + getAttr(route, '_node') + ".netmask", getAttr(route, 'netmask'), true);
                                                        setStateAsync(baseId + "." + getAttr(route, '_node') + ".gateway", getAttr(route, 'gateway'), true);
                                                        if (getAttr(route, 'activated') == "0") {
                                                            activated = false;
                                                        } else {
                                                            activated = true;
                                                        }
                                                        setStateAsync(baseId + "." + getAttr(route, '_node') + ".activated", activated, true);
                                                    }
                                                }
                                             
                                            }
                                            
                                            // Erstellt Datenpunkte mit Typ, Unit, Read/Write und States, je nach Angabe der Parameter
                                            async function CreatyMyStateV4(RootPath, ValueName, TargetType, TargetIsWriteable, TargetUnit, TargetStates, TargetDefaultValue) {
                                                // Prüfung ob RootPath einen Punkt am Ende hat, wenn nein einen anhängen.
                                                if (RootPath.slice(-1) != ".") {
                                                    RootPath = RootPath + "."
                                                }
                                                
                                                // Prüfung ob States angegeben wurden. Wenn ja verarbeiten.
                                                var s_states = "";
                                                var states = new Object();
                                                if (TargetStates != "") {
                                                    s_states = '{'
                                                    for (var i_index in TargetStates) {
                                                        s_statetemp = TargetStates[i_index];
                                                        a_statetemp = s_statetemp.split(":");
                                                        s_states = s_states + '"' + a_statetemp[0] + '":"' + a_statetemp[1] + '",'
                                                    }
                                                    s_states = s_states.slice(0, -1);
                                                    s_states = s_states + "}"
                                                    // und in ein Objekt umwandeln
                                                    states = JSON.parse(s_states);
                                                }
                                                
                                                // Variante der Erstellung prüfen:
                                                if (TargetUnit.length === 0 && s_states.length === 0) {
                                                    // Keine Einheit und keine States angegeben
                                                    //console.log("Keine Einheit und keine States angegeben");
                                                    await createStateAsync(
                                                        RootPath + ValueName, 
                                                        TargetDefaultValue, 
                                                        { 
                                                            type: TargetType, 
                                                            name: ValueName, 
                                                            read: true, 
                                                            write: TargetIsWriteable 
                                                        }
                                                    );
                                                } else if (TargetUnit.length > 0 && s_states.length === 0) {
                                                    // Einheit angegeben, aber keine States
                                                    //console.log("Einheit angegeben, aber keine States");
                                                    await createStateAsync(
                                                        RootPath + ValueName,
                                                        TargetDefaultValue, 
                                                        { 
                                                            type: TargetType, 
                                                            name: ValueName, 
                                                            read: true, 
                                                            write: TargetIsWriteable,
                                                            unit: TargetUnit
                                                        }
                                                    );
                                                } else if (TargetUnit.length === 0 && s_states.length > 0) {
                                                    // States angegeben, aber keine Einheit
                                                    //console.log("States angegeben, aber keine Einheit");
                                                    await createStateAsync(
                                                        RootPath + ValueName,
                                                        TargetDefaultValue, 
                                                        { 
                                                            type: TargetType, 
                                                            name: ValueName, 
                                                            read: true, 
                                                            write: TargetIsWriteable,
                                                            unit: TargetUnit,
                                                            // Das Objekt(!!!) states was wir oben angelegt haben wird hier automatisch eingesetzt, inklusive seines Namens.
                                                            states
                                                        }
                                                    );
                                                } else {
                                                    console.error("CreateMyState:" + RootPath + ValueName + ": Unit and States at the same time are not possible");
                                                }
                                            
                                            }
                                             
                                            async function start() {
                                                try {
                                                    await getFritzBoxData();
                                                    if (errorCounter > 0) {
                                                        console.log('');
                                                        console.warn('Die Fehlerursache scheint behoben zu sein!');
                                                        console.log('');
                                                        errorCounter = 0;
                                                    }
                                                } catch (e) {
                                                    console.error("Huch! Ein Fehler => " + e.message);
                                                    // setStatesToNull();
                                                    //createStateAndOrSetValue(baseId, ["errorMessage", e.message]);
                                                    errorCounter++;
                                                    if (errorCounter >= maxRetries) stopScript(scriptName)
                                                    else console.warn(`Noch ${maxRetries - errorCounter} Versuche, dann wird das Script beendet`);
                                                }
                                            }
                                             
                                            start();
                                            //logout();
                                            
                                            // const baseId = "0_userdata.0.FritzBoxen.FB6591Cable";
                                            
                                            on({ id: [].concat(Array.prototype.slice.apply($('state[id=\'' + baseId + '.*.activated\']'))), change: 'ne' }, async (obj) => {
                                                let value = obj.state.val;
                                                let oldValue = obj.oldState.val;
                                                if (b_debugMessages == true) {
                                                    console.info(('Geräte ID: ' + String(obj.channelName) + ' => ' + String(value)));
                                                }
                                                setFritzBoxRoute(String(obj.channelName), value);
                                                //logout();
                                            });
                                            
                                            
                                            
                                            let intervalID;
                                            intervalID = setInterval(start, refreshRate);
                                             
                                            // Bei Stop Interval löschen, Bug im Adapter???
                                            onStop(() => {
                                                if (intervalID) clearInterval(intervalID);
                                                // Invalidate SessionID
                                                logout();
                                            });
                                            

                                            Warum das ganze?
                                            So kann ich per ioBroker auswerten welche Internetleitung verfügbar ist. bzw. ob die primäre Internetleitung noch funktioniert. Falls nicht kann ich so durch die Änderung des entsprechenden activated Datenpunkt den Datenverkehr umleiten.

                                            Als Info an Unbedarfte:
                                            Erstellt man eine Route mit der IP 0.0.0.0 und der Maske 0.0.0.0 so gilt das für sämtlichen Netzwerkverkehr der nicht im gleichen Netzwerk ist. Das Gateway ist eine andere FritzBox im gleichen Netzwerk. Ja, das geht. Die Datenpakete landen so erst an FritzBox 1, die leitet es an FritzBox 2 weiter, die Antwort bekommt ihr dann direkt von FritzBox 2. Das ist dann zwar unsymmetrisch, im TCP/IP Protokoll ist das aber erlaubt.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            723
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

                                            6
                                            29
                                            1023
                                            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