Änderungen

Update Fritzbox: Smart Home Schalter per Script steuern erstellt von Thorsten Eggeling's avatar Thorsten Eggeling
# Bei der Fritzbox anmelden
Damit sich die Fritzbox über ein Script oder Programm steuern lässt, muss die Anmeldung mit Passwort aktiviert sein. Das reicht im lokalen Netzwerk aus. Sie können auch die Anmeldung mit Benutzernamen und Passwort aktivieren, was beim Fernzugriff über das Internet erforderlich ist.
Sie finden die Optionen in der Fritzbox-Oberfläche (im Browser http://fritz.box oder http://192.168.178.1) unter "System -> FRITZ!Box-Benutzer". Über die Schaltfläche „Benutzer hinzufügen“ legen Sie einen neuen Benutzer an. Gehen Sie danach auf die Registerkarte "Anmeldung im Heimnetz" und aktivieren Sie die Option "Anmeldung mit FRITZ!Box-Benutzernamen und Kennwort". Für das LAN reicht dir Option "Anmeldung mit dem FRITZ!Box-Kennwort".
\ No newline at end of file
Sie finden die Optionen in der Fritzbox-Oberfläche (im Browser http://fritz.box oder http://192.168.178.1) unter "System -> FRITZ!Box-Benutzer". Über die Schaltfläche "Benutzer hinzufügen" legen Sie einen neuen Benutzer an. Vergeben Sie nur die nötigen Rechte, beispielsweise nur "Smart Home".
Gehen Sie danach auf die Registerkarte "Anmeldung im Heimnetz" und aktivieren Sie die Option "Anmeldung mit FRITZ!Box-Benutzernamen und Kennwort". Für das LAN reicht dir Option "Anmeldung mit dem FRITZ!Box-Kennwort".
Soll die Fritzbox auch über das Internet erreichbar sein, gehen Sie auf "Internet -> Freigaben" und klicken Sie auf die Registerkarte "FRITZ!Box-Dienste". Merken Sie sich den Wert, der hinter "TCP-Port für HTTPS" eingetragen ist, beispielsweise "49140". Hinter "Heimnetzadresse Ihrer FRITZ!Box" sehen Sie die Adressen, über die die Fritzbox erreichbar ist, etwa "https://fritz.box:49140".
Bei ersten Aufruf der URL im Browser, erhalten Sie eine Zertifikatwarnung. Das SSL-Zertifikat ist selbst signiert und damit für den Browser nicht vertrauenswürdig. In Firefox klicken Sie auf "Erweitert", dann auf "Risiko akzeptieren und fortfahren".
Mehr Komfort bietet die Verwendung von "Internet -> MyFRITZ!-Konto". Wenn Sie sich für ein MyFRITZ!-Konto registrieren, erhalten Sie eine Adresse wie "abcdef28kk6oabcdef.myfritz.net", über die Sie Ihre Fritzbox über das Internet erreichen.
**Neu ab Fritz OS Version 7.20**: Aktivieren Sie "Zertifikat von letsencrypt.org verwenden (empfohlen)" ("Internet -> MyFRITZ!-Konto"). Die Fritzbox erhält dann ein allgemein gültiges SSL-Zertifikat und die Zertifikatwarnung im Browser entfällt.
# Bei der Fritzbox per Script anmelden
Aus Sicherheitsgründen verwendet die Fritzbox bei der Anmeldung ein spezielles Verfahren, bei dem das Passwort nicht direkt übertragen wird. Die Dokumentation von AVM inklusive Beispielcode können Sie über https://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/AVM_Technical_Note_-_Session_ID.pdf abrufen.
Der Aufruf der URL http://fritz.box/login_sid.lua liefert einen zufälligen Challenge-Wert. Aus diesem muss für die Antwort (Challenge-Response-Verfahren) zusammen mit dem Passwort ein Hash-Wert gebildet werden. In einem Bash-Script funktioniert das mit den folgenden Zeilen:
```
fbox="http://fritz.box"
USER="MeinBenutzername"
PASSWD="MeinPasswort"
SID=$(curl -s $fbox/login_sid.lua | sed 's/.*<SID>\(.*\)<\/SID>.*/\1/')
challenge=$(curl --insecure -s $fbox/login_sid.lua | grep -o "<Challenge>[a-z0-9]\{8\}" | cut -d'>' -f 2)
CPSTR="$challenge-$PASSWD"
hash=`echo -n $CPSTR | iconv -f ISO8859-1 -t UTF-16LE | md5sum -b | awk '{print substr($0,1,32)}'`
RESPONSE="$challenge-$hash"
POSTDATA="?username=$USER&response=$RESPONSE"
SID=$(curl --data "$POSTDATA" -s $fbox/login_sid.lua | sed 's/.*<SID>\(.*\)<\/SID>.*/\1/')
```
Die Variable $SID enthält anschließend eine Zeichenkette, die für alle weiteren Anfragen an die Fritzbox verwendet wird. Damit das Script funktioniert, müssen Curl, Sed, Awk, Iconv, Grep und Md5sum auf dem PC installiert sein. Das bei Raspbian auf dem Raspberry Pi standardmäßig der Fall. Bei anderen Systemen fehlt oft Curl. Installieren Sie die fehlende Software über die Paketverwaltung.
# Schalter per Bash-Script schalten
Laden Sie smart_fritz_terminal.sh für die Kommandozeile herunter. Öffnen Sie das Script in einem Editor, unter Ubuntu etwa mit
`gedit smart_fritz_terminal.sh &`
Passen Sie am Anfang des Scripts die Werte für die Fritzbox-URL, das Passwort und den Benutzernamen an.
Das Script verwendet das Tool curl für den Zugriff auf die Fritzbox. Bei Ubuntu ist es standardmäßig nicht installiert. Holen Sie das mit dieser Befehlszeile nach:
`sudo apt install curl`
Starten Sie dann das Script im aktuellen Verzeichnis:
`./smart_fritz_terminal.sh`
Es gibt die gefundenen Aktoren-IDs aus, ferner deren Status, die aktuelle Leistungsaufnahme, die bisherige Gesamtleistungsaufnahme und die Temperatur.
Über folgende Befehlszeile schalten Sie das erste gefundene Gerät aus:
`./smart_fritz_terminal.sh 1 off`
Ersetzen Sie "off" durch "on", um es wieder einzuschalten. "toggle" schaltet den Zustand um.
Die Bedienung eines Schalters geht komfortabler, wenn Sie Verknüpfungen zum Script auf dem Desktop ablegen. Dafür verwenden Sie die Dateien "switch_1_on.desktop" und "switch_1_off.desktop", die Sie in Ubuntu im Dateimanager in den Ordner "Schreibtisch" unter "Persönlicher Ordner" kopieren. "smart_fritz_terminal.sh" kopieren Sie (als root) nach "/usr/local/bin". Per Doppelklick auf das jeweilige Desktop-Icons lässt sich der Schalter dann ein- und ausschalten.
# Geräte über einen eigenen Webserver ansprechen
Ein etwas modifiziertes Bash-Script lässt sich auch über einen Webserver steuern. Der Vorteil dabei: Ein Webserver im lokalen Netzwerk, der aber per Portfreigabe ("Internet -> Freigaben -> Portfreigaben") aus dem Internet erreichbar ist, stellt nur die nötigen Smarthome-Funktionen bereit. Die Fritzbox muss nicht aus dem Internet erreichbar sein.
Voraussetzung dafür ist, dass das Paket apache2 installiert ist. Sollte es noch nicht vorhanden sein, verwenden Sie folgende drei Befehlszeilen (Ubuntu/Linux Mint/Raspbian):
```
sudo apt-get install apache2
sudo a2enmod cgi
sudo service apache2 restart
```
Öffnen Sie das Script smart_fritz_server.sh in einem Editor. Passen Sie es an, wie im vorherigen Punkt beschrieben. Kopieren Sie (als root) die Datei in den Ordner "/usr/lib/cgi-bin". Achten Sie darauf, dass die Datei ausführbar ist. Setzen Sie die Rechte mit
`sudo chmod 755 /usr/lib/cgi-bin/smart_fritz_server.sh`
Rufen Sie im Browser die Adresse http://[Server]/cgi-bin/smart_fritz_server.sh auf. Für den Platzhalter "[Server]" setzen Sie den Host-Namen oder die IP-Adresse des Rechners ein.
smart_fritz_server.sh gibt die gleichen Informationen aus, wie das Script fürs Terminalfenster. Neben den jeweiligen Actor-IDs finden Sie die Schaltflächen "Umschalten", "Einschalten" und "Ausschalten". Danach können Sie auf "Seite neu laden" klicken, um die aktuellen Werte auszulesen.
Über den Wert der Variablen "VIEW" bestimmen Sie, was das Script ausgibt. "VIEW=full" gibt alle Informationen aus, die Abfrage dauert entsprechend lange. "VIEW=" gibt nur die wichtigsten Infos aus und "VIEW=min" gibt nur "OK" zurück. Letzteres eignet sich vor allem für die Verwendung von Diensten wie IFTTT (https://ifttt.com), über die Sie die Smarthome-Schalter über URLs wie
```
http://[Server/Domain]:[Port]/cgi-bin/smart_fritz_server.sh?ain=[AIN]&subbtn=Ausschalten
http://[Server/Domain]:[Port]/cgi-bin/smart_fritz_server.sh?ain=[AIN]&subbtn=Einschalten
```
steuern.
"[Server/Domain]" muss ein öffentlicher Domainname sein, den Sie entweder bei https://myfritz.net oder einem anderen Anbieter für dynamische IP-Adressen erhalten.
**Bitte beachten Sie: ** Ein aus dem Internet erreichbarer Server im eigenen Netzwerk muss gut abgesichert sein. Installieren Sie stets alle Updates. Verwenden Sie im Script nur das Passwort oder einen Frizbox-Benutzer, dem der Zugang aus dem Internet nicht erlaubt ist und der nur Smarthome-Geräte steuern darf. Sollte der Inhalt des Scripts aufgrund einer Fehlkonfiguration für fremde Personen lesbar sein, kann diese mit dem Benutzernamen und Passwort dann keinen Zugang zur Fritzbox über das Internet erhalten.