NEWS
Internet Filter in der Fritzbox mit JavaScript setzen
-
@moelski Cool, bin da grade drauf gestoßen und hab nach deiner Anleitung mal mit static und FbListOnly=True gestartet. Das dauert schon ein bisschen bis die Infos im Log kommen aber es lief ohne Probleme durch. Werd ich am Wochenende mal weiter verproben.
Mein Usecase :
Kinder hab ich zwar aber Kindersicherung tricksen die mir eh aus (beide >=15, da kann man nix mehr machen)...
Aaaber: Ich hab diverse geflashte Sonoffs im Einsatz auch Shelly (die ersten beiden geflasht, der Rest mit Shelly FW) plus Kameras etc. ALLE Geräte sind in der FB vom Internet getrennt (die haben bei mir feste IPs und in der FB das Zugangsprofil "gesperrt") Datum/Uhrzeit kriegen sie von der FB. Das läuft auch soweit alles gut bis auf die Shellys mit original FW, die können sich kein Update ziehen. Wenn ich dran denke schalte ich die in der FB sporadisch auf Zugangsprofil "Standard" und dann nach einem Shelly-Update wieder auf gesperrt. Und da werde ich mich mal dransetzen das zu automatisieren.Von daher: Tolle Arbeit, danke!!!
-
@marcel-k Hi, diese Funktion wurde u.a. im fb-checkpresence Adapter umgesetzt.
-
@ilovegym mist, dann bin ich wohl doch auf den falschen Zug aufgesprungen ? Ich schaus mir mal an , den Adapter kenne ich .. danke dir
-
@marcel-k kein Thema, ich hab 3 Adapter, die der Reihe nach auf die FB zugreifen, und noch ein paar Scripte... ( Telegraf etc um n paar Statistiken nach Grafana zu portieren über influx.. )
TR-064, FB-Checkpresence, FritzDect
Halt für jeden Adapter einen eigenen User mit Pw anlegen, und die Pollzeiten nicht zu kurz setzen.
FB ist ne 7590 mit aktueller Beta, läuft sehr gut.
-
Hi,
da meine Kinder auch größer werden und das Internet immer mehr zum Thema werden, bin ich auf diesen tollen Thread gestoßen. Wäre es denn auch möglich, die Zugangsprofile zu ändern, also in denen das Internet zu sperren/freigeben?
Das stelle ich mir gerade einfacher vor, als immer die einzelnen Geräte zu bearbeitenGruß Timo
-
@moelski
Erstmal vielen Dank für Deine Arbeit und auch danke an alle, die sich an dem Thread beteiligen. Ich find's genial.
Ich bin allerdings NOOB und verstehe nicht ganz, wie ein Datenpunkt (den ich bislang nur als Variable verstehe) ein Script triggert, bzw. wie ich einen Knopf im VIS dazu bringe einen Datenpunkt zu triggern, der ein Script triggert. Ich weiss, die Frage bezieht sich nicht ganz aufs Script. Hat jemand einen Hinweis für mich?
Script funktioniert manuell. Einen Datenpunkt habe ich auch angelegt.
Frage ist nun nur, wie ich das ganze miteinander und mit einem VIS Knopf oder gar einem Alexa Kommando verbinde ...Danke Euch!!
-
Manchmal reicht es, wenn man einfach mit allem herum spielt. Sollte noch jemand so blöde sien wie ich, dokumentiere ich kurz, was ich gemacht habe:
1.) datenpunkt vom Type String angelegt
2.) VIS geöffnet und dort einen Button vom TYP Control Icon Push Button ausgewählt und ins Fenster gezogen.
3.) Felder Object ID (kann man auswählen), value (in meinem Fall Galaxy-Tab-A;filtprof1), Text INTERNET AN gefüllt
4.) mit einem zweiten button, das gleiche gemacht, nur die andere Filteergruppe gewählt: Object ID (kann man auswählen), value (in meinem Fall Galaxy-Tab-A;filtprof7234), Text INTERNET AUS gefüllt
5.) Object trigger version quasi "an" geschaltet durch entfernen der //
6.) Visualisierung laufen lassen. Fertig. DANKE!!So, nun noch drei Fragen ...
1.) Woher weiss IOBROKER, dass das Script beim wählen des buttons ausgeführt werden muss?
2.) kann ich auch einen TOGGLE button nehmen?
3.) Wie bekomme ich das Ganze nun in Alexa?Ich danke Euch!!!
-
@marcel-k
Wie hast du das mit der 1 und 2 Stunden gemacht? Ich benutze das checkpresence Adapter. Da kann ich die Geräte auch sperren, aber ich kann keine zeit definieren. Hast du da ein Timer eingebaut? -
@moelski Habe quasi nix am Hut mit Jawa - ich bin jetzt auf diese Diskussion gelandet da ich verzweifelt nach dem Filterwechsel gegoogelt habe. Eigentlich würde ich es am liebsten über shell skript steuern.
Ich habe mein nächstes Projekt auf dem Visier. Ich habe mir Raspi besorgt und wollte pi-hole installieren.
Aktuell mit dem Homeschooling würde ich gern gewisse Anwendungen restriktieren. Also in der Schoolzeit kein YouTube, Tiktok, Netflix, Prime oder Discord. Pi-hole ist wahrscheinlich nicht die richtige Lösung da man es umgehen kann, aber ich denke es konnte möglich sein sie alle mit fritzbox Zugangsprofile zu sperren (wenn man die IPs rausfindet) Problem ist dass Fritzbox lässt die Profilen nicht zeitlich steuern...komplette Internetzugang sperren ist ausgeschlossen (weil dann können sie auch nicht Teams oder etwas mit Schule machen). Profilwechsel konnte ich von Raspi mit einem cronjob steuern...Dein Jawa skript sieht genau nach der richtige Lösung aus. Nur ich fürchte es funktioniert wohl nur mit iobroker oder wie? Ich habe versucht es einfach blanco von Ubuntu mit node filterprofile.js auszuführen und kriege meckere:
on({id: FbIobObject, change: "ne"}, function (obj) { ^ ReferenceError: on is not defined
Gibt's eine Möglichkeit das überhaupt so von Command Line ohne iobroker zum Laufen zu bringen?
-
@juge
Moin !
Ne das geht nicht aus der Command Line. Da fehlen alle Libs von ioBroker ...Wenn es dir nur um das Sperren von ein paar Seiten geht dann ist PiHole sicher der effizientere Weg.
Ich mach das bei meinem Junior auch. Das schöne ist, dass man pro Gerät Sperrungen definieren kann in PiHole.
Aber das wird hier dann langsam etwas OT vermutlich ... -
eine Frage, wäre es möglich mit dem Skript auch die Ticketliste (unter Fritzbox-Internet-Filter-Zugangsprofile) in iobroker zu importieren/auszugeben, so dass die Tickets in einzelne Datenobjekte geschrieben werden könnten?
-
Hallo,
super Skript, leider bekomme ich es bei mir nicht zum laufen (manuelle Ausführung).
Bin dazu noch Newbe:Datenpunkte angelegt (Fritzbox.0... ging nicht):
const FbIobObject = "0_userdata.0.ChangeDeviceFilter"
const FbIobJsonList = "0_userdata.0.DeviceFilterListJson"Scheint auch alles durchzuführen:
Am Ende ist der jeweilige Filter aber unverändert.
Habe schon verschiedene Settings probiert
const FbDebugging = false;
const FbListOnly = false/true;
const FbCreateList = false/true;Kann jemand helfen ?
Danke
Hannes
// FB 7490 7.27
Update 15.10.2021:
Ich hatte statt der Profile ID den Namen verwendet. Wer lesen kann ist klar im Vorteil.
Bestätige die Funktion bei Fritzbox 7490 FW 7.28
-
Hey,
ich habe seit dem FW Update meiner FB 7590 das Problem, dass mir keine Device mehr angezeigt werden.
Hat sich irgendetwas in der FB-Einstellungen geändert?
Bekomme auch keine SID mehr zugeordnet.Hier mal das Log bei Static-Version:
10:17:48.213 info javascript.0 (22888) Stop script script.js.Meine_Scripte.Internetzugang 10:17:48.308 info javascript.0 (22888) Start javascript script.js.Meine_Scripte.Internetzugang 10:17:48.310 info javascript.0 (22888) script.js.Meine_Scripte.Internetzugang: Profile Changer started ... (Version : 1.09) 10:17:48.310 info javascript.0 (22888) script.js.Meine_Scripte.Internetzugang: function getFbChallenge 10:17:48.311 info javascript.0 (22888) script.js.Meine_Scripte.Internetzugang: Profile Changer done 10:17:48.311 info javascript.0 (22888) script.js.Meine_Scripte.Internetzugang: registered 0 subscriptions and 0 schedules 10:17:48.691 info javascript.0 (22888) script.js.Meine_Scripte.Internetzugang: > Challenge : f4d35392 10:17:48.691 info javascript.0 (22888) script.js.Meine_Scripte.Internetzugang: > MD5 : 278c6355de6b1ca2c16cc08c02ff4e0a 10:17:48.692 info javascript.0 (22888) script.js.Meine_Scripte.Internetzugang: > Login : response=f4d35392-278c6355de6b1ca2c16cc08c02ff4e0a&username= 10:17:48.692 info javascript.0 (22888) script.js.Meine_Scripte.Internetzugang: function getFbSid 10:17:49.767 info javascript.0 (22888) script.js.Meine_Scripte.Internetzugang: > SID : 0000000000000000 10:17:49.768 info javascript.0 (22888) script.js.Meine_Scripte.Internetzugang: function getFbProfiles 10:17:50.012 info javascript.0 (22888) script.js.Meine_Scripte.Internetzugang: > Decode Names 10:17:50.014 info javascript.0 (22888) script.js.Meine_Scripte.Internetzugang: > Decode Filters 10:17:50.014 info javascript.0 (22888) script.js.Meine_Scripte.Internetzugang: Filter Count : 0 10:17:50.014 info javascript.0 (22888) script.js.Meine_Scripte.Internetzugang: function getFbDevices 10:17:50.207 info javascript.0 (22888) script.js.Meine_Scripte.Internetzugang: > Decode Device Names 10:17:50.207 info javascript.0 (22888) script.js.Meine_Scripte.Internetzugang: > Decode Device Ids 10:17:50.208 info javascript.0 (22888) script.js.Meine_Scripte.Internetzugang: Device Count : 0 10:17:50.208 info javascript.0 (22888) script.js.Meine_Scripte.Internetzugang: DONE : Listmode - No Device blocking ...
An den Einstellungen am Script habe ich seit über 1 Jahr nichts mehr geändert.
// Die IP Der Fritzbox const FbIp = "192.168.178.1"; // Der User der Fritzbox // HINWEIS : Den Benutzer leer lassen wenn die Anmeldung an der FB nur mit Passwort erfolgt ! const FbUser = ""; // Das Password der Fritzbox const FbPassword = "**********"; // welcher Rechner soll "bearbeitet" werden var FbDevice = "Comp-L-Pi"; // Das neue Profil für den Rechner var FbProfile = "filtprof4"; // erweitertes Logging aktivieren für Fehlersuche const FbDebugging = false; // Keine Änderung an der Fritzbox (true) -> Listet dann nur alle Profile und Rechner const FbListOnly = true; // Device / Filter Liste erzeugen Ja (true), Nein (false) const FbCreateList = true; // Datenpunkt (string) für einen automatischen Script Start (muss angelegt werden!) // Der Datenpunkt wir mit Device;Profil beschrieben. Bsp: Comp-L-Pi;filtprof1 const FbIobObject = "0_userdata.0.Fritzbox.ChangeDeviceFilter" // Datenpunkt in den die Device / Filter Liste als JSON geschrieben wird const FbIobJsonList = "0_userdata.0.Fritzbox.DeviceFilterListJson"
Hat jemand ein ähnliches Problem seit dem FW-Update?
Grüße
FreaknetP.S.: Hat sich erledigt... Hab einfach einen Benutzer angelegt in der FB und schon läuft die Sache wieder
-
@freaknet genau, der Username ist Pflicht geworden.. das wars..
-
Hallo, ich nutze das Script schon länger, nun ist mir aufgefallen das der Filter nicht mehr die Richtigen Geräte ändert.
Ich habe z.B. folgende Geräte in der Fritzbox
Ben-Handy
Ben-CTLAPTOP-Ben
Mini-PC-BenWenn ich jetzt z.B. in "0_userdata.0.Fritzbox.ChangeDeviceFilter"
"Ben-Handy;filtprof880" eingebe, wird der Filter von "Ben-CT" geändert
und bei "LAPTOP-Ben;filtprof880" wird der Filter von "Mini-PC-Ben" geändert.
Seit wann das so ist, weiss ich leider nicht, ist mir gestern aufgefallen, weil Junior um 21:45Uhr noch am Laptop saß
Das kann ich so weiterführen, ist bei anderen Geräten genauso
EDIT sagt:
Ich habe gerade mal einige "Leichen" in der Fritzbox unter Heimnetz > Netzwerk > Netzwerkverbindungen gelöscht und den Eintrag bei 0_userdata.0.Fritzbox.DeviceFilterListJson gelöscht, steht also nichts mehr drin.
Scheint jetzt wieder zu funktionieren
-
erstmal Danke fürs Script. Läuft wunderbar und ich kann nun über mein node-red dashboard eine Camera das selbst erstellte Profil "blocked" zuweisen und auch wieder auf Standard stellen. Die Idee ist der Camera nur Internet zur Verfügung zu stellen wenn ich das auch explizit will. Ansonsten soll die Kamera nur im eigenen Netz erreichbar sein. Über das Schalten auf dem Dashboard wird das Profil auch sauber zugewiesen, ABER das Profil hat scheinbar überhaupt keine Wirkung! Das Profil "blocked" hat laut Configseite als onlineZeit "keine". Aber wie gesagt die Kamera ist trotzdem übers Handy ohne WLAN aktiviert erreichbar.
-
@moelski Hallo,
ich bin heute auf Ihr Skript gestoßen und würde dieses gerne in ioBroker einsetzen. Nach dem ich aus dem Post Ihr Skript in eingefügt habe und gestartet habe, erhalte ich leider folgende Meldung:
23:20:35.489 error javascript.0 (4980) script.js.FritzJava compile failed: at script.js.FritzJava:23Können Sie mir hier weiterhelfen?
Mit freundlichen Grüßen
Elmar
-
Hi Leute,
erstmal vielen Dank für das Mega-Script. Da die Kinder nun mit mehreren Geräten unterwegs sind (Switch und Android), möchte ich gerne alle Geräte gleichzeitig sperren, bzw. freigeben. Könnte ich mit dem Script auch "einfach" die Einstellung zum Zeitraum von "immer" auf "nie" setzen und die Geräte einfach immer in dem Profil lassen? So spare ich mir mehrere Knöpfe.
-
EDIT: GELÖST! Ich lasse es aber dennoch hier stehen. Lösung unten!
Okay,
ich bin lost und muss noch mal eine Frage zum Verständnis stellen, da ich nicht mehrere Geräte mit multiplen buttons in VIS bei Verwendung nur eines Scriptes steuern kann. Über Eure Hilfe würde ich mich sehr freuenIch habe "DeviceFilterListJson" automatisch befüllen lassen. Das hat funktioniert!
Unter anderem gibt es einen Eintrag:{ "Device": "iPhone-3", "Profile ID": "filtprof7324", "Profile Name": "Kidsclub", "Usage": "Gesperrt durch Zugangsprofil", "Time": "Onlinezeit aufgebraucht" },
Ich habe einen Datenpunkt vom Typ String angelegt.
{ "common": { "name": "Fire2", "desc": "Manually created", "role": "state", "type": "string", "read": true, "write": true, "def": "" }, "type": "state", "from": "system.adapter.admin.0", "user": "system.user.admin", "ts": 1655649177519, "_id": "0_userdata.0.Fire2", "acl": { "object": 1636, "state": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" } }
Nun ändere ich entweder über VIS oder manuell den Datenpunkt zu
iPhone-3;filtprof1
Oder eben zu
iPhone-3;filtprof7324
(was die ID zum Profil "Kidsclub" ist)
Im Log ist allerdings nichts zu sehen und in der Fritzbox tut sich auch nichts.
Meine Settings:
// Die IP Der Fritzbox const FbIp = "192.168.0.1"; // Der User der Fritzbox // HINWEIS : Den Benutzer leer lassen wenn die Anmeldung an der FB nur mit Passwort erfolgt ! const FbUser = "filter"; // Das Password der Fritzbox const FbPassword = "filter"; // welcher Rechner soll "bearbeitet" werden var FbDevice = ""; // Das neue Profil für den Rechner var FbProfile = ""; // erweitertes Logging aktivieren für Fehlersuche const FbDebugging = true; // Keine Änderung an der Fritzbox (true) -> Listet dann nur alle Profile und Rechner const FbListOnly = false; // Device / Filter Liste erzeugen Ja (true), Nein (false) const FbCreateList = false; // Datenpunkt (string) für einen automatischen Script Start (muss angelegt werden!) // Der Datenpunkt wir mit Device;Profil beschrieben. Bsp: Comp-L-Pi;filtprof1 const FbIobObject = "0_userdata.0.ChangeDeviceFilter" // Datenpunkt in den die Device / Filter Liste als JSON geschrieben wird const FbIobJsonList = "0_userdata.0.DeviceFilterListJson" var secChallenge; var secMd5; var secLogin; var secSid; var secProfileNames = []; var secProfileIds = []; var secDeviceNames = []; var secDeviceIds = []; var JsonList = ""; /******************************************************* * Object Trigger Version * Wenn auf einen Datenpunkt getriggert werden soll, dann muss der folgende Block auskommentiert werden. * FbIobObject muss mit einem string Datenpunkt versehen werden. * Den Static Teil dann auskommentieren ! * Diese Variante erlaubt es das Script dynamisch für alle Devices / Profile der FB zu verwenden. *******************************************************/ on({id: FbIobObject, change: "ne"}, function (obj) { console.log("Profile Changer started ... (Version : " + Version + ")"); var data = obj.state.val.split(";"); if (data.length != 2) { console.log("Wrong parameter : " + obj.state.val); return; } if (FbDebugging){ console.log(" > Datapoint : " + data); } console.log("Computer : " + data[0]); console.log("Filter : " + data[1]); FbDevice = data[0]; FbProfile = data[1]; getFbChallenge(); console.log("Profile Changer done"); }); /******************************************************* * Static Version * Die folgenden 3 Zeilen lassen das Script sofort laufen. * Dabei sollte der Object Trigger Block auskommentiert werden. *******************************************************/ //console.log("Profile Changer started ... (Version : " + Version + ")"); //getFbChallenge(); //console.log("Profile Changer done"); // Get the Challenge String from the FritzBox // Compute the md5 Hash function getFbChallenge(){ console.log("function getFbChallenge"); request.get({ url: 'http://' + FbIp + '/login_sid.lua?username=' + FbUser, headers: headers }, function(error, response, body) { if (error) log(error, 'error'); //console.log(response); // https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/RegExp // <?xml version="1.0" encoding="utf-8"?><SessionInfo><SID>0000000000000000</SID><Challenge>d36de231</Challenge><BlockTime>0</BlockTime><Rights></Rights></SessionI secChallenge = body.match(/Challenge>(.*)<\/Challenge/)[1]; console.log(" > Challenge : " + secChallenge); var uft16le = str2rstr_utf16le(secChallenge + "-" +FbPassword ); var md5 = rstr_md5(uft16le); secMd5 = rstr2hex(md5); console.log(" > MD5 : " + secMd5); // response="${challenge}-${md5}" // sid=$(curl -i -s -k -d "response=${response}&username=" "http://$1" | grep -Po -m 1 '(?<=sid=)[a-f\d]+' | tail -1) secLogin = "response=" + secChallenge + "-" + secMd5 + "&username=" + FbUser; console.log(" > Login : " + secLogin); getFbSid(); }); } .... und so weiter ....
Die beiden Datenpunkte vom Typ String existieren natürlich im IOB:
const FbIobObject = "0_userdata.0.ChangeDeviceFilter"
const FbIobJsonList = "0_userdata.0.DeviceFilterListJson"Jede Hilfe ist mir SEHR willkommen ...
DANKE!Ich bin so bescheuert. Natürlich muss ich die Änderungen in den Datenpunkt "ChangeDeviceFilter" packen und nicht in einen X-Beliebigen ...
-
@moelski Besteht die Möglichkeit, das gesamte Logging zu deaktivieren, oder muss ich die ganzen console.log Zeile auskommentieren?