Posts mit dem Label Fritzbox werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Fritzbox werden angezeigt. Alle Posts anzeigen

Donnerstag, 23. August 2018

FritzBox mit TR064 abfragen

TR064 oder TR-064 ist ein Schnittstellen Protokoll für DSL Router. Hier findet man nähere Information und ein paar Dokumente.
Das Modul FRITZBOX von FHEM kennt zwei Kommandos für TR064
get FritzBoxName tr064ServiceList
gibt einen strukturierte List mit Funktionen und Kommandos.
get FritzBoxName tr064Command Kommando
lässt TR064 Kommandos an die Fritzbox senden und man bekommt etwas zurück. Aber wie kommt man zu dem Syntax für "Kommando"?
Hier habe ich im Forum mal einen Beispielbefehl gefunden, von dem habe ich mich versucht weiter zu hangeln.
get FB7490 tr064Command WANPPPConnection:1 wanpppconn1 GetInfo
Gibt eine Liste zurück aus der man Werte zu DSL Verbindung auslesen könnte.
  • Aber was gibt es denn noch so? 
  • Wie kommt man von der Service Liste zum Befehl?
Beispiel aus der Service Liste
 Spec: http://192.168.90.1:49000/wancommonifconfigSCPD.xml    Version: 1.0
 Service: WANCommonInterfaceConfig:1     Control: wancommonifconfig1
----------------------------------------------------------------------------------------------------------------------------------
  GetCommonLinkProperties ( ) = ( NewWANAccessType NewLayer1UpstreamMaxBitRate NewLayer1DownstreamMaxBitRate NewPhysicalLinkStatus )
  GetTotalBytesSent ( ) = ( NewTotalBytesSent )
  GetTotalBytesReceived ( ) = ( NewTotalBytesReceived )
  GetTotalPacketsSent ( ) = ( NewTotalPacketsSent )
  GetTotalPacketsReceived ( ) = ( NewTotalPacketsReceived )
  X_AVM-DE_SetWANAccessType ( NewAccessType )
  X_AVM-DE_GetOnlineMonitor ( NewSyncGroupIndex ) = ( NewTotalNumberSyncGroups NewSyncGroupName NewSyncGroupMode Newmax_ds
                                    Newmax_us Newds_current_bps Newmc_current_bps Newus_current_bps Newprio_realtime_bps
                                    Newprio_high_bps Newprio_default_bps Newprio_low_bps )
Für ein funktionierendes tr064Command braucht man:
  1. Aus der Überschrift: 
    • den Wert hinter Service: WANCommonInterfaceConfig:1
    • den Wert hinter Control: wancommonifconfig1
  2. Die Werte für Action stehen in der Tabelle darunter links: X_AVM-DE_GetOnlineMonitor
  3. dahinter steht in der Klammer das Argument: NewSyncGroupIndex
  4. auf der rechten Seite (hinter dem Gleichheitszeichen) stehen die zu erwartenden Werte.

Das Kommando wird im Prinzip so zusammen gesetzt:
get FritzboxName tr064Command Service Control Action Argument Value
Beispiel 1: ohne Argument (weil die Klammer leer ist)
get FB7490 tr064Command WANCommonInterfaceConfig:1 wancommonifconfig1 GetCommonLinkProperties
Beispiel 2: Argument und Value
get FB7490 tr064Command WANCommonInterfaceConfig:1 wancommonifconfig1 X_AVM-DE_GetOnlineMonitor NewSyncGroupIndex 0

Während man ja bis zum Argument noch über die Service Liste kommt, wird es dann beim Value irgendwie schwierig. Zumindest gab es in dem Dokument  dann Anhaltspunkte, das habe ich gefunden über Google mit dem Begriff aus der Überschrift des Service Abschnittes "wancommonifconfigSCPD"

Ansonsten hilft probieren, suchen und raten.

Noch ein Beispiel für den Fritzbox Neustart.
Und es gibt auch was für Powershell.

Freitag, 11. März 2016

Fritzbox zum Quadrat

