FRITZBOX: Unterschied zwischen den Versionen

Aus FHEMWiki
K (Hinweis auf Einschränkungen durch Wegfall von Funktionen in neueren AVM Firmware)
 
(112 dazwischenliegende Versionen von 24 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Infobox Modul
{{Infobox Modul
|ModPurpose=Steuerung einer Fritz!Box über Fhem
|ModPurpose=Steuerung einer Fritz!Box über FHEM
|ModType=d
|ModType=d
|ModForumArea=Sonstiges
|ModForumArea=FRITZ!Box
|ModTechName=72_FRITZBOX.pm
|ModTechName=72_FRITZBOX.pm
|ModOwner=tupol/Topos ([http://forum.fhem.de/index.php?action=profile;u=5432 Forum] / [[Benutzer Diskussion:Topos|Wiki]])}}
|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.


Das Modul [[FRITZBOX]] ermöglicht die Steuerung einer [[AVM Fritz!Box]] durch Fhem. Dabei kann es sich dabei sowohl um eine FritzBox handeln, auf der Fhem selbst läuft (lokaler Modus), als auch um eine entfernte (externe) FritzBox.
{{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=Info|RNText=Bitte Einschränkungen des Moduls ab FRITZ!OS 6.25 und höher durch den Wegfall des Telnet-Zugang und der webcm-Schnittstelle beachten (siehe {{Link2Forum|Topic=38586}})!}}
{{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 ==
Um das Modul für den Zugriff auf eine externe FritzBox benutzen zu können, muss
=== Remote-Zugang ===
# Telnet auf der entsprechenden FritzBox erlaubt/freigeschaltet sein (üblicherweise durch Eingabe von #96*7* an einem direkt an der entsprechenden FritzBox angeschlosssenen Telefon)
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.&nbsp;B. mit dem Befehl
# Auf dem System, auf dem Fhem läuft ([[Systemübersicht#Server|Server]]) muss Telnet installiert sein; auf einem [[Raspberry Pi]] z.&nbsp;B. mit dem Befehl
:<code>sudo apt-get install libjson-perl libwww-perl libsoap-lite-perl libjson-xs-perl</code>
:::<code>sudo apt-get install libnet-telnet-perl</code>
Für einen (begrenzten) Remote-Zugang ohne Telnet müssen die Module JSON:XS, LWP und SOAP::Lite installiert sein; auf einem [[Raspberry Pi]] z.&nbsp;B. mit dem Befehl
:::<code>sudo apt-get install libjson-perl libwww-perl libsoap-lite-perl libjson-xs-perl</code>


== Installation ==
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.


=== Erste Schritte ===
=== Telnet (wird vom Modul nicht mehr unterstütz) ===
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).
<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>


==== Modul FRITZBOX für Zugriff auf einem externen Server einrichten ====
# <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>
[[Datei:Screenshot_FritzBox_TelnetUser.png|mini|300px|rechts|Anlegen des Attributs telnetUser]]
# <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.&nbsp;B. mit dem Befehl</s>
Bei Fernzugriff sind weitere Schritte nötig:
::<code><s>sudo apt-get install libnet-telnet-perl</s></code>
# Telnet auf der Fritzbox freischalten (Tastenkombination #96*7* am angeschlossenen Telefon (auch FritzFon)
# TelnetUser definieren (wie im Screenshot gezeigt)
# Passwort zum Benutzer auf der Fritzbox definieren


[[Datei:Screenshot_FritzBox_Passwort.png|mini|300px|rechts|Passwort definieren]]
== Installation ==
=== Erste Schritte ===
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).


(bitte die Buttons {{Taste|set}} und {{Taste|attr}} bei der Definition der jeweiligen Einträge nicht vergessen)
==== 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):


==== ...für die Profis ====
Fritzbox definieren:
(die Telnet auf ihrer FritzBox vermutlich ohnehin längst aktiviert haben)
:<code>define FritzBox FRITZBOX < IP oder Hostname ></code>


hier die Befehle für das [[Konfiguration|Befehl-Eingabefeld]]:
192.168.168.168 dabei natürlich durch die passende IP ersetzen... Alternativ kann statt der IP auch der Hostname eingegeben werden.


:<code>define FritzBox FRITZBOX</code>
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 telnetUser ''Benutzername'' </code> - legt den Benutzer fest
:<code>attr FritzBox boxUser ''Benutzername'' </code>
:<code>set Fritzbox password ''Passwort'' </code> - legt das zugehörige Passwort fest
In der Fritzbox muss dann auch "Anmeldung mit FRITZ!Box-Benutzernamen und Kennwort" ausgewählt sein.


=== mögliche Fehlermeldungen ===
Passwort konfigurieren:
Sollte schon bei <code>define FritzBox FRITZBOX</code> die Fehlermeldung kommen, dass dieses Modul nicht existiert, dann bitte prüfen, ob Fhem auf dem aktuellen Stand ist und ggf. [[Update|aktualisieren]].
:<code>set FritzBox password ''Passwort''</code> - legt das zugehörige Passwort fest (nur einmal --> gehört nicht in die cfg-Datei
 
Kommt jetzt bei der erneuten Definition die Fehlermeldung <code>Error: Perl modul Net::Telnet is missing on this system</code> bitte wie oben schon erwähnt den Befehl
:<code>sudo apt-get install libnet-telnet-perl</code>  
direkt per Telnet/SSH auf dem FHEM-Server ausführen und neu starten.
Sollte alles geklappt haben, seht ihr nun eure Fritzbox und könnt diverse Einstellungen manuell vornehmen und/oder automatisch vornehmen lassen.


== Anwendung ==
== Anwendung ==
=== Define ===
=== Define ===
Siehe [http://fhem.de/commandref_DE.html#FRITZBOX commandref]
Siehe {{Link2CmdRef|Lang=de|Anker=FRITZBOXdefine}}


=== Attribute ===
=== Attribute ===
Siehe commandref
Siehe {{Link2CmdRef|Lang=de|Anker=FRITZBOXattr}}
 
====Status-Symbol====
<code>attr <device> devStateIcon .*on.*off:WLAN_on_gWLAN_off .*on.*on.*:WLAN_on_gWLAN_on WLAN..off.*:WLAN_off</code>


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.
=== 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.


== Anwendungsbeispiele ==
Mit dem Befehl
[[Datei:Screenshot_FritzBox1.png|mini|300px|rechts|FRITZBOX Gerät auf der Fhem Oberfläche]]
:<code>get <device> tr064Command <service> <control> <action> [[parameterName1 parameterValue1] ...]</code>
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").
freischalten und damit auf diese Schnittstelle zugreifen.


== TR-064 ==
AVM hat die Schnittstellenbeschreibung unter [http://avm.de/service/schnittstellen/] veröffentlicht. Diese wird jedoch nur sehr sporadisch gepflegt.
Die offizielle Programmier-Schnittstelle der Fritz!Box läuft über das Protokoll TR-064.


mit dem Attribute<br/>
Ein besserer Einstiegspunkt befindet sich auf der Box unter http://fritz.box:49000/tr64desc.xml.
<code>attr <device> allowTR064Command 1</code><br/>
Die möglichen TR-064-Aktionen kann man auch über den Befehl  
kann man den Befehl<br/>
:<code>get <device> tr064ServiceList</code>  
<code>get <device> tr064Command <service> <control> <action> [[parameterName1 parameterValue1] ...]</code><br/>
auslesen.
freischalten und damit auf diese Schnittstelle zugreifen.


AVM hat die Schnittstellenbeschreibung unter [http://avm.de/service/schnittstellen/] veröffentlicht. Ein weitere Einstiegspunkt befindet sich auch auf der Box unter http://fritz.box:49000/tr64desc.xml
Folgende Services und Controls existieren (für den get-Befehl ''tr064Command'' werden nur die fett formatierten Wörter benötigt)
 
Folgende Service und Controls existieren (für den get-Befehl werden nur die fett formatierten Wörter benötigt)


{| class="wikitable"
{| class="wikitable"
Zeile 143: Zeile 133:
|}
|}


== TR-064 Bespiele ==
=== Status-Symbol ===
<code>attr <device> devStateIcon .*on.*off:WLAN_on_gWLAN_off .*on.*on.*:WLAN_on_gWLAN_on WLAN..off.*:WLAN_off</code>


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 {{Link2Forum|Topic=29725|Message=318113|LinkText=hier}} heruntergeladen werden.
== Anwendungsbeispiele ==
[[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").
=== TR-064 Beispiele ===
*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>
*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 ===
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 ===
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 {{Link2Forum|Topic=39433|LinkText=Forenthread}} zur Anwesenheitserkennung und in [http://heinz-otto.blogspot.de/2015/07/die-zeiten-andern-sich.html diesem  Blogpost]. Auf dieser Basis könnte eine einfache Implementierung zum Beispiel so aussehen:
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 ($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;
}</syntaxhighlight>
Nutzung dieser Funktion mit dem PRESENCE Modul definieren:
:<code>define <Name> PRESENCE function {checkFritzMACpresent("Fritzbox","AA:BB:CC:DD:EE:FF")}  60 60</code>
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 <code>attr Fritzbox INTERVAL 60</code> 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 <code>attr <device> verbose 5</code> 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 [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
<syntaxhighlight lang="perl">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
}</syntaxhighlight>
Da hiermit nach allen Instanzen mit dem TYPE=FRITZBOX durchsucht wird, braucht der Name der Fritzbox nicht angegeben werden.
:<code>define <Name> PRESENCE function {checkAllFritzMACpresent("AA:BB:CC:DD:EE:FF")}  60 60</code>
Weitere Hinweise zu komplexeren Abfragen mehrere Boxen auf einmal etc. findet ihr auch im diesem {{Link2Forum|Topic=39433|LinkText=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:
<syntaxhighlight lang="perl">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");
}</syntaxhighlight>
Hinweise:
* <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.
* "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 <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 ===
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 <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":
<syntaxhighlight lang="perl">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");
}</syntaxhighlight>
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
<pre>
attr <device> userReadings <userReadingName> {my $resp=fhem("get <device> tr064Command <service> <control> <action> [[<argName1> <argValue1>] ...]",1);;$resp =~/\'<VariabelName>\' => '(.*)'/;;return $1;;}
</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
<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;;},
        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 ===
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:
:<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''.
=== 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. [https://avm.de/service/fritzbox/fritzbox-7390/wissensdatenbank/publication/show/1148_Interne-Rufgruppe-in-FRITZ-Box-einrichten-Gruppenruf/ AVM Interne Rufgruppe anlegen]
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 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 <code>shutdown restart</code> oder das Einfügen eines zusätzlichen, lokalen Telnet-Ports z.B. durch <code>define tPortLocal telnet 7073</code>
=== 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:
<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 ===
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 <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]]
<!-- (Modulkategorie wird automatisch gesetzt) -->
[[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.

X mark.svgAb FRITZ!OS 6.25 wird das zwingend benötigte Telnet nicht mehr unterstützt, es müssen also die TR-064 Funktionen genutzt werden.
Emblem-question-yellow.svgFork seit Januar 2021

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:

  1. 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
  2. Auf 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

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").

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 man attr 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;;}
X mark.svgVORSICHT: 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

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