AVM hat es angekündigt und nun umgesetzt: FRITZ!OS 06.24 ist das letzte Betriebssystem wo Telnet noch aktivierbar ist und die WEBCM CGI Schnittstelle vorhanden ist. Seit ein paar Tagen ist für die FB7490 das neue FRITZ!OS 06.30 offiziell verfügbar.
Beide Schnittstellen wurden aus Sicherheitsgründen entfernt. Als einzige
Schnittstelle wird jetzt
TR-064 unterstützt.
Damit ist es an der Zeit das
Konstrukt mit der FHEM Instanz auf der Fritzbox zu überdenken. Das System soll ja "supported" bleiben. Im Vordergrund steht für mich nach wie vor die Anwesenheitserkennung über Wlan.
Umstellung FHEM auf neues FB Interface
Das
FRITZBOX Modul wurde von seinem Entwickler in den letzten Wochen kräftig überarbeitet.
Installation des Fritzbox Moduls
Update FHEM neue Version (FRITZBOX.pm mindestens 8978 2015-07-15)
Eingeleitet wird jede Installation mit Aptitude täglich mit einer Aktualisierung
sudo apt-get update
Wenn man noch mit telnet experimentieren will (macht nur Sinn bis Version 06.24 oder mit Freetz) braucht man telnet
sudo apt-get install libnet-telnet-perl
Auf alle Fälle braucht man folgende perl Module, bei mir waren die alle schon installiert (Basis, Sonos und netatmo)
sudo apt-get install libjson-perl libwww-perl libsoap-lite-perl libjson-xs-perl
Jetzt kann das FRITZBOX Device angelegt werden
define FB7490 FRITZBOX
set FB7490 password xxxx
attr FB7490 allowTR064Command 1
Wenn die Fritzbox nicht über die Namensauflösung fritz.box im Netz erreichbar ist, muss das Attribute fritzBoxIP mit der IP Adresse bestückt werden.
Jetzt spricht FHEM mit der FB über telnet oder/und TR064 und das Device sollte mit Werten gefüllt werden. Es dauert eventuell zwei drei Abfragerunden eh alles komplett ist. In den Internals kann man ablesen ob die FB überprüft ist (APICHECKED) und welche Schnittstellen zur Verfügung stehen (LUAQUERY, TELNET, TR064, WBCM)
Über das Attribute INTERVALL kann man das Abfrageintervall auf 60 sec stellen.
Jetzt spricht FHEM mit der FB über telnet oder/und TR064.
Anwesenheit von WLAN Geräten ermitteln.
Aktive Wlan Geräte werden in den Readings gelistet:
mac_xx_xx_xx_xx_xx_xx Name
Werden Geräte im Wlan abgemeldet, erscheinen sie kurzzeitig mit dem Namen "inactive" und werden später nicht mehr gelistet.
Eine Abfrage liefert den Namen des Gerätes zurück oder nichts, eventuell auch "inactive". Das kann man direkt in der Befehlszeile von FHEM testen:
{ReadingsVal("FB7490","mac_11_22_33_44_55_66","")}
Daraus habe ich nun folgende Abfrage gebaut
Zunächst wird eine Routine in 99_myUtils eingefügt. Ist die 99_myUtils.pm noch nicht vorhanden kann man das Template von FHEM verwenden. War die Datei schon vorhanden, darf man nach dem editieren ein reload 99_myUtils nicht vergessen. Wie es genau geht steht im
Wiki
Das ist meine erste wirklich selbstgeschrieben Perl Routine:
######## Netzwerk Gerät über Fritzbox abfragen ############
sub
NetDevDa($$$)
{
my ($FB, $Reading, $Device) = @_;
my $Name = ReadingsVal($FB,$Reading,"");
if( $Name eq $Device) {
return 1;
}
else {
return 0;
}
}
Definition mit dem PRESENCE Modul
Die interne Fritzbox Funktion aus dem Modul können wir derzeit so nicht mehr verwenden. Sie funktioniert nur wenn FHEM lokal auf der Fritzbox läuft.
Die Abfrage im PRESENCE Modul kann auch mit eigenen Funktionen erfolgen. Die Funktion habe ich in der 99_myUtils vorbereitet.
define Wlan_Device PRESENCE function {NetDevDa("FB7490","mac_xx_xx_xx_xx_xx_xx","<Name aus dem Reading>")} 10 30
Das PRESENCE Modul würde nach dieser Definition alle 30 Sekunden zwei Events feuern, man kann sich das gut im "Event monitor" anschauen. Einen Event mit <state> und einen Event mit "presence: <state>". Egal ob sich am Status was geändert hat oder nicht. Das wollen wir nicht, deshalb setzt man noch das Attribute event-on-change-reading auf den Wert state. Damit wird nur ein Event mit dem Inhalt <state> gesendet in dem Moment wo sich der Status ändert. Das ist für die angeschlossene Auswertelogik von Bedeutung.
attr Wlan_Device event-on-change-reading state
Jetzt könnte man noch die Anwesenheit protokollieren:
define FileLog_MobileGeraete FileLog ./log/MobileGeraete-%Y.log Wlan_Device:.*|Wlan_Device2:.*
Diese Abfrage der Fritzbox funktioniert im Gegensatz zur simplen LAN-PING Methode des PRESENCE Modules auch für Geräte, die die Wlan Schnittstelle bei Inaktivität abschalten (z.B. iPhone).
Etwas mehr Komfort
Die obige Abfrage erfüllt ihren Zweck auf die Schnelle, ist aber etwas unkomfortabel. Eigentlich werden MAC Adressen in der Form 11:22:33:44:55:66 verwendet und eigentlich will man ja nur wissen ob eine bestimmte MAC Adresse im Netzwerk vorhanden ist. Ob eine oder mehrere Fritzboxen oder Fritz Repeater im Netz vorhanden sind, sowie der konkrete Name des Gerätes sollte dabei egal sein.
In Anlehnung an
diesen Beitrag im Forum habe ich den Code noch etwas ergänzt. Im
Wiki gibt es jede Menge Varianten und Informationen dazu.
######## Netzwerk Gerät über Fritzbox abfragen ############
sub
NetDevDa($)
{
my $n = 0;
my ($Reading) = @_;
$Reading =~ tr/:/_/;
my @fbs = devspec2array("TYPE=FRITZBOX");
foreach( @fbs ) {
my $Name = ReadingsVal($_,"mac_" . $Reading,"");
if( ($Name ne "") && ($Name ne "inactive") ) {
$n++;
}
}
if( $n == 0) {
return 0;
} else {
return 1;
}
}
Damit wird die Definition im PRESENCE Modul einfacher und wesentlich flexibler:
define Wlan_Device PRESENCE function {NetDevDa("xx:xx:xx:xx:xx:xx")} 10 30
Fritzbox auf neues System aktualisieren
Damit ich relativ sicher bin, das die Anwesenheitserkennung reibungslos funktioniert hatte ich Telnet auf der FB deaktiviert und die FHEM Instanz beendet. Nach ein paar Wochen Test ist es an der Zeit die Umstellung durch Update der Fritzbox zu beenden.
Ich habe eine Sicherung der Fritzbox Einstellungen gemacht, die Wiederherstellungsprogramme von AVM für die Version 6.24 und 6.30 heruntergeladen und dann einfach Update gedrückt.
Funktioniert!
Man bekommt über die FRITZ!NAS Funktion immer noch den alten fhem Pfad, der wird nicht gelöscht. Wer also vergessen hat, dass nach dem Update FHEM nicht mehr läuft und auf ein anderes System umziehen will, kann jetzt immer noch alles retten.
Was bleibt ist die Ausschrift auf der Startseite "Vom Hersteller nicht unterstützte Änderungen". Wer also sein System noch ganz sauber machen will, kann jetzt das Recovery Programm starten und anschließend die Sicherung der Einstellung zurückspielen. Dazu unbedingt die
Hinweise von AVM beachten.
Dabei wird der Speicher der Fritzbox komplett gelöscht. Also vorher alle Daten über FRITZ!NAS sichern!