Eine 7490 war schon vorhanden und jetzt kam vom Provider noch eine 7412 als Endpunkt des neuen DSL Anschlusses. Da der Router zum Teil auch über TR-069 Protokoll vom Provider konfiguriert wird, wollte ich es auch so: die 7412 schließt die DSL Leitung ab und die 7490 macht weiterhin den Hauptjob. Da gibt es bei AVM eine gute Anleitung wie man zwei Fritzboxen koppelt. Nun kommen die beiden Boxen ja nicht aus der Verpackung, sondern meine 7490 war schon in Betrieb. Also "Migration" ist angesagt. Und hier gibt es jetzt meine Erfahrungen:

Ich konfiguriere gerne per DHCP und ich mache auch gerne feste IP Adressen über DHCP und ich tippe nicht gern ab. Also: Sicherung der Konfiguration der existierenden Box und Wiederherstellung auf der neuen Box. Dabei kann man auswählen, nur bestimmte Einstellungen wiederherzustellen - Netzwerkonfiguration.  Dabei gibt es die erste Eigenheit: Das geht irgendwie nur einmal, nach dem Auspacken (oder Werksreset) und Basiskonfiguration mit dem Modeminstallationscode. Beim zweiten Versuch fehlt genau dieser Punkt zur Auswahl?!

  • Beide Boxen haben WLAN aktiv. Die 7490 steckt am LAN und wird vom DSL getrennt.
  • Die 7412 wird am DSL angeschlossen und steckt nicht am LAN.
  • Verbindung zur 7490 und Konfiguration sichern.
  • Verbinden zur 7412 und Konfiguration wiederherstellen.
  • 7490 vom LAN trennen und 7412 mit dem LAN verbinden.
  • 7490 als IP Client konfigurieren nach einer Wartezeit wieder an LAN anschließen


Und alles läuft weiter? Naja nicht ganz...
Die Rasperry's sind von Android aus nicht mehr per Namen erreichbar, obwohl es in der Fritzbox Oberfläche alles gut aussieht. Ein Blick mit nslookup bringt es an den Tag: die Fritzbox verweigert die Auskunft obwohl sie scheinbar den Namen kennt. Abhilfe bringt eine Neuregistrierung am DHCP Server mit dhclient (oder ein Neustart). Die Windows PCs machen das scheinbar ohne extra Aufforderung. Mein HMLAN Adapter ist auch nicht per Namen erreichbar, mal sehen ob das irgendwann von alleine wird. Ich vermute, wenn der DHCP Client auf Grund der Lease Dauer seine Lease erneuern will wird es wohl klappen.

Die Windows Rechner sind zwar per DNS Namen erreichbar, die haben auch den Vorteil, dass sie Broadcast machen und die Linux Rechner auch damit auflösen können. Aber die Windows Clients ermitteln ob sie an einem bekannten Netzwerk angeschlossen sind (MAC Adresse des Default Gateway?) und packen erstmal das neue Netzwerk in die Kategorie "öffentlich" und damit unsicher! Wenn man, wie ich, etwas auf Sicherheit achtet und nicht alles immer gleich öffnet - gehen jetzt ein paar Sachen erstmal nicht mehr. Wenn man sich am Windows PC anmeldet ist das Problem mit einem Klick behoben, Windows fragt nach der Art des Netzwerkes, man klickt auf Privat und alles ist gut. Aber der Server an dem man sich maximal mal per RDP anmeldet?
Man sollte vorher RDP auf öffentliche Netzwerke freigeben, oder Monitor und Tastatur bereithalten!

Interessant wird noch die Auswertung in FHEM, beide Fritzboxen zeigen die Netzwerkgeräte an, nicht alle auf jeder Box aber auch nicht alle bloß auf einer Box.

Montag, 11. Januar 2016

Anwesenheitserkennung

Da gibt es viele Artikel die sich mit der Lösung beschäftigen - aber was ist eigentlich das Problem?

