FHEM und FritzBox 7170

Aus FHEMWiki

Die folgende Anleitung muss dringend überarbeitet werden ! Ziel: die aktuelle Version (zum Zeitpunkt des Artikel ist dies 5.0) von fhem (pgm2) auf der Fritz!Box 7170 mit einem CUL zum Laufen zu bekommen, ohne die Box dabei total zu überlasten oder zu crashen... Logfiles der Box sollen dabei nicht auf der Box sondern auf einem angesteckten USB-Stick gespeichert werden.

Orientiert habe ich mich an der hier veröffentlichten Anleitung, welche für mich allerdings einige Fallstricke aufweist - und bei der ich zumindest die Rolle des Apaches bei der Art der Installation und Konfiguration nicht verstanden habe...

Voraussetzungen: Ein USB-Hub an der Fritz!Box mit (mindestens) einem USB-Speicherstick sowie einem Funk-Device (ich beschreibe hier den Weg für CUL v3.2, anderes wird ähnlich funktionieren); ein PC mit VMware (Player) bzw. VirtualBox, um die neue Firmware zu basteln

Bemerkung: Ich habe versucht, das Wesentliche aus dem Gedächtnis und meiner (unzureichenden) Doku zu rekonstruieren. Falls es irgendwo hängt, würde ich mich über eine Korrektur des Artikels und/oder 'ne kurze Mail freuen!

Freetz

Warnung:Mit freetz kann man sich seine Fritz!Box auch schön zu Grunde richten (wenn auch meist nicht endgültig); ich empfehe ganz dringend die Lektüre der ersten Schritte für Anfänger und die etwas gründlichere Auseinandersetzung mit Freetz!

Vorbereitungen

Freetz erlaubt die Modifikation der original-AVM Firmware, so dass zusätzliche Features eingebaut und nicht benötigte eingespart werden können (spart Flash und RAM - und erhöht eventuell sogar die Sicherheit...)

Für das Erstellen der Firmware mittels Freetz ist hier.

Ist die VM gemäß Anleitung gestartet, kann man (nach einloggen und downloaden der Quellen) sich mittels make menuconfig seine eigene Firmware zusammenbasteln.

Konfiguration der Firmware

(leider erlaubt das Wiki kein Upload von Textdateien, daher liegt meine Config extern)

Meine komplette (so für mich funktionierende) .config für freetz gibt es hier; bitte beachten, dass folgende (nicht direkt fhem-relevante) Änderungen eingebastelt sind, um die Box sowohl bezüglich Flash als auch bezüglich RAM zu entlasten:

FREETZ_REMOVE_TR069=y   # ACHTUNG: Vorher via WebIF deaktivieren!
FREETZ_REMOVE_USERMAN=y  # brauche keine Kindersicherung
FREETZ_REMOVE_FTPD=y   # ebenso kein FTP
FREETZ_REMOVE_MEDIASRV=y # Mediaserver ist eine andere Kiste
FREETZ_REMOVE_SMBD=y   # Samba brauche ich auch nicht (spart alles Platz!)
FREETZ_PACKAGE_CALLMONITOR=y # der Callmonitor ist TOLL!
FREETZ_PACKAGE_DROPBEAR=y # SSH Server. Klasse zur Installation und Wartung von FHEM
FREETZ_PACKAGE_NANO=y   # kleiner Editor, angenehmer als VI.

Hinweis: Diese Config spiegelt natürlich meine Konfiguration wieder. Wer einen Samba, FTP-Server etc. auf seiner Box haben will, muss natürlich entsprechende Änderungen vornehmen!

ACHTUNG: Das Entfernen von TR069 kann laut einigen Hinweisen zu einer Dauer-reboot-Schleife der Fritz!Box führen, wenn TR069 nicht vorher per Webinterface deaktiviert wurde; siehe auch hier - im Zweifellsfall tr069 nicht deaktivieren! fhem-relevante Anpassungen (Kernelmodule):

FREETZ_MODULE_usbserial=y # fuer CUL
FREETZ_MODULE_ftdi_sio=y # fuer FHZ? (habe ich nicht...)

einloggen und download der fhem-Quellen

