FRITZBOX: Unterschied zwischen den Versionen
Topos (Diskussion | Beiträge) |
K (→Erste Schritte) |
||
(57 dazwischenliegende Versionen von 20 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
{{Infobox Modul | {{Infobox Modul | ||
|ModPurpose=Steuerung einer Fritz!Box über | |ModPurpose=Steuerung einer Fritz!Box über FHEM | ||
|ModType=d | |ModType=d | ||
|ModForumArea=FRITZ!Box | |ModForumArea=FRITZ!Box | ||
|ModTechName=72_FRITZBOX.pm | |ModTechName=72_FRITZBOX.pm | ||
|ModOwner= | |ModOwner=Jörg/JoWiemann ({{Link2FU|94|Forum}} / [[Benutzer Diskussion:JoWiemann|Wiki]])}} | ||
Das Modul [[FRITZBOX]] ermöglicht die Steuerung einer [[AVM Fritz!Box]] und von AVM FRITZ!WLAN Repeatern durch FHEM. An Fritzboxen können sowohl Geräte abgefragt werden, auf denen FHEM selbst läuft (lokaler Modus), als auch entfernte (externe) Geräte. | |||
{{Randnotiz|RNTyp=r|RNText=Ab FRITZ!OS 6.25 wird das zwingend benötigte Telnet nicht mehr unterstützt, es müssen also die TR-064 Funktionen genutzt werden.}} | |||
{{Randnotiz|RNTyp=y|RNText='''Fork seit Januar 2021'''</br> | |||
Im Januar 2021 wurde von einem anderen Autor ({{Link2FU|94|JoWiemann}}) ein Fork begonnen, der Korrekturen und Weiterentwicklungen enthält. Beschreibungen und Modulversionen sind in {{Link2Forum|Topic=118150|LinkText=diesem Forenbeitrag}} zu finden. | |||
Seit Januar 2023 sind beide Versionen wieder im Modul 72_FRITZBOX.pm zusammengeführt.}} | |||
== Voraussetzungen == | == Voraussetzungen == | ||
Zeile 15: | Zeile 20: | ||
Teilweise ist derzeit zusätzlich die Installation der telnet Libraries erforderlich, auch wenn der Telnet-Zugang nicht genutzt werden soll. Siehe dazu den nachfolgenden Abschnitt. | Teilweise ist derzeit zusätzlich die Installation der telnet Libraries erforderlich, auch wenn der Telnet-Zugang nicht genutzt werden soll. Siehe dazu den nachfolgenden Abschnitt. | ||
=== Telnet === | === Telnet (wird vom Modul nicht mehr unterstütz) === | ||
Das Modul basierte ursprünglich auf dem Zugriff auf die Fritzbox per Telnet. Ab FRITZ!OS 6.2x baut AVM den abgekündigten Telnet-Zugang sowie die webcm-Schnittstelle sukzessive zurück bzw. hat dies, je nach Firmware, schon ganz abgestellt (siehe {{Link2Forum|Topic=38586|LinkText=dieses Forenthema}}). Der zukunftssichere Zugriff auf die Fritzbox sollte also per TR-064 erfolgen. Der Vollständigkeit halber und für ältere Firmwareversionen: | <s>Das Modul basierte ursprünglich auf dem Zugriff auf die Fritzbox per Telnet. Ab FRITZ!OS 6.2x baut AVM den abgekündigten Telnet-Zugang sowie die webcm-Schnittstelle sukzessive zurück bzw. hat dies, je nach Firmware, schon ganz abgestellt (siehe {{Link2Forum|Topic=38586|LinkText=dieses Forenthema}}). Der zukunftssichere Zugriff auf die Fritzbox sollte also per TR-064 erfolgen. Der Vollständigkeit halber und für ältere Firmwareversionen:</s> | ||
# Wer den Zugang per Telnet (noch) nutzen (kann und) möchte, muss dies zuerst freischalten. Üblicherweise durch Eingabe von #96*7* an einem direkt an der entsprechenden FritzBox angeschlosssenen Telefon | # <s>Wer den Zugang per Telnet (noch) nutzen (kann und) möchte, muss dies zuerst freischalten. Üblicherweise durch Eingabe von #96*7* an einem direkt an der entsprechenden FritzBox angeschlosssenen Telefon</s> | ||
# Auf dem System, auf dem | # <s>Auf dem System, auf dem FHEM läuft ([[Systemübersicht#Server|Server]]) muss Telnet installiert sein; auf einem [[Raspberry Pi]] und unter Ubuntu z. B. mit dem Befehl</s> | ||
::<code>sudo apt-get install libnet-telnet-perl</code> | ::<code><s>sudo apt-get install libnet-telnet-perl</s></code> | ||
== Installation == | == Installation == | ||
=== Erste Schritte === | === Erste Schritte === | ||
Zur Erstinstallation reicht ein einfaches <code>define FritzBox FRITZBOX</code>, dieses Modul funktioniert lokal (FHEM auf Fritzbox) sowie per Fernzugriff (FHEM auf einem anderen Server im Netz, siehe nächsten Schritt). | Zur Erstinstallation reicht ein einfaches <code>define FritzBox FRITZBOX < ip oder Hostname> </code>, dieses Modul funktioniert lokal (FHEM auf Fritzbox) sowie per Fernzugriff (FHEM auf einem anderen Server im Netz, siehe nächsten Schritt). | ||
==== TR-064: Modul FRITZBOX für Zugriff auf einem externen Server einrichten ==== | ==== TR-064: Modul FRITZBOX für Zugriff auf einem externen Server einrichten ==== | ||
Zeile 30: | Zeile 35: | ||
Fritzbox definieren: | Fritzbox definieren: | ||
:<code>define FritzBox FRITZBOX</code> | :<code>define FritzBox FRITZBOX < IP oder Hostname ></code> | ||
192.168.168.168 dabei natürlich durch die passende IP ersetzen... Alternativ kann statt der IP auch der Hostname eingegeben werden. | 192.168.168.168 dabei natürlich durch die passende IP ersetzen... Alternativ kann statt der IP auch der Hostname eingegeben werden. | ||
Wenn das Login auf der Benutzeroberfläche der FritzBox mit User und Passwort (und nicht nur per Passwort) geschieht, den User konfigurieren: | Wenn ('''und nur wenn''') das Login auf der Benutzeroberfläche der FritzBox mit User und Passwort (und nicht nur per Passwort) geschieht, den User konfigurieren: | ||
:<code>attr FritzBox boxUser ''Benutzername'' </code> | :<code>attr FritzBox boxUser ''Benutzername'' </code> | ||
In der Fritzbox muss dann auch "Anmeldung mit FRITZ!Box-Benutzernamen und Kennwort" ausgewählt sein. | |||
Passwort konfigurieren: | Passwort konfigurieren: | ||
:<code>set FritzBox password ''Passwort''</code> - legt das zugehörige Passwort fest (nur einmal --> gehört nicht in die cfg-Datei | :<code>set FritzBox password ''Passwort''</code> - legt das zugehörige Passwort fest (nur einmal --> gehört nicht in die cfg-Datei | ||
== Anwendung == | == Anwendung == | ||
=== Define === | === Define === | ||
Siehe | Siehe {{Link2CmdRef|Lang=de|Anker=FRITZBOXdefine}} | ||
=== Attribute === | === Attribute === | ||
Siehe | Siehe {{Link2CmdRef|Lang=de|Anker=FRITZBOXattr}} | ||
=== TR-064 === | === TR-064 === | ||
Die offizielle Programmier-Schnittstelle der Fritz!Box läuft über das Protokoll TR-064. | Die offizielle Programmier-Schnittstelle der Fritz!Box läuft über das Protokoll TR-064. In der Web-Oberfläche der FritzBox muss die TR064 Schnittstelle explizit freigeschaltet sein. Ist dies nicht der Fall, werden entsprechende Informationen und Funktionen des Moduls deaktiviert. Der aktuelle Status wird im Device im Bereich Internals durch das Reading TR064 dargestellt. | ||
Mit dem Befehl | |||
:<code>get <device> tr064Command <service> <control> <action> [[parameterName1 parameterValue1] ...]</code> | |||
<code>get <device> tr064Command <service> <control> <action> [[parameterName1 parameterValue1] ...]</code | |||
freischalten und damit auf diese Schnittstelle zugreifen. | freischalten und damit auf diese Schnittstelle zugreifen. | ||
AVM hat die Schnittstellenbeschreibung unter [http://avm.de/service/schnittstellen/] veröffentlicht. Diese wird jedoch nur sehr sporadisch gepflegt. | AVM hat die Schnittstellenbeschreibung unter [http://avm.de/service/schnittstellen/] veröffentlicht. Diese wird jedoch nur sehr sporadisch gepflegt. | ||
Ein besserer Einstiegspunkt befindet sich auf der Box unter http://fritz.box:49000/tr64desc.xml. | |||
Die möglichen TR-064-Aktionen kann man auch über den Befehl <code>get <device> tr064ServiceList</code> auslesen. | Ein besserer Einstiegspunkt befindet sich auf der Box unter http://fritz.box:49000/tr64desc.xml. | ||
Die möglichen TR-064-Aktionen kann man auch über den Befehl | |||
:<code>get <device> tr064ServiceList</code> | |||
auslesen. | |||
Folgende | Folgende Services und Controls existieren (für den get-Befehl ''tr064Command'' werden nur die fett formatierten Wörter benötigt) | ||
{| class="wikitable" | {| class="wikitable" | ||
Zeile 168: | Zeile 139: | ||
== Anwendungsbeispiele == | == Anwendungsbeispiele == | ||
[[Datei:Screenshot_FritzBox1.png|mini|300px|rechts|FRITZBOX Gerät auf der | [[Datei:Screenshot_FritzBox1.png|mini|300px|rechts|FRITZBOX Gerät auf der FHEM Oberfläche]] | ||
Sollte alles geklappt haben, seht ihr nun unter "Unsortiert" den im nebenstehenden Screenshot gezeigten Eintrag für das "Gerät" (hier mit dem Icon "it_router"). | Sollte alles geklappt haben, seht ihr nun unter "Unsortiert" den im nebenstehenden Screenshot gezeigten Eintrag für das "Gerät" (hier mit dem Icon "it_router"). | ||
Zeile 174: | Zeile 145: | ||
*Box Reboot: <code>get <device> tr064Command DeviceConfig:1 deviceconfig Reboot</code> | *Box Reboot: <code>get <device> tr064Command DeviceConfig:1 deviceconfig Reboot</code> | ||
*Internet Reconnect: <code>get <device> tr064Command WANIPConnection:1 wanipconnection1 ForceTermination</code> | *Internet Reconnect: <code>get <device> tr064Command WANIPConnection:1 wanipconnection1 ForceTermination</code> | ||
*Smart Home | *Daten eines Smart-Home-Gerätes auslesen: <code>get <device> tr064Command X_AVM-DE_Homeauto:1 x_homeauto GetGenericDeviceInfos NewIndex 0</code> | ||
=== Klingel- und Sprachausgabe per TR-064 === | === Klingel- und Sprachausgabe per TR-064 === | ||
Das geht derzeit nicht, da entsprechende Kommandos per TR-064 nicht verfügbar sind. Da Telnet sukzessive abgestellt wird, sollten sich Interessenten per Feature-Request an AVM wenden, wie {{Link2Forum|Topic=38586|LinkText=hier}} beschrieben. | Das geht derzeit nicht, da entsprechende Kommandos per TR-064 nicht verfügbar sind. Da Telnet sukzessive abgestellt wird, sollten sich Interessenten per Feature-Request an AVM wenden, wie {{Link2Forum|Topic=38586|LinkText=hier}} beschrieben. | ||
Eine Alternative um Telefone klingeln zu lassen, ist die Nutzung des [[SIP-Client]]s. | |||
=== Anwesenheitserkennung per regelmäßiger Abfrage über das PRESENCE Modul === | === Anwesenheitserkennung per regelmäßiger Abfrage über das PRESENCE Modul === | ||
Zeile 185: | Zeile 158: | ||
Funktion in [[99_myUtils anlegen|99_myUtils]]: | Funktion in [[99_myUtils anlegen|99_myUtils]]: | ||
'''(Bitte beim Speichern darauf achten, dass nicht der Name 99_Utils gewählt wird.)''' | |||
< | <syntaxhighlight lang="perl">sub checkFritzMACpresent($$) { | ||
# Benötigt: Name der zu testenden Fritzbox ($ | # Benötigt: Name der zu testenden Fritzbox ($d), | ||
# zu suchende MAC ($ | # zu suchende MAC ($m), | ||
# Rückgabe: 1 = Gerät gefunden | # Rückgabe: 1 = Gerät gefunden | ||
# 0 = Gerät nicht gefunden | # 0 = Gerät nicht gefunden | ||
my ($ | my ($d,$m) = @_; | ||
$m =~ s/:/_/g; | |||
$m = "mac_".uc($m); | |||
$ | return (ReadingsVal($d,$m,"inactive") ne "inactive") ? 1 : 0; | ||
}</syntaxhighlight> | |||
</ | |||
Nutzung dieser Funktion mit dem PRESENCE Modul definieren: | Nutzung dieser Funktion mit dem PRESENCE Modul definieren: | ||
Zeile 221: | Zeile 181: | ||
=== Anwesenheitserkennung über mehrere Fritzboxen oder AVM Repeater und Fritzbox === | === Anwesenheitserkennung über mehrere Fritzboxen oder AVM Repeater und Fritzbox === | ||
Existiert ein AVM Repeater im Netzwerk, kann der als eigenständiges Gerät mit FRITZBOX definiert werden. WLAN Geräte an der Fritzbox werden in der Instanz der Fritzbox gelistet und WLAN Geräte am Repeater in der Repeater Instanz. Um trotzdem die Anwesenheit im Netzwerk einfach zu erkennen, muss die Subroutine in 99_myUtils.pm abgewandelt werden. | Existiert ein AVM Repeater im Netzwerk, kann der als eigenständiges Gerät mit FRITZBOX definiert werden. WLAN Geräte an der Fritzbox werden in der Instanz der Fritzbox gelistet und WLAN Geräte am Repeater in der Repeater Instanz. Um trotzdem die Anwesenheit im Netzwerk einfach zu erkennen, muss die Subroutine in 99_myUtils.pm abgewandelt werden. (Siehe auch [https://forum.fhem.de/index.php/topic,39433.msg1075247.html#msg1075247 Forum Beitrag]) | ||
Existiert eine zweite Fritzbox im Accesspointmodus, werden die WLAN Geräte im Netzwerk alle in der Hauptfritzbox an einem LAN Anschluss gelistet. D.h. man sieht an der Hauptfritzbox nicht, dass sie im WLAN sind. Eine zweite Instanz mit dem FRITZBOX Modul muss wegen der Anwesenheitserkennung nicht gemacht werden. Die folgende Routine kann aber universell eingesetzt werden, unabhängig von der Anzahl der FRITZBOX Instanzen. Wer mitloggen will, kann das analog zur obigen Routine einbauen | Existiert eine zweite Fritzbox im Accesspointmodus, werden die WLAN Geräte im Netzwerk alle in der Hauptfritzbox an einem LAN Anschluss gelistet. D.h. man sieht an der Hauptfritzbox nicht, dass sie im WLAN sind. Eine zweite Instanz mit dem FRITZBOX Modul muss wegen der Anwesenheitserkennung nicht gemacht werden. Die folgende Routine kann aber universell eingesetzt werden, unabhängig von der Anzahl der FRITZBOX Instanzen. Wer mitloggen will, kann das analog zur obigen Routine einbauen | ||
< | <syntaxhighlight lang="perl">sub checkAllFritzMACpresent($) { | ||
# Benötigt: nur die zu suchende MAC ($MAC), | # Benötigt: nur die zu suchende MAC ($MAC), | ||
# Es werden alle Instanzen vom Type FRITZBOX abgefragt | # Es werden alle Instanzen vom Type FRITZBOX abgefragt | ||
# | # | ||
Zeile 238: | Zeile 198: | ||
my @FBS = devspec2array("TYPE=FRITZBOX"); | my @FBS = devspec2array("TYPE=FRITZBOX"); | ||
foreach( @FBS ) { | foreach( @FBS ) { | ||
my $StatusFritz = ReadingsVal($_, $MAC, "weg"); | |||
if ($StatusFritz eq "weg") { | |||
# Dieser Zweig testet ob das Reading vorhanden ist | |||
} elsif ($StatusFritz eq "inactive") { | |||
# Dieser Zweig testet ob im Reading inactive steht | |||
} elsif ($StatusFritz =~ /(.*)s, 0/) { | |||
# Dieser Zweig testet auf "<geraetename> (WLAN, 0 / 0 Mbit/s, 0)" | |||
} else { $Status = 1} | |||
} | } | ||
return $Status | return $Status | ||
} | }</syntaxhighlight> | ||
</ | |||
Da hiermit nach allen Instanzen mit dem TYPE=FRITZBOX durchsucht wird, braucht der Name der Fritzbox nicht angegeben werden. | Da hiermit nach allen Instanzen mit dem TYPE=FRITZBOX durchsucht wird, braucht der Name der Fritzbox nicht angegeben werden. | ||
Zeile 259: | Zeile 219: | ||
Der von Fritzboxen und Fritz!WLAN Repeatern gespeicherte Status zum Status angemeldeter Geräte lässt sich (statt per PRESENCE, s.o.) auch per [[notify]] anfragen: | Der von Fritzboxen und Fritz!WLAN Repeatern gespeicherte Status zum Status angemeldeter Geräte lässt sich (statt per PRESENCE, s.o.) auch per [[notify]] anfragen: | ||
< | <syntaxhighlight lang="perl">define n_PRESENCE_mac_AA_BB_CC_DD_EE_FF notify Fritzbox:mac_AA_BB_CC_DD_EE_FF:.* { | ||
if (ReadingsVal( | my $s = "absent"; | ||
$s = "present" if (ReadingsVal($NAME,"mac_AA_BB_CC_DD_EE_FF","inactive") ne "inactive"); | |||
fhem("set anwesend_smartphone $s"); | |||
}</syntaxhighlight> | |||
}</ | |||
Hinweise: | Hinweise: | ||
* <code>fhem("set anwesend_smartphone | * <code>fhem("set anwesend_smartphone $s");</code> ist nur ein Beispiel, das einen Dummy auf den Status "absent" bzw. "present" setzt. Man kann hier natürlich auch gleich entsprechende Aktionen durchführen. Wer das Beispiel übernehmen möchte, sollte den Dummy vorher definieren (<code>define anwesend_smartphone dummy</code>). | ||
* mac_AA_BB_CC_DD_EE_FF ist die MAC-Adresse des gesuchten Geräts. | * mac_AA_BB_CC_DD_EE_FF ist die MAC-Adresse des gesuchten Geräts. | ||
* "Fritzbox" ist der Name, unter dem die Fritzbox als FRITZBOX-Modul definiert wurde. | * "Fritzbox" ist der Name, unter dem die Fritzbox als FRITZBOX-Modul definiert wurde. | ||
* Das Notify funktioniert, weil Geräte, wenn sie sich abgemeldet haben, erst den Status "inactive" erhalten. Ist das Gerät ganz abgemeldet, verschwindet das mac_.*-Reading. Dabei löst das Notify nicht mehr aus. Da das mac-.*-Reading aber vorher auf "inactive" stand, wurde die Abwesend-Aktion schon ausgeführt. | * Das Notify funktioniert, weil Geräte, wenn sie sich abgemeldet haben, erst den Status "inactive" erhalten. Ist das Gerät ganz abgemeldet, verschwindet das mac_.*-Reading. Dabei löst das Notify nicht mehr aus. Da das mac-.*-Reading aber vorher auf "inactive" stand, wurde die Abwesend-Aktion schon ausgeführt. | ||
* Damit der Notify nicht andauernd losgeht, sollte man mittels <code>attr Fritzbox [[event-on-change-reading]] mac_AA_BB_CC_DD_EE_FF</code> Events nur auslösen, wenn sich der Status des Gerätes ändert. Will man mehrere Geräte abfragen, sollte man <code>attr Fritzbox event-on-change-reading mac_AA_BB_CC_DD_EE_FF,mac_GG_HH_II_JJ_KK_LL</code> setzen, damit bei der Änderung jedes Readings ein Event ausgelöst wird. | * Damit der Notify nicht andauernd losgeht, sollte man mittels <code>attr Fritzbox [[event-on-change-reading]] mac_AA_BB_CC_DD_EE_FF</code> Events nur auslösen, wenn sich der Status des Gerätes ändert. Will man mehrere Geräte abfragen, sollte man <code>attr Fritzbox event-on-change-reading mac_AA_BB_CC_DD_EE_FF,mac_GG_HH_II_JJ_KK_LL</code> setzen, damit bei der Änderung jedes Readings ein Event ausgelöst wird. | ||
Ein alternativer Ansatz mit einem [[DOIF]]: | |||
<syntaxhighlight lang="perl"> | |||
define di_PRESENCE_handy DOIF (\ | |||
[Fritzbox:mac_AA_BB_CC_DD_EE_FF,"inactive"] eq "inactive"\ | |||
)\ | |||
( msg Tschuess )\ | |||
DOELSE\ | |||
( msg Hallo ) | |||
attr di_PRESENCE_handy cmdState absent|present | |||
</syntaxhighlight>Für das DOIF gelten im Wesentlichen dieselben Hinweise wie für das notify oben und auch die im nächsten Abschnitt beschriebenen Vor- und Nachteile. Man bekommt allerdings dank dem <code>attr cmdState</code> auch gleichzeitig noch ein Device mit dem passenden Status "frei Haus", kann sich also das oben beschriebene dummy-Device sparen und auch das <code>event-on-change-reading</code> sollte nicht nötig sein. | |||
=== Vergleich Anwesenheitserkennung PRESENCE/Notify === | === Vergleich Anwesenheitserkennung PRESENCE/Notify === | ||
Zeile 283: | Zeile 250: | ||
Der Nachteil des Notify kann verringert werden, wenn man statt <code>attr Fritzbox event-on-change-reading mac_AA_BB_CC_DD_EE_FF</code> ein <code>attr Fritzbox [[event-on-update-reading]] mac_AA_BB_CC_DD_EE_FF</code> setzt. Das erhöht allerdings die Systemlast und funktioniert auch nur für den Status "anwesend". Bei "abwesend" ist kein Reading vorhanden, so dass auch event-on-update-reading nicht ausgeführt wird. | Der Nachteil des Notify kann verringert werden, wenn man statt <code>attr Fritzbox event-on-change-reading mac_AA_BB_CC_DD_EE_FF</code> ein <code>attr Fritzbox [[event-on-update-reading]] mac_AA_BB_CC_DD_EE_FF</code> setzt. Das erhöht allerdings die Systemlast und funktioniert auch nur für den Status "anwesend". Bei "abwesend" ist kein Reading vorhanden, so dass auch event-on-update-reading nicht ausgeführt wird. | ||
Eine weitere Möglichkeit, den Nachteil der Notify-Methode auszugleichen, ist, die Statusabfrage beim Systemstart einmal manuell auszuführen, durch ein notify auf "GLOBAL:initialized": | Eine weitere Möglichkeit, den Nachteil der Notify-Methode auszugleichen, ist, die Statusabfrage beim Systemstart einmal manuell auszuführen, durch ein notify auf "GLOBAL:initialized": | ||
< | <syntaxhighlight lang="perl">global:INITIALIZED { | ||
global:INITIALIZED { | my $s = "absent"; | ||
$s = "present" if (ReadingsVal("Fritzbox","mac_AA_BB_CC_DD_EE_FF","inactive") ne "inactive"); | |||
if (ReadingsVal("Fritzbox", "mac_AA_BB_CC_DD_EE_FF", "inactive") | fhem("set anwesend_smartphone $s"); | ||
}</syntaxhighlight> | |||
} | |||
</ | |||
Das hilft allerdings nur beim Systemstart. Nicht, wenn FHEM aufgrund irgendwelcher Hänger eine Aktualisierung des Status verpasst hat. | Das hilft allerdings nur beim Systemstart. Nicht, wenn FHEM aufgrund irgendwelcher Hänger eine Aktualisierung des Status verpasst hat. | ||
=== userReadings per get tr064Command === | === userReadings per ''get tr064Command'' oder ''get luaQuery'' === | ||
Um dem Gerätewert <userReadingName> den Wert von <VariabelName> aus der Rückgabe des get-Befehls ''tr064Command'' zuzuordnen | Um dem Gerätewert <userReadingName> den Wert von <VariabelName> aus der Rückgabe des get-Befehls ''tr064Command'' oder ''luaQuery'' zuzuordnen | ||
<pre> | <pre> | ||
attr <device> userReadings <userReadingName> {my $resp=fhem("get <device> tr064Command <service> <control> <action> [[<argName1> <argValue1>] ...]",1);;$resp =~/\'<VariabelName>\' => '(.*)'/;;return $1;;} | attr <device> userReadings <userReadingName> {my $resp=fhem("get <device> tr064Command <service> <control> <action> [[<argName1> <argValue1>] ...]",1);;$resp =~/\'<VariabelName>\' => '(.*)'/;;return $1;;} | ||
</pre> | </pre> | ||
{{Randnotiz|RNTyp=r|RNText='''VORSICHT''': man sollte einen genaueren Trigger für diese userReadings setzen, sonst wird bei jeder Aktualierung von jedem Reading das get Kommando ausgeführt, was ganz schnell ein (für fhem blockierende) Dauerlaufer werden kann.}} | |||
Beispielsweise | Beispielsweise | ||
<pre>attr Fritzbox userReadings urMobilteil_1 {my $resp=fhem("get Fritzbox tr064Command X_AVM-DE_OnTel:1 x_contact GetDECTHandsetInfo NewDectID 1",1);;$resp =~/'NewHandsetName' => '(.*)'/;;return $1;;}, | <pre>attr Fritzbox userReadings urMobilteil_1 {my $resp=fhem("get Fritzbox tr064Command X_AVM-DE_OnTel:1 x_contact GetDECTHandsetInfo NewDectID 1",1);;$resp =~/'NewHandsetName' => '(.*)'/;;return $1;;}, | ||
urDownstreamDSLRate {my $resp=fhem("get Fritzbox tr064Command WANDSLInterfaceConfig:1 wandslifconfig1 GetInfo",1);;$resp =~/'NewDownstreamCurrRate' => '(.*)'/;;return $1;;}, | urDownstreamDSLRate {my $resp=fhem("get Fritzbox tr064Command WANDSLInterfaceConfig:1 wandslifconfig1 GetInfo",1);;$resp =~/'NewDownstreamCurrRate' => '(.*)'/;;return $1;;}, | ||
urUpstreamDSLRate {my $resp=fhem("get Fritzbox tr064Command WANDSLInterfaceConfig:1 wandslifconfig1 GetInfo",1);;$resp =~/'NewUpstreamCurrRate' => '(.*)'/;;return $1;;}</pre> | urUpstreamDSLRate {my $resp=fhem("get Fritzbox tr064Command WANDSLInterfaceConfig:1 wandslifconfig1 GetInfo",1);;$resp =~/'NewUpstreamCurrRate' => '(.*)'/;;return $1;;}</pre> | ||
oder bei einzelnen Werte über ''get luaQuery''<pre>attr Fritzbox userReadings sip1_connect {my $resp=fhem("get Fritzbox luaQuery sip:settings/sip1/connect",1);;$resp =~/([0-9])$/;;return $1;;}</pre> | |||
=== Klingelton-Einstellung und Abspielen von Sprachnachrichten bei Fritz!OS-Versionen >6.24 === | === Klingelton-Einstellung und Abspielen von Sprachnachrichten bei Fritz!OS-Versionen >6.24 === | ||
Zeile 312: | Zeile 277: | ||
'''ACHTUNG''': Vor allem nach einem Update der FritzBox kann es durch dieses Attribut zu ungewolltem Verstellen von Werten in der Fritzbox kommen. | '''ACHTUNG''': Vor allem nach einem Update der FritzBox kann es durch dieses Attribut zu ungewolltem Verstellen von Werten in der Fritzbox kommen. | ||
Bei Verwendung der ring-Parameter "play:" und "say:" wird die abzuspielende URL in die M3U-Datei, die unter dem Internal ''M3U_LOCAL'' steht, eingetragen. | Bei Verwendung der ring-Parameter "play:" und "say:" wird die abzuspielende URL in die M3U-Datei, die unter dem Internal ''M3U_LOCAL'' steht, eingetragen. | ||
Aufgrund der Beschränkungen von [[FHEMWEB]] ist es | Standardmäßig wird versucht, diese Datei im image-Verzeichnis von FHEM abzulegen. Diese kann dann vom Fritz!Fon über [[FHEMWEB]] abgespielt werden (IP-Freigaben beachten). Direkt nach dem ersten Anlegen der m3u-Datei kennt [[FHEMWEB]] diese noch nicht, daher bitte entweder ''set <webdevice> rereadicons'' ausführen oder FHEM neu starten. | ||
Aufgrund der Beschränkungen von [[FHEMWEB]] oder auch bei Authentifizierungsanforderungen ist es empfehlenswert, die Datei über das Attribute ''m3uFileLocal'' selber vorzugeben. Am besten auf einem Webserver, der auf dem FHEM-Server läuft und dessen Seiten-Verzeichnis durch FHEM beschreibbar ist. Beispiel: | |||
:<code>attr Fritzbox m3uFileLocal /var/www/mp3/Fritzbox.m3u</code> | |||
In dem Radioeintrag ''FHEM'' muss dann '''auf der FritzBox''', die '''Web'''-Adresse der entsprechenden Datei eingetragen werden. Dieser Sender sollte zu Testzwecken dann auch einmal am Fritz!Fon von Hand gestartet werden. | |||
Das Modul versucht, beim Start die einzutragende Radio-URL im image-Verzeichnis selber zu ermitteln (IP-Freigabe beachten). Gelingt dies, so steht diese im Internal ''M3U_URL''. | Das Modul versucht, beim Start die einzutragende Radio-URL im image-Verzeichnis selber zu ermitteln (IP-Freigabe beachten). Gelingt dies, so steht diese im Internal ''M3U_URL''. | ||
=== Ring auf mehreren Telefonen gleichzeitig === | === Ring auf mehreren Telefonen gleichzeitig === | ||
Damit mehrere Telefone per ring gleichzeitig klingeln, muss in der Fritzbox eine Rufgruppe definiert werden. | |||
Damit mehrere Telefone per ring gleichzeitig | |||
Sollte eine Türsprechanlage schon in Benutzung sein, kann die eventuell hierfür bereits eingerichtete Gruppe verwendet werden. | Sollte eine Türsprechanlage schon in Benutzung sein, kann die eventuell hierfür bereits eingerichtete Gruppe verwendet werden. | ||
Das Anlegen der Gruppe kann wie in folgender AVM Anleitung beschrieben erledigt werden. [https://avm.de/service/fritzbox/fritzbox-7390/wissensdatenbank/publication/show/1148_Interne-Rufgruppe-in-FRITZ-Box-einrichten-Gruppenruf/ AVM Interne Rufgruppe anlegen] | |||
<code>set FritzBox ring 791 15 show:Türklingel</code> | Es muss eine Kurzwahl bei der Gruppe zwingend hinterlegt sein. Danach kann mit folgendem Beispielcode gearbeitet werden: | ||
:<code>set FritzBox ring 791 15 show:Türklingel</code> | |||
Name des Devices, Rufgruppen Nummer, Länge und gezeigter Text auf das | Name des Devices, Rufgruppen Nummer, Länge und gezeigter Text auf das Gewünschte anpassen. | ||
== Bekannte Probleme / Fehlersuche == | == Bekannte Probleme / Fehlersuche == | ||
=== Fehler nach Firmware Update === | |||
Typischer Fehler ist hier "Error: 403 Forbidden". | |||
Nach einem Firmwareupdate der Fritzbox am besten auch FHEM neu starten. | |||
=== Modul bleibt im Status "Check APIs" hängen=== | === Modul bleibt im Status "Check APIs" hängen=== | ||
Im Log steht die Meldung: "Error: Timeout when reading Fritz!Box data.". | Im Log steht die Meldung: "Error: Timeout when reading Fritz!Box data.". | ||
Mögliche Ursache: Nutzung des FHEM-Befehls [[ | Mögliche Ursache: Nutzung des FHEM-Befehls [[rereadcfg]]. Dieser verträgt sich nicht mit dem Modul "blocking.pm", das für parallel laufende FHEM-Prozesse genutzt wird. | ||
Abhilfe schafft ein Neustart <code>shutdown restart</code> oder das Einfügen eines zusätzlichen, lokalen Telnet-Ports z.B. durch <code>define tPortLocal telnet 7073</code> | Abhilfe schafft ein Neustart <code>shutdown restart</code> oder das Einfügen eines zusätzlichen, lokalen Telnet-Ports z.B. durch <code>define tPortLocal telnet 7073</code> | ||
Zeile 346: | Zeile 315: | ||
Abhilfe schafft hier nur ein notify auf das 5 GHz WLAN mit einem nachträglichem Anschalten des 2.4 GHz WLAN. | Abhilfe schafft hier nur ein notify auf das 5 GHz WLAN mit einem nachträglichem Anschalten des 2.4 GHz WLAN. | ||
Alternativ kann das Ausschalten des WLANs nicht direkt über TR064-Kommandos, sondern über einen indirekten Weg erfolgen: über TR064 ein set call abzusetzen und hier den Tastencode zum Ausschalten des WLANs einzugeben, bei einer FritzBox 7490 wäre dies z. B. #96*0*. | |||
Schaltet man über diese Methode das WLAN aus, kann es über die Nachtschaltung wieder automatisch auf beiden Frequenzen angeschaltet werden. | |||
=== Kabelboxen === | === Kabelboxen === | ||
Bei Fritz!Boxen für den Kabelanschluss (z.B. Kabel Deutschland) scheint neben Telnet auch die TR064-API nicht zu funktionieren. Vermutlich wurde die API von AVM auf Betreiberwunsch deaktiviert, da man sonst Dinge ändern kann, die das gesamte Kabelnetz stören können. | Bei Fritz!Boxen für den Kabelanschluss (z.B. Kabel Deutschland) scheint neben Telnet auch die TR064-API nicht zu funktionieren. Vermutlich wurde die API von AVM auf Betreiberwunsch deaktiviert, da man sonst Dinge ändern kann, die das gesamte Kabelnetz stören können. | ||
Zumindest für Unitymedia und einer FRITZ!Box 6490 Cable (lgi) mit FRITZ!OS:06.50 funktioniert TR064. | |||
Eine Rufumleitung bei Abwesenheit (Modul PRESENCE) funktioniert mit einer vorher eingerichten Telefonnummer wie folgt: | |||
<code>define Rufumleitung DOIF ([Anwesenheit.dum:state] eq "off") (set FritzBox6490 diversity 1 on) DOELSEIF ([Anwesenheit.dum:state] eq "on") (set FritzBox6490 diversity 1 off)</code> | |||
=== Wenn's nicht klingelt === | === Wenn's nicht klingelt === | ||
Zeile 355: | Zeile 332: | ||
=== TR064-Transport-Error: 500 Can't connect to ...:49443 (certificate verify failed) === | === TR064-Transport-Error: 500 Can't connect to ...:49443 (certificate verify failed) === | ||
Eventuell hilft es, die Perl Module Net::HTTPS, Net::SSL und IO::Socket::SSL zu aktualisieren. | Eventuell hilft es, die Perl Module Net::HTTPS, Net::SSL und IO::Socket::SSL zu aktualisieren. | ||
=== "Error: Old SID not valid anymore." nach Erlauben von IPv6 auf der Fritzbox === | |||
Ohne hier den genauen Grund zu kennen - es hilft die Angabe der IPv4-Adresse: also statt <code>define FritzBox FRITZBOX</code> dann <code>define FritzBox FRITZBOX <IP></code> (z.B. <code>define FritzBox FRITZBOX 192.168.10.1</code>), so dass das Modul nicht über IPv6 geht. | |||
=== "Didn't get a session ID" === | |||
Bei gleichzeitiger Nutzung anderer Module für die Fritzbox (z.B. {{Link2CmdRef|Anker=FBAHAHTTP|Lang=en|Label=FBAHAHTTP}}) muss der Zugang über Benutzername und Password erfolgen. | |||
:<code>attr <DEVICE> boxUser <USER></code> | |||
Da das FRITZBOX-Modul eine inoffizielle Schnittstelle benutzt, muss dann auch der normale Zugang zur Box auf "Benutzername und Password" eingestellt sein. | |||
In der Firmware 6.92 wird der Zugang über die Menüs "System"->"Fritz!Box-Benutzer"->"Anmeldung im Heimnetz" eingestellt. | |||
Oft wird aber auch ein falsches oder gar kein Passwort gesetzt. | |||
:<code>set <DEVICE> password <PASSWORD></code> | |||
=== TR064-Error 401:invalid action === | |||
Eventuell ist auf der Fritzbox ein Benutzer gesetzt und im Modul nicht korrekt angegeben bzw. mit falschen Rechten versehen (attribut boxUser). | |||
== Links == | == Links == | ||
* {{Link2Forum|Topic=29725|LinkText=Forenthread}} zu diesem Modul | * {{Link2Forum|Topic=29725|LinkText=Forenthread}} zu diesem Modul | ||
* Neuer Support Thread im Forum, {{Link2Forum|Topic=70064|LinkText=ab April 2017}} | |||
[[Kategorie:FritzBox]] | [[Kategorie:FritzBox]] | ||
[[Kategorie:Akustische Ausgabe]] |
Aktuelle Version vom 21. April 2023, 10:51 Uhr
FRITZBOX | |
---|---|
Zweck / Funktion | |
Steuerung einer Fritz!Box über FHEM | |
Allgemein | |
Typ | Gerätemodul |
Details | |
Dokumentation | EN / DE |
Support (Forum) | FRITZ!Box |
Modulname | 72_FRITZBOX.pm |
Ersteller | Jörg/JoWiemann (Forum / Wiki) |
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref! |
Das Modul FRITZBOX ermöglicht die Steuerung einer AVM Fritz!Box und von AVM FRITZ!WLAN Repeatern durch FHEM. An Fritzboxen können sowohl Geräte abgefragt werden, auf denen FHEM selbst läuft (lokaler Modus), als auch entfernte (externe) Geräte.
Im Januar 2021 wurde von einem anderen Autor (JoWiemann ) ein Fork begonnen, der Korrekturen und Weiterentwicklungen enthält. Beschreibungen und Modulversionen sind in diesem Forenbeitrag zu finden.
Seit Januar 2023 sind beide Versionen wieder im Modul 72_FRITZBOX.pm zusammengeführt.
Voraussetzungen
Remote-Zugang
Für den Remote-Zugang müssen die Module JSON:XS, LWP und SOAP::Lite installiert sein; auf einem Raspberry Pi oder unter Ubuntu z. B. mit dem Befehl
sudo apt-get install libjson-perl libwww-perl libsoap-lite-perl libjson-xs-perl
Teilweise ist derzeit zusätzlich die Installation der telnet Libraries erforderlich, auch wenn der Telnet-Zugang nicht genutzt werden soll. Siehe dazu den nachfolgenden Abschnitt.
Telnet (wird vom Modul nicht mehr unterstütz)
Das Modul basierte ursprünglich auf dem Zugriff auf die Fritzbox per Telnet. Ab FRITZ!OS 6.2x baut AVM den abgekündigten Telnet-Zugang sowie die webcm-Schnittstelle sukzessive zurück bzw. hat dies, je nach Firmware, schon ganz abgestellt (siehe dieses Forenthema). Der zukunftssichere Zugriff auf die Fritzbox sollte also per TR-064 erfolgen. Der Vollständigkeit halber und für ältere Firmwareversionen:
Wer den Zugang per Telnet (noch) nutzen (kann und) möchte, muss dies zuerst freischalten. Üblicherweise durch Eingabe von #96*7* an einem direkt an der entsprechenden FritzBox angeschlosssenen TelefonAuf dem System, auf dem FHEM läuft (Server) muss Telnet installiert sein; auf einem Raspberry Pi und unter Ubuntu z. B. mit dem Befehl
sudo apt-get install libnet-telnet-perl
Installation
Erste Schritte
Zur Erstinstallation reicht ein einfaches define FritzBox FRITZBOX < ip oder Hostname>
, dieses Modul funktioniert lokal (FHEM auf Fritzbox) sowie per Fernzugriff (FHEM auf einem anderen Server im Netz, siehe nächsten Schritt).
TR-064: Modul FRITZBOX für Zugriff auf einem externen Server einrichten
Für den Fernzugriff über TR-064 auf eine oder mehrere Fritzboxen und/oder einen FRITZ!WLAN Repeater sind die folgenden Schritte nötig (für jedes Gerät):
Fritzbox definieren:
define FritzBox FRITZBOX < IP oder Hostname >
192.168.168.168 dabei natürlich durch die passende IP ersetzen... Alternativ kann statt der IP auch der Hostname eingegeben werden.
Wenn (und nur wenn) das Login auf der Benutzeroberfläche der FritzBox mit User und Passwort (und nicht nur per Passwort) geschieht, den User konfigurieren:
attr FritzBox boxUser Benutzername
In der Fritzbox muss dann auch "Anmeldung mit FRITZ!Box-Benutzernamen und Kennwort" ausgewählt sein.
Passwort konfigurieren:
set FritzBox password Passwort
- legt das zugehörige Passwort fest (nur einmal --> gehört nicht in die cfg-Datei
Anwendung
Define
Siehe commandref/FRITZBOXdefine
Attribute
Siehe commandref/FRITZBOXattr
TR-064
Die offizielle Programmier-Schnittstelle der Fritz!Box läuft über das Protokoll TR-064. In der Web-Oberfläche der FritzBox muss die TR064 Schnittstelle explizit freigeschaltet sein. Ist dies nicht der Fall, werden entsprechende Informationen und Funktionen des Moduls deaktiviert. Der aktuelle Status wird im Device im Bereich Internals durch das Reading TR064 dargestellt.
Mit dem Befehl
get <device> tr064Command <service> <control> <action> [[parameterName1 parameterValue1] ...]
freischalten und damit auf diese Schnittstelle zugreifen.
AVM hat die Schnittstellenbeschreibung unter [1] veröffentlicht. Diese wird jedoch nur sehr sporadisch gepflegt.
Ein besserer Einstiegspunkt befindet sich auf der Box unter http://fritz.box:49000/tr64desc.xml. Die möglichen TR-064-Aktionen kann man auch über den Befehl
get <device> tr064ServiceList
auslesen.
Folgende Services und Controls existieren (für den get-Befehl tr064Command werden nur die fett formatierten Wörter benötigt)
serviceType | controlURL | XML | Dokument bei AVM |
---|---|---|---|
urn:dslforum-org:service:DeviceInfo:1 | /upnp/control/deviceinfo | deviceinfoSCPD.xml | deviceinfoSCPD.pdf |
urn:dslforum-org:service:DeviceConfig:1 | /upnp/control/deviceconfig | deviceconfigSCPD.xml | deviceconfigSCPD.pdf |
urn:dslforum-org:service:Layer3Forwarding:1 | /upnp/control/layer3forwarding | layer3forwardingSCPD.xml | layer3forwardingSCPD.pdf |
urn:dslforum-org:service:LANConfigSecurity:1 | /upnp/control/lanconfigsecurity | lanconfigsecuritySCPD.xml | lanconfigsecuritySCPD.pdf |
urn:dslforum-org:service:ManagementServer:1 | /upnp/control/mgmsrv | mgmsrvSCPD.xml | mgmsrvSCPD.pdf |
urn:dslforum-org:service:Time:1 | /upnp/control/time | timeSCPD.xml | timeSCPD.pdf |
urn:dslforum-org:service:UserInterface:1 | /upnp/control/userif | userifSCPD.xml | userifSCPD.pdf |
urn:dslforum-org:service:X_VoIP:1 | /upnp/control/x_voip | x_voipSCPD.xml | x_voipSCPD.pdf |
urn:dslforum-org:service:X_AVM-DE_Storage:1 | /upnp/control/x_storage | x_storageSCPD.xml | x_storageSCPD.pdf |
urn:dslforum-org:service:X_AVM-DE_OnTel:1 | /upnp/control/x_contact | x_contactSCPD.xml | x_contactSCPD.pdf |
urn:dslforum-org:service:X_AVM-DE_WebDAVClient:1 | /upnp/control/x_webdav | x_webdavSCPD.xml | x_webdavSCPD.pdf |
urn:dslforum-org:service:X_AVM-DE_UPnP:1 | /upnp/control/x_upnp | x_upnpSCPD.xml | x_upnp.pdf |
urn:dslforum-org:service:X_AVM-DE_RemoteAccess:1 | /upnp/control/x_remote | x_remoteSCPD.xml | x_remoteSCPD.pdf |
urn:dslforum-org:service:X_AVM-DE_MyFritz:1 | /upnp/control/x_myfritz | x_myfritzSCPD.xml | x_myfritzSCPD.pdf |
urn:dslforum-org:service:X_AVM-DE_TAM:1 | /upnp/control/x_tam | x_tamSCPD.xml | x_tam.pdf |
urn:dslforum-org:service:X_AVM-DE_AppSetup:1 | /upnp/control/x_appsetup | x_homeautoSCPD.xml | x_appsetupSCPD.pdf |
urn:dslforum-org:service:X_AVM-DE_Homeauto:1 | /upnp/control/x_homeauto | x_homeautoSCPD.xml | x_homeautoSCPD.pdf |
urn:dslforum-org:service:WLANConfiguration:1 | /upnp/control/wlanconfig1 | wlanconfigSCPD.xml | wlanconfigSCPD.pdf |
urn:dslforum-org:service:WLANConfiguration:2 | /upnp/control/wlanconfig2 | wlanconfigSCPD.xml | wlanconfigSCPD.pdf |
urn:dslforum-org:service:WLANConfiguration:3 | /upnp/control/wlanconfig3 | wlanconfigSCPD.xml | wlanconfigSCPD.pdf |
urn:dslforum-org:service:Hosts:1 | /upnp/control/hosts | hostsSCPD.xml | hostsSCPD.pdf |
urn:dslforum-org:service:LANEthernetInterfaceConfig:1 | /upnp/control/lanethernetifcfg | lanifconfigSCPD.xml | lanifconfigSCPD.pdf |
urn:dslforum-org:service:LANHostConfigManagement:1 | /upnp/control/lanhostconfigmgm | lanhostconfigmgmSCPD.xml | lanhostconfigmgmSCPD.pdf |
urn:dslforum-org:service:WANCommonInterfaceConfig:1 | /upnp/control/wancommonifconfig1 | wancommonifconfigSCPD.xml | wancommonifconfigSCPD.pdf |
urn:dslforum-org:service:WANDSLInterfaceConfig:1 | /upnp/control/wandslifconfig1 | wandslifconfigSCPD.xml | wandslifconfigSCPD.pdf |
urn:dslforum-org:service:WANDSLLinkConfig:1 | /upnp/control/wandsllinkconfig1 | wandsllinkconfigSCPD.xml | wandsllinkconfigSCPD.pdf |
urn:dslforum-org:service:WANEthernetLinkConfig:1 | /upnp/control/wanethlinkconfig1 | wanethlinkconfigSCPD.xml | wanethlinkconfigSCPD.pdf |
urn:dslforum-org:service:WANPPPConnection:1 | /upnp/control/wanpppconn1 | wanpppconnSCPD.xml | wanpppconnSCPD.pdf |
urn:dslforum-org:service:WANIPConnection:1 | /upnp/control/wanipconnection1 | wanipconnSCPD.xml | wanipconnSCPD.pdf |
Status-Symbol
attr <device> devStateIcon .*on.*off:WLAN_on_gWLAN_off .*on.*on.*:WLAN_on_gWLAN_on WLAN..off.*:WLAN_off
Im Verzeichnis www/images/default müssen die passenden Dateien "WLAN_on_gWLAN_off.png", "WLAN_on_gWLAN_on.png" und "WLAN_off.png" liegen. Wenn die PNGs fehlen, können sie hier heruntergeladen werden.
Anwendungsbeispiele
Sollte alles geklappt haben, seht ihr nun unter "Unsortiert" den im nebenstehenden Screenshot gezeigten Eintrag für das "Gerät" (hier mit dem Icon "it_router").
TR-064 Beispiele
- Box Reboot:
get <device> tr064Command DeviceConfig:1 deviceconfig Reboot
- Internet Reconnect:
get <device> tr064Command WANIPConnection:1 wanipconnection1 ForceTermination
- Daten eines Smart-Home-Gerätes auslesen:
get <device> tr064Command X_AVM-DE_Homeauto:1 x_homeauto GetGenericDeviceInfos NewIndex 0
Klingel- und Sprachausgabe per TR-064
Das geht derzeit nicht, da entsprechende Kommandos per TR-064 nicht verfügbar sind. Da Telnet sukzessive abgestellt wird, sollten sich Interessenten per Feature-Request an AVM wenden, wie hier beschrieben.
Eine Alternative um Telefone klingeln zu lassen, ist die Nutzung des SIP-Clients.
Anwesenheitserkennung per regelmäßiger Abfrage über das PRESENCE Modul
Fritzboxen und die FRITZ!WLAN Repeater speichern den Status angemeldeter Geräte. Dieser Status lässt sich mittels des FRITZBOX Moduls über Readings abfragen, die das Format mac_AA_AA_AA_AA_AA_AA haben und die MAC-Adressen der jeweils angemeldeten Geräte (AA:AA:AA:AA:AA:AA) enthalten. Das Reading existiert, wenn das Gerät angemeldet ist. Wenn das Gerät abgemeldet ist, existiert es nicht mehr. Es gibt auch noch den Zwischenstatus "inactive", der anscheinend gesetzt wird, bevor das Reading gelöscht wird.
Mit Hilfe des PRESENCE Moduls (vgl. Anwesenheitserkennung) kann man auf diese Weise den Anwesenheitsstatus abfragen. Anregungen dazu gibt es im zugehörigen Forenthread zur Anwesenheitserkennung und in diesem Blogpost. Auf dieser Basis könnte eine einfache Implementierung zum Beispiel so aussehen:
Funktion in 99_myUtils: (Bitte beim Speichern darauf achten, dass nicht der Name 99_Utils gewählt wird.)
sub checkFritzMACpresent($$) {
# Benötigt: Name der zu testenden Fritzbox ($d),
# zu suchende MAC ($m),
# Rückgabe: 1 = Gerät gefunden
# 0 = Gerät nicht gefunden
my ($d,$m) = @_;
$m =~ s/:/_/g;
$m = "mac_".uc($m);
return (ReadingsVal($d,$m,"inactive") ne "inactive") ? 1 : 0;
}
Nutzung dieser Funktion mit dem PRESENCE Modul definieren:
define <Name> PRESENCE function {checkFritzMACpresent("Fritzbox","AA:BB:CC:DD:EE:FF")} 60 60
wobei
- <Name> ein beliebig zu wählender Name für die PRESENCE-Funktion ist,
- Fritzbox der Name ist, mit dem ihr die abzufragende Fritzbox als FRITZBOX definiert habt,
- AA:BB:CC:DD:EE:FF die MAC-Adresse des gesuchten Geräts ist.
- "60 60" sagt, dass der Anwesenheitsstatus im 60-Sekunden-Takt abgefragt wird. Das macht natürlich nur Sinn, wenn ihr mit
attr Fritzbox INTERVAL 60
den Abfrageinterval bei der Fritzbox auch entsprechend hochgesetzt habt. Der Standard ist 300. - "Log 1" führt immer zum Loggen. Das ist zum Einrichten praktisch, ohne dass man gleich für das ganze Modul oder ganz FHEM
attr <device> verbose 5
setzen muss. Wenn es läuft, können die "Log 1"-Zeilen gelöscht, auskommentiert (# an den Zeilenanfang) oder in "Log 5" geändert werden.
Anwesenheitserkennung über mehrere Fritzboxen oder AVM Repeater und Fritzbox
Existiert ein AVM Repeater im Netzwerk, kann der als eigenständiges Gerät mit FRITZBOX definiert werden. WLAN Geräte an der Fritzbox werden in der Instanz der Fritzbox gelistet und WLAN Geräte am Repeater in der Repeater Instanz. Um trotzdem die Anwesenheit im Netzwerk einfach zu erkennen, muss die Subroutine in 99_myUtils.pm abgewandelt werden. (Siehe auch Forum Beitrag)
Existiert eine zweite Fritzbox im Accesspointmodus, werden die WLAN Geräte im Netzwerk alle in der Hauptfritzbox an einem LAN Anschluss gelistet. D.h. man sieht an der Hauptfritzbox nicht, dass sie im WLAN sind. Eine zweite Instanz mit dem FRITZBOX Modul muss wegen der Anwesenheitserkennung nicht gemacht werden. Die folgende Routine kann aber universell eingesetzt werden, unabhängig von der Anzahl der FRITZBOX Instanzen. Wer mitloggen will, kann das analog zur obigen Routine einbauen
sub checkAllFritzMACpresent($) {
# Benötigt: nur die zu suchende MAC ($MAC),
# Es werden alle Instanzen vom Type FRITZBOX abgefragt
#
# Rückgabe: 1 = Gerät gefunden
# 0 = Gerät nicht gefunden
my ($MAC) = @_;
# Wird in keiner Instanz die MAC Adresse gefunden bleibt der Status 0
my $Status = 0;
$MAC =~ tr/:/_/;
$MAC = "mac_".uc($MAC);
my @FBS = devspec2array("TYPE=FRITZBOX");
foreach( @FBS ) {
my $StatusFritz = ReadingsVal($_, $MAC, "weg");
if ($StatusFritz eq "weg") {
# Dieser Zweig testet ob das Reading vorhanden ist
} elsif ($StatusFritz eq "inactive") {
# Dieser Zweig testet ob im Reading inactive steht
} elsif ($StatusFritz =~ /(.*)s, 0/) {
# Dieser Zweig testet auf "<geraetename> (WLAN, 0 / 0 Mbit/s, 0)"
} else { $Status = 1}
}
return $Status
}
Da hiermit nach allen Instanzen mit dem TYPE=FRITZBOX durchsucht wird, braucht der Name der Fritzbox nicht angegeben werden.
define <Name> PRESENCE function {checkAllFritzMACpresent("AA:BB:CC:DD:EE:FF")} 60 60
Weitere Hinweise zu komplexeren Abfragen mehrere Boxen auf einmal etc. findet ihr auch im diesem Forenthread.
Anwesenheitserkennung per Notify
Der von Fritzboxen und Fritz!WLAN Repeatern gespeicherte Status zum Status angemeldeter Geräte lässt sich (statt per PRESENCE, s.o.) auch per notify anfragen:
define n_PRESENCE_mac_AA_BB_CC_DD_EE_FF notify Fritzbox:mac_AA_BB_CC_DD_EE_FF:.* {
my $s = "absent";
$s = "present" if (ReadingsVal($NAME,"mac_AA_BB_CC_DD_EE_FF","inactive") ne "inactive");
fhem("set anwesend_smartphone $s");
}
Hinweise:
fhem("set anwesend_smartphone $s");
ist nur ein Beispiel, das einen Dummy auf den Status "absent" bzw. "present" setzt. Man kann hier natürlich auch gleich entsprechende Aktionen durchführen. Wer das Beispiel übernehmen möchte, sollte den Dummy vorher definieren (define anwesend_smartphone dummy
).- mac_AA_BB_CC_DD_EE_FF ist die MAC-Adresse des gesuchten Geräts.
- "Fritzbox" ist der Name, unter dem die Fritzbox als FRITZBOX-Modul definiert wurde.
- Das Notify funktioniert, weil Geräte, wenn sie sich abgemeldet haben, erst den Status "inactive" erhalten. Ist das Gerät ganz abgemeldet, verschwindet das mac_.*-Reading. Dabei löst das Notify nicht mehr aus. Da das mac-.*-Reading aber vorher auf "inactive" stand, wurde die Abwesend-Aktion schon ausgeführt.
- Damit der Notify nicht andauernd losgeht, sollte man mittels
attr Fritzbox event-on-change-reading mac_AA_BB_CC_DD_EE_FF
Events nur auslösen, wenn sich der Status des Gerätes ändert. Will man mehrere Geräte abfragen, sollte manattr Fritzbox event-on-change-reading mac_AA_BB_CC_DD_EE_FF,mac_GG_HH_II_JJ_KK_LL
setzen, damit bei der Änderung jedes Readings ein Event ausgelöst wird.
Ein alternativer Ansatz mit einem DOIF:
define di_PRESENCE_handy DOIF (\
[Fritzbox:mac_AA_BB_CC_DD_EE_FF,"inactive"] eq "inactive"\
)\
( msg Tschuess )\
DOELSE\
( msg Hallo )
attr di_PRESENCE_handy cmdState absent|present
Für das DOIF gelten im Wesentlichen dieselben Hinweise wie für das notify oben und auch die im nächsten Abschnitt beschriebenen Vor- und Nachteile. Man bekommt allerdings dank dem attr cmdState
auch gleichzeitig noch ein Device mit dem passenden Status "frei Haus", kann sich also das oben beschriebene dummy-Device sparen und auch das event-on-change-reading
sollte nicht nötig sein.
Vergleich Anwesenheitserkennung PRESENCE/Notify
Die Anwesenheitserkennung per regelmäßiger PRESENCE-Abfrage hat den Vorteil, dass sie im Turnus der regelmäßigen Abfragen immer einen aktuellen Status produziert. Sie hat dafür den Nachteil, dass die PRESENCE-Funktionen regelmäßig abgearbeitet werden müssen, auch wenn sich gar nichts ändert. Außerdem aktualisiert sich der Status nicht sofort, sondern erst bei der nächsten regelmäßigen Abfrage. Durch häufiges Abfragen kann dieser Nachteil verringert werden (bei entsprechend höherer Systemlast).
Die Anwesenheitserkennung per Notify hat den Vorteil, dass ein sich ändernder Status sofort abgebildet wird. Ändert sich kein Status, werden keine Routinen ausgeführt, was die Systemlast gering hält. Der Nachteil ist, dass - z.B. nach einem Systemstart - die entsprechende Aktion erst bei einer Änderung des Status ausgeführt wird. D.h. ist das zu testende Gerät anwesend, wird dann FHEM beendet, das Gerät entfernt und FHEM wieder gestartet, ist der Status in FHEM immer noch "anwesend". Da das Reading für das Gerät nicht existiert, wird darauf auch erst wieder ein Notify ausgeführt, wenn sich der Status des Geräts wieder ändert, d.h. es wieder ankommt. Bis dahin ist der Status im System falsch.
Der Nachteil des Notify kann verringert werden, wenn man statt attr Fritzbox event-on-change-reading mac_AA_BB_CC_DD_EE_FF
ein attr Fritzbox event-on-update-reading mac_AA_BB_CC_DD_EE_FF
setzt. Das erhöht allerdings die Systemlast und funktioniert auch nur für den Status "anwesend". Bei "abwesend" ist kein Reading vorhanden, so dass auch event-on-update-reading nicht ausgeführt wird.
Eine weitere Möglichkeit, den Nachteil der Notify-Methode auszugleichen, ist, die Statusabfrage beim Systemstart einmal manuell auszuführen, durch ein notify auf "GLOBAL:initialized":
global:INITIALIZED {
my $s = "absent";
$s = "present" if (ReadingsVal("Fritzbox","mac_AA_BB_CC_DD_EE_FF","inactive") ne "inactive");
fhem("set anwesend_smartphone $s");
}
Das hilft allerdings nur beim Systemstart. Nicht, wenn FHEM aufgrund irgendwelcher Hänger eine Aktualisierung des Status verpasst hat.
userReadings per get tr064Command oder get luaQuery
Um dem Gerätewert <userReadingName> den Wert von <VariabelName> aus der Rückgabe des get-Befehls tr064Command oder luaQuery zuzuordnen
attr <device> userReadings <userReadingName> {my $resp=fhem("get <device> tr064Command <service> <control> <action> [[<argName1> <argValue1>] ...]",1);;$resp =~/\'<VariabelName>\' => '(.*)'/;;return $1;;}
Beispielsweise
attr Fritzbox userReadings urMobilteil_1 {my $resp=fhem("get Fritzbox tr064Command X_AVM-DE_OnTel:1 x_contact GetDECTHandsetInfo NewDectID 1",1);;$resp =~/'NewHandsetName' => '(.*)'/;;return $1;;}, urDownstreamDSLRate {my $resp=fhem("get Fritzbox tr064Command WANDSLInterfaceConfig:1 wandslifconfig1 GetInfo",1);;$resp =~/'NewDownstreamCurrRate' => '(.*)'/;;return $1;;}, urUpstreamDSLRate {my $resp=fhem("get Fritzbox tr064Command WANDSLInterfaceConfig:1 wandslifconfig1 GetInfo",1);;$resp =~/'NewUpstreamCurrRate' => '(.*)'/;;return $1;;}
oder bei einzelnen Werte über get luaQuery
attr Fritzbox userReadings sip1_connect {my $resp=fhem("get Fritzbox luaQuery sip:settings/sip1/connect",1);;$resp =~/([0-9])$/;;return $1;;}
Klingelton-Einstellung und Abspielen von Sprachnachrichten bei Fritz!OS-Versionen >6.24
Wenn die Fritzbox weder die Telnet- noch die webcmd-Schnittstelle hat, kann der Klingelton der Fritz!Fons nicht mehr verstellt und auch keine Sprachnachricht über ein Fritz!Fon ausgegeben werden.
Es gibt eine Behelfslösung über das Attribut useGuiHack. Dadurch wird eine Eingabe in die WebGUI der Fritzbox simuliert.
ACHTUNG: Vor allem nach einem Update der FritzBox kann es durch dieses Attribut zu ungewolltem Verstellen von Werten in der Fritzbox kommen.
Bei Verwendung der ring-Parameter "play:" und "say:" wird die abzuspielende URL in die M3U-Datei, die unter dem Internal M3U_LOCAL steht, eingetragen.
Standardmäßig wird versucht, diese Datei im image-Verzeichnis von FHEM abzulegen. Diese kann dann vom Fritz!Fon über FHEMWEB abgespielt werden (IP-Freigaben beachten). Direkt nach dem ersten Anlegen der m3u-Datei kennt FHEMWEB diese noch nicht, daher bitte entweder set <webdevice> rereadicons ausführen oder FHEM neu starten.
Aufgrund der Beschränkungen von FHEMWEB oder auch bei Authentifizierungsanforderungen ist es empfehlenswert, die Datei über das Attribute m3uFileLocal selber vorzugeben. Am besten auf einem Webserver, der auf dem FHEM-Server läuft und dessen Seiten-Verzeichnis durch FHEM beschreibbar ist. Beispiel:
attr Fritzbox m3uFileLocal /var/www/mp3/Fritzbox.m3u
In dem Radioeintrag FHEM muss dann auf der FritzBox, die Web-Adresse der entsprechenden Datei eingetragen werden. Dieser Sender sollte zu Testzwecken dann auch einmal am Fritz!Fon von Hand gestartet werden.
Das Modul versucht, beim Start die einzutragende Radio-URL im image-Verzeichnis selber zu ermitteln (IP-Freigabe beachten). Gelingt dies, so steht diese im Internal M3U_URL.
Ring auf mehreren Telefonen gleichzeitig
Damit mehrere Telefone per ring gleichzeitig klingeln, muss in der Fritzbox eine Rufgruppe definiert werden. Sollte eine Türsprechanlage schon in Benutzung sein, kann die eventuell hierfür bereits eingerichtete Gruppe verwendet werden.
Das Anlegen der Gruppe kann wie in folgender AVM Anleitung beschrieben erledigt werden. AVM Interne Rufgruppe anlegen
Es muss eine Kurzwahl bei der Gruppe zwingend hinterlegt sein. Danach kann mit folgendem Beispielcode gearbeitet werden:
set FritzBox ring 791 15 show:Türklingel
Name des Devices, Rufgruppen Nummer, Länge und gezeigter Text auf das Gewünschte anpassen.
Bekannte Probleme / Fehlersuche
Fehler nach Firmware Update
Typischer Fehler ist hier "Error: 403 Forbidden". Nach einem Firmwareupdate der Fritzbox am besten auch FHEM neu starten.
Modul bleibt im Status "Check APIs" hängen
Im Log steht die Meldung: "Error: Timeout when reading Fritz!Box data.".
Mögliche Ursache: Nutzung des FHEM-Befehls rereadcfg. Dieser verträgt sich nicht mit dem Modul "blocking.pm", das für parallel laufende FHEM-Prozesse genutzt wird.
Abhilfe schafft ein Neustart shutdown restart
oder das Einfügen eines zusätzlichen, lokalen Telnet-Ports z.B. durch define tPortLocal telnet 7073
Nachtschaltung Doppel-WLAN
Beim Abschalten des WLAN über das Modul wird (über TR064) zuerst das 2.4 GHz und dann das 5 GHz WLAN ausgeschaltet. Bei der gleichzeitigen Nutzung der WLAN-Nachtschaltung (Anschalten über das Fritz!OS) wird dann jedoch nur noch das 5 GHz WLAN wieder angeschaltet. Die Box interpretiert den TR064-Befehl anscheinend als ein komplettes Abwählen des 2.4 GHz WLAN.
Abhilfe schafft hier nur ein notify auf das 5 GHz WLAN mit einem nachträglichem Anschalten des 2.4 GHz WLAN.
Alternativ kann das Ausschalten des WLANs nicht direkt über TR064-Kommandos, sondern über einen indirekten Weg erfolgen: über TR064 ein set call abzusetzen und hier den Tastencode zum Ausschalten des WLANs einzugeben, bei einer FritzBox 7490 wäre dies z. B. #96*0*. Schaltet man über diese Methode das WLAN aus, kann es über die Nachtschaltung wieder automatisch auf beiden Frequenzen angeschaltet werden.
Kabelboxen
Bei Fritz!Boxen für den Kabelanschluss (z.B. Kabel Deutschland) scheint neben Telnet auch die TR064-API nicht zu funktionieren. Vermutlich wurde die API von AVM auf Betreiberwunsch deaktiviert, da man sonst Dinge ändern kann, die das gesamte Kabelnetz stören können.
Zumindest für Unitymedia und einer FRITZ!Box 6490 Cable (lgi) mit FRITZ!OS:06.50 funktioniert TR064.
Eine Rufumleitung bei Abwesenheit (Modul PRESENCE) funktioniert mit einer vorher eingerichten Telefonnummer wie folgt:
define Rufumleitung DOIF ([Anwesenheit.dum:state] eq "off") (set FritzBox6490 diversity 1 on) DOELSEIF ([Anwesenheit.dum:state] eq "on") (set FritzBox6490 diversity 1 off)
Wenn's nicht klingelt
Das Klingeln erfolgt über die Wählhilfe. Eventuell muss über die Weboberfläche der Fritz!Box ein anderer Port eingestellt werden. Der aktuelle steht in "box_stdDialPort".
TR064-Transport-Error: 500 Can't connect to ...:49443 (certificate verify failed)
Eventuell hilft es, die Perl Module Net::HTTPS, Net::SSL und IO::Socket::SSL zu aktualisieren.
"Error: Old SID not valid anymore." nach Erlauben von IPv6 auf der Fritzbox
Ohne hier den genauen Grund zu kennen - es hilft die Angabe der IPv4-Adresse: also statt define FritzBox FRITZBOX
dann define FritzBox FRITZBOX <IP>
(z.B. define FritzBox FRITZBOX 192.168.10.1
), so dass das Modul nicht über IPv6 geht.
"Didn't get a session ID"
Bei gleichzeitiger Nutzung anderer Module für die Fritzbox (z.B. FBAHAHTTP) muss der Zugang über Benutzername und Password erfolgen.
attr <DEVICE> boxUser <USER>
Da das FRITZBOX-Modul eine inoffizielle Schnittstelle benutzt, muss dann auch der normale Zugang zur Box auf "Benutzername und Password" eingestellt sein.
In der Firmware 6.92 wird der Zugang über die Menüs "System"->"Fritz!Box-Benutzer"->"Anmeldung im Heimnetz" eingestellt.
Oft wird aber auch ein falsches oder gar kein Passwort gesetzt.
set <DEVICE> password <PASSWORD>
TR064-Error 401:invalid action
Eventuell ist auf der Fritzbox ein Benutzer gesetzt und im Modul nicht korrekt angegeben bzw. mit falschen Rechten versehen (attribut boxUser).
Links
- Forenthread zu diesem Modul
- Neuer Support Thread im Forum, ab April 2017