Ich will nicht einfach ein Code Beispiel liefern, ich will vor allem beschreiben, warum es so komplex scheint. Der hier beschriebene Code funktioniert fast vollständig als Trockenübung. In der realen Umgebung müssen einige Definitionen angepasst werden.

Erkennung von Geräten

Heute hat praktisch jeder ein Smartphone. Das WLAN und Bluetooth Modul bieten eine gute Möglichkeit der Erkennung. Wlan durch Anmeldung beim Router, Bluetooth durch einen "Ping" auf die MAC Adresse. Die MAC Adresse ist eine eindeutige Hardware Adresse des Gerätemoduls. Sicher bzw. Fälschungssicher ist diese nicht! Für die Erkennung muss die WLAN und Bluetooth MAC bekannt sein!

Die Anwesenheit der Geräte (Komponenten) wird durch ein PRESENCE Device oder dummy Devices erzeugt. Die Anzahl der Komponenten, die eine Person als vorhanden ermitteln können, kann fast beliebig sein. Dabei gilt:

  • ist ein Gerät vorhanden, ist die Person da. 
  • Sind alle Geräte abwesend ist die Person abwesend.

Alle Geräte (PRESENCE Definitionen) werden dafür einfach in eine structure gepackt. Damit die erwartungsgemäß funktioniert, muss festgelegt werden wie die Komponenten die structure beeinflussen soll. Dies wird durch drei Attribute erreicht: clientstate_behavior, clientstate_priority, event-on-change-reading.

Erkennung von Personen

Die Person selbst wird durch einen dummy device erzeugt. Diese zusätzliche Geräteinstanz ist nötig um einen gewisse Toleranz bei Abwesenheit zu erzeugen (Neustart Gerät, mal kurz im Keller oder vorm Haus usw.) D.h. die Gerätegruppe (structure) wird abgefragt und entsprechend ein dummy gesetzt. Wird die structure als present erkannt, ist jemand gekommen und der Status des dummy wird sofort gesetzt. Wird die structure als absent erkannt, wird eine gewisse Zeit gewartet. Sollte die structure nicht zurück auf present gesetzt werden, wird der Status auf absent gesetzt. Typischerweise nimmt man dafür eine watchdog Funktion. Diese lässt sich ziemlich einfach mit einem DOIF realisieren.

Der Code

Die Definition für FHEM sieht Beispielhaft so aus:
 define Dev11 dummy  
 attr Dev11 event-on-change-reading state  
 attr Dev11 eventMap 0:absent 1:present  
 attr Dev11 room Status  
 attr Dev11 webCmd present:absent  
 define Dev12 dummy  
 attr Dev12 event-on-change-reading state  
 attr Dev12 eventMap 0:absent 1:present  
 attr Dev12 room Status  
 attr Dev12 webCmd present:absent  
 define st_Dev1 structure bewohner Dev11 Dev12  
 attr st_Dev1 clientstate_behavior relative  
 attr st_Dev1 clientstate_priority present|1 absent|0  
 attr st_Dev1 event-on-change-reading state  
 attr st_Dev1 room Status  
 define PersonD1 dummy  
 attr PersonD1 room Status  
 define di_st_Dev1 DOIF ([st_Dev1] eq "absent")(set PersonD1 absent) DOELSEIF ([st_Dev1] eq "present")(set PersonD1 present)  
 attr di_st_Dev1 room Status  
 attr di_st_Dev1 wait 10  

Der Trick mit Telnet

Mittlerweile ist der "Trick" mit Telnet überholt. Aktuell arbeitet man besser mit der Raw Definition.
So landet das Codebeispiel direkt über die Commandzeile in der fhem.cfg

Mit putty (oder einem anderen Terminalprogramm) auf den Host (RaspberryPi) verbinden. Im Terminal folgendes eingeben:

 telnet localhost 7072  

Wenn ein Telnet Passwort vergeben wurde, wird dies abgefragt. Anschließen sooft enter drücken bis der fhem> Prompt erscheint. Jetzt einfach die Codezeilen in die Zeile kopieren.

