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.

3 Kommentare:

  1. Hallo, vielen Dank für die Startlösung!
    Den Dummy und die Pings kann man sich vermutlich sparen durch Verwendung von notify oder at auf FHEM2FHEM:disconnected.
    Ich habe es jetzt so lösen können, dass alle 45 Sek. der Status geprüft und ggf. gehandelt wird:

    define at_FritzboxOnline at +*00:00:45 { if (Value("Fritzremote") eq "disconnected") { Log 1, ('Fritzbox offline: Fritzbox wird remote gestartet.') ;; system("/opt/StartFhemOnFritz.sh") }}

    PS: Die Kommentarfunktion sollte ohne Anmeldung funktionieren...

    AntwortenLöschen
    Antworten
    1. Danke für den Tipp :-)
      Ja ich wusste, dass ich das nochmal "überarbeiten" sollte. Aber es geht ja erstmal. War einer meiner ersten Schritte mit FHEM.
      Das mit der Kommentarfunktion habe ich geändert, war offenbar default so und ich habe da gar nicht nachgeschaut. Mal sehen ob das so geht.

      Löschen
  2. Vielen Dank für die Anleitung. Ich habe die kurze Form von Ronny implementiert ;-)
    Der Umzug von fhem@fritz.box auf fhem@pi ist vollzogen. Bei meiner Heimautomation "light" benötige ich die Presence-Erkennung der FritzBox

    AntwortenLöschen