Ist die selbst gebastelte Freetz-Firmware geflasht, kann man sich - wenn dropbear einkompiliert wurde - mittels SSH (ein empfehlenswerter SSH-Client für Windows ist z.B. PuTTY auf der Kiste anmelden. Als Serveradresse - na klar - fritz.box verwenden; Login ist "root", Passwort (ACHTUNG, daran habe ich 'ne Runde gesessen) "freetz". Dieses sollte man möglichst bald ändern.

Jetzt wechseln wir in das Verzeichnis des USB-Sticks und legen uns erst einmal ein Sammelverzeichnis für fhem an:

cd /var/media/ftp/uStor01
mkdir fhem
cd fhem

Sollte der erste Befehl nicht klappen, ist der USB-Stick wohl an einer anderen Stelle gemountet - ein df gibt Aufschluss, wo.

Jetzt besorgen wir uns Perl (dankenswerterweise vorkompiliert und mit allen wesentlichen Modulen bereitgestellt) sowie fhem:

wget [http://fhem.de/fb7170/perl-5.6.2.tgz http://fhem.de/fb7170/perl-5.6.2.tgz]
wget [http://fhem.de/fhem-5.1.tar.gz http://fhem.de/fhem-5.1.tar.gz]

entpacken:

tar -xvzf perl-5.6.2.tgz
tar -xvzf fhem-5.1.tar.gz

Praktischerweise ist in der Perl-Installation eine Datei vorhanden, die wir als Swap-Device für die Box nutzen können. Das Ganze ist natürlich erbärmlich langsam (USB 1.1!), leider führt kein Weg daran vorbei:

swapon /var/media/ftp/uStor01/fhem/perl/swapfile

Damit wir das nicht jedes mal machen müssen, wenn die Box startet, ist ein automatisches Einbinden beim Starten der Box sinnvoll. Freetz hat ja sein Webinterface auf fritz.box:81; hier gibt es unter Einstellungen / rc.custom die Möglichkeit, Kommandos beim Booten automatisch ausführen zu lassen.

<---------------------------- alt anfang-------------------------------->

Bei mir steht da

[ -f /var/media/ftp/uStor01/fhem/perl/swapfile ] && swapon /var/media/ftp/uStor01/fhem/perl/swapfile

<---------------------------- alt ende --------------------------------->


Hinweis: kommt die Meldung "Konfiguration in der aktuellen Sicherheitsstufe nicht verfügbar", hilft folgendes (auf der Shell eingeben!)

echo 0 > /tmp/flash/security
modsave

heisst, wenn das Swapfile gefunden wird (Stick steckt), dann aktiviere das auch. fhem selber möchte ich gerne (noch) manuell starten, das Swapfile brauche ich aber auch, wenn fhem nicht läuft (der Callmanager startet bei mir perl-Programme, die viel Speicher brauchen)...

Basisinstallation von fhem mit pgm2

Freetz läuft, Perl steht bereit, FHEM liegt vor. Machen wir uns an die Konfiguration. Eigentlich wird fhem mittels make install-pgm2 installiert, das wollen wir hier aber nicht (die Zielverzeichnisse stehen auf der FB so nicht zur Verfügung), aber wir können uns an die Zeilen aus dem Makefile halten:

(angenommen wird hier, dass fhem in /var/media/ftp/uStor01/fhem/fhem-5.1 entpackt wurde):

cd /var/media/ftp/uStor01/fhem/fhem-5.1    # eventuell anpassen!
cp -r webfrontend/pgm2/* FHEM
cp docs/commandref.html docs/faq.html docs/HOWTO.html FHEM
cp docs/*.png docs/*.jpg FHEM
cd examples; for i in *; do cp -r $i ../FHEM/example.$i; done
cd ..
cp examples/sample_pgm2 fhem.cfg
mkdir logs

soweit, so gut. Unsere fhem.cfg passen wir in etwa an wie folgt (nano fhem.cfg):

attr global logfile /var/media/ftp/uStor01/fhem/fhem-5.1/logs/fhem-%Y-%m.log
attr global modpath .         # where our FHEM directory is
attr global port 7072         # our TCP/IP port (localhost only)
attr global statefile /tmp/fhem.save  # where to save the state of the devices
attr global verbose 3         # "normal" verbosity (min 1, max 5)
define CUL CUL /dev/ttyUSB0@38400 1234
define WEB FHEMWEB 8083 global
define WEBS FHEMWEB 8084 global
attr WEBS smallscreen
# Fake logfile, to access the global log
define Logfile FileLog /var/media/ftp/uStor01/fhem/fhem-5.1/logs/fhem-%Y-%m.log fakelog
define autocreate autocreate
attr autocreate autosave
attr autocreate device_room %TYPE
attr autocreate filelog /var/media/ftp/uStor01/fhem/fhem-5.1/logs/%NAME-%Y.log
attr autocreate weblink
attr autocreate weblink_room Plots

Hinweis:Ich hatte enorme Probleme - mein CUL empfing eifrig Daten, nur sendete er nichts. Mit der Umstellung auf "define CUL CUL /dev/ttyUSB0@38400 1234" ging es auf einmal, während "define CUL CUL /dev/ttyUSB0 1234" und "define CUL CUL /dev/ttyUSB0@9600 1234" den erwähnten Effekt brachten. Vielleicht hilfts jemandem.

Startscript

letztendlich basteln wir uns noch ein Startskript, welches das notwendige Kernel-Modul für CUL einbindet und den ganzen Kram startet:

nano fhem.sh

export dTSB=1212687845
export LD_LIBRARY_PATH='/var/media/ftp/uStor01/fhem/perl/lib'
export PERL5LIB='/var/media/ftp/uStor01/fhem/perl/lib:/var/media/ftp/uStor01/fhem/perl/lib/perl5:/var/media/ftp/uStor01/fhem/perl/lib/perl5/5.6.2'
insmod /lib/modules/2.6.13.1-ohio/kernel/drivers/usb/serial/usbserial.ko vendor=0x03eb product=0x204b
mkdir /tmp/fhem
cd /var/media/ftp/uStor01/fhem/fhem-5.1/var/media/ftp/uStor01/fhem/perl/bin/perl fhem.pl fhem.cfg

Bemerkung für die *nixer unter uns: ein chmod +x brauchen wir nicht, auf dem Stick ist alles +x

Das Skript jetzt starten (./fhem.sh) - und das Log beobachten (tail /var/media/ftp/uStor01/fhem/fhem-5.1/logs/NameDesLogfiles). Kommen Fehlermeldungen, dass es Probleme mit SIGirgendwas gibt, hilft erst einmal ein beherztes Auskommentieren der Zeilen 1757ff in fhem.pl (nano fhem.pl):

sub
SignalHandling()
{
 if($^O ne "MSWin32") {
#  $SIG{'INT'} = sub { $sig_term = 1; };
#  $SIG{'TERM'} = sub { $sig_term = 1; };
#  $SIG{'PIPE'} = 'IGNORE';
#  $SIG{'CHLD'} = 'IGNORE';
#  $SIG{'HUP'} = sub { CommandRereadCfg(undef, "") };
 }
}

Hier gibt es sicher elegantere Methoden - ich war nur zu faul mich zu bemühen zu verstehen, woran es hängt! Wenn jemand da eine Idee hat... mittels telnet localhost 7072 oder mit dem Webbrowser auf http://fritz.box:8083/fhem sollte jetzt auf fhem zugegriffen werden können.

FHZ

(alles ungetestet, habe keine FHZ mit USB) ...

das Modul für die FHZ könnte sich mit

insmod /lib/modules/2.6.13.1-ohio/kernel/drivers/usb/serial/ftdi_sio.ko

laden lassen, die FHZ sollte dann unter

/dev/ttyACM0

bereit stehen...

Autostart fhem

Beispielscript für rc.custom

Die Warteschleife ist aus einem Beispiel von http://www.zebradem.com/wiki/index.php

# Wait until we have a network connection.
# Script can be disabled by removing network cable
# At least one of the web sites must must respond to ping before we continue
SITE_1=web.de
SITE_2=www.google.com
while !(ping -c 1 $SITE_1>/dev/null) && !(ping -c 1 $SITE_2>/dev/null); do
  sleep 15
done
# Warten bis USB-Stick gemountet ist 
max=10
i=0
while [ $i -lt $max ]; do
if mount | grep " on /var/media/ftp/" > /dev/null; then
break
fi
let i=$i+1
sleep 30
done
# ENDE USB-Stick Warteschleife 
swapon /var/media/ftp/uStor01/fhem/perl/swapfile
/var/media/ftp/uStor01/fhem/fhem-5.1/fhem.sh

<---------------------------- alt anfang-------------------------------->

wer möchte, bastelt sich jetzt noch eine Zeile wie

[-f /var/media/ftp/uStor01/fhem/fhem.sh] && /var/media/ftp/uStor01/fhem/fhem.sh

(ungetestet; bei mir liegt das Skript nicht unter fhem-5.1!) in seine rc.custom (siehe oben), dann startet das ganze automatisch mit der Box.

<---------------------------- alt ende--------------------------------->