Die Abfrage der Fritzbox

Um die Fritzbox abzufragen, verwende ich die checkAllFritzMACpresent Funktion aus dem Wiki . Die Fritzbox wird durch ein FRITZBOX Device in FHEM abgebildet.
Ich habe ein DOIF gebaut, das mehrere Geräte abfragen kann. Dazu werden die Geräte Stati in userReadings geschrieben. Bitte die userReadings und dummy's nicht gleich benennen, das führt zu Eigenheiten wenn man etwas loggen will.
 define di_FBAbfrage DOIF ([FB7490:?lastReadout.*]) (set Dev11 [di_FBAbfrage:D11], set Dev21 [di_FBAbfrage:D21])  
 attr di_FBAbfrage do always  
 attr di_FBAbfrage room Status  
 attr di_FBAbfrage userReadings D11 {checkAllFritzMACpresent("AA:BB:CC:DD:EE:FF")}, D21 {checkAllFritzMACpresent("11:22:33:44:55:66")}
 attr di_FBAbfrage wait 2

Das DOIF wird immer getriggert wenn die Fritzbox abgefragt wird. Es pollt also nicht zusätzlich wie die meisten anderen Lösungen. Um sicherzustellen, dass die Abfrage der Fritzbox abgeschlossen und die userReadings gesetzt sind wird mit der commando Ausführung 2 sec gewartet.
Diese Lösung erklärt auch die eventMap Attribute in dem Geräte dummy. Diese übersetzen die Resultate der Subroutine (0|1) in Presenceinformationen (absent|present).

Die Bewohner

Mehrere Personen können jetzt noch in eine structure zusammengefasst werden. Dabei gehen wir analog der Dev1 structure vor. Der zusätzliche dummy und das Watchdog werden nicht benötigt.

define st_Bewohner structure bewohner PersonD1 PersonD2

Damit ist es möglich sowohl Personen als auch Bewohner bezogene Aktionen auszulösen. Hierfür definiert man notify's oder DOIF's die dem Personen dummy oder der Bewohner structur getriggert werden.

Die Skalierung

Steht einmal die gesamte Struktur der Anwesenheitserkennung, gibt es zwei Ansatzpunkte um leicht etwas zu ändern:
Zusätzliches Kriterium der Anwesenheit der Person: einfach zusätzliche definieren und anschließend die Structure der Geräte mit addstruct bzw. delstruct.
addstruct st_Dev1 Dev13
Zusätzliche Person: einfach die Person definieren und mit addstruct bzw. delstruct zur Structure der Bewohner hinzufügen
addstruct st_Bewohner PersonNeu

Samstag, 25. Juli 2015

Die Zeiten ändern sich

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!

Donnerstag, 18. Dezember 2014

Fhem auf der Fritzbox

Edit Juli 2017
Mittlerweile ist auf der Fritzbox kein sinnvoller Betrieb eines zusätzlichen Systems mehr möglich und ich möchte mich auch ausdrücklich aus Sicherheitsbedenken dagegen aussprechen.

Fhem auf der Fritzbox ist entsprechend der neuen Security Policy von AVM nicht mehr so einfach zu betreiben. Für mich steht der exklusive Betrieb von fhem auf der Fritzbox nicht im Vordergrund, die einfache Anwesenheitserkennung per Wlan (Android Geräte) ist aber schon interessant. Deshalb betreibe ich auf der FB eine zweite Instanz von Fhem, die Haupt Instanz läuft auf einem RaspberryPI.

Mit FHEM2FHEM sind beide gekoppelt, fhem auf der Fritzbox kümmert sich nur um Anwesenheit.
Um Modifikation auf der Fritzbox minimal zu halten wird lediglich das fhem Image auf der Fritzbox installiert. Der Start von Fhem auf der Fritzbox erfolgt über Telnet, damit alles fehlertolerant läuft, wird Fhem auf der Fritzbox vom Fhem auf dem raspberryPi überwacht und automatisch gestartet. Die Fritzbox kann also ohne weiteres jederzeit neu gestartet werden. Die Idee und Grundlage für meine Beschreibung stammt von hier, diese Seite hat mir viel geholfen. Dort wird allerdings gezeigt wie die Anwesenheitserkennung auf die Fritzbox ausgelagert wird. Damals war es noch möglich Fhem auf der Fritzbox durch Modifikation der debug.cfg automatisch zu starten.

Damit man automatisch über Telnet remote etwas auf der Fritzbox ausführen kann, wird expect benötigt. Expect ermöglicht die Automatisierung von Telnet Befehlen. Auf der Fritzbox wird aber nur minimal installiert, ein Firmware Update der Fritzbox ist jederzeit möglich.

Einrichtung Schritt für Schritt
Zunächst mal etwas Vorbereitung auf Systemebene

Auf der Fritzbox

  • telnet aktivieren - das geht mit #96*7* wählen
  • fhem image installieren, hier steht wie es geht

Auf dem RaspberryPi

  • telnet client installieren
  • expect installieren

 sudo apt-get install telnet
  sudo apt-get install expect
  • bash script erzeugen /home/pi/StartFhemOnFritz.sh
 sudo nano /home/pi/StartFhemOnFritz.sh


 #!/usr/bin/expect

  spawn telnet fritz.box
  expect "password:"
  send "******\r"
  expect "#"
  send "cd /var/media/ftp/fhem\r"
  expect "#"
  send "./startfhemAsRoot\r"
  expect eof

Berechtigen zur Ausführung

 chmod +x scriptname

Jetzt kann per script fhem remote auf der Fritzbox gestartet werden. Das sollte man jetzt vom raspberryPi aus mal ausprobieren. Auf dem läuft ja Fhem schon, also in der Komandozeile von fhem eintippen:

 { system("/home/pi/StartFhemOnFritz.sh") }

Anschließend sollte Fhem unter http://fritz.box:8083 erreichbar sein. Beachte: Fhem läuft auf der Fritzbox mit root Rechten!

Die weitere Einrichtung erfolgt unter Fhem. Auf der Fritzbox muss nichts weiter eingerichtet werden. Alle folgenden Fhem Definitionen werden auf dem raspberryPi ausgeführt.

Zunächst mal wird auch für die Anwesenheitserkennung die FHEM2FHEM Kopplung vorbereitet

 define Remoteserver FHEM2FHEM 192.168.178.1:7072 LOG:.*

Der Status dieses Moduls wird später verwendet um zu überprüfen ob Fhem auf der Fritzbox läuft oder nicht.
Die grundlegende  Kontrolle übernimmt das Presence Modul von Fhem, vorher brauchen wir noch einen dummy

 define Server dummy
 define ServerPing PRESENCE lan-ping 192.168.178.1

Jetzt brauchen wir noch eine Erkennung um den Zustand "Fritzbox" ist neu gestartet zu erkennen. Das übernehmen zwei watchdogs.

 define wd_ServerPingoff watchdog ServerPing:absent 00:00:05 SAME set Server off;; trigger wd_ServerPingoff
 define wd_ServerPingon watchdog ServerPing:present 00:00:05 SAME set Server on; setstate wd_ServerPingoff defined

Um letztlich zu überprüfen ob die Fritzbox neu gestartet wurde, wird das DOIF Modul verwendet. Das definierte Modul wartet eine Minute bis zum Start von Fhem über Telnet auf der Fritzbox.

 define di_FritzOn DOIF ([Server] eq "on" and [Remoteserver] eq "disconnected") ({ system("/home/pi/StartFhemOnFritz.sh") })
 attr di_FritzOn wait 60

Ob ich hier eine effiziente und optimale Variante gefunden habe, weiß ich nicht. Auf alle Fälle läuft das alles wie erwartet. Die Fritzbox wurde immer mal neu gestartet. Das Fritzbox OS wurde zwischenzeitlich aktualisiert auf die Version 6.23.

Die Anwesenheitserkennung funktioniert reibungslos.