Ein Shelly Plus 1 (von Allterco) ist nun mein erster Shelly geworden, nachdem ich feststellen musste, dass der zunächst wegen des LAN-Anschlusses bevorzugte Shelly 1 Pro in der aktuellen Version keine 12V DC Versorgungsspannung mehr unterstützt. Es handelt sich um einen programmierbaren 1-Kanal-Schalter mit Fähigkeiten, die ich bei einem Handelspreis von unter 20 EUR nicht erwartet hätte.
Der Shelly Plus 1 gehört zur 2. Generation der Shellys. Wer, wie ich zunächst, denkt, was man über die Shellys der 1. Generation liest, wird schon so ähnlich bei der 2. Generation auch funktionieren, täuscht sich. Wenn irgendwo nur von einem „Shelly“ ohne Zusatz „2nd generation“ oder „plus“ die Rede ist, liest man mit großer Wahrscheinlichkeit etwas, was für den Shelly Plus 1 nicht zutrifft.
Den Schalter ins WLAN zu bekommen, war ein Problem für sich. Mein Shelly Plus 1 wurde mit einer sehr alten Firmware ausgeliefert, in der sich die Einstellungen für das WLAN mit Firefox nicht speichern liesen. Mit Edge ging es dann, nachdem ich lange an falschen Stellen nach dem Fehler gesucht hatte (es gibt Listen, welche WLAN-Router unverträglich sind, welche Sonderzeichen in SSID und Key nicht erlaubt sind etc. – wobei ich mittlerweile glaube, die sind nur für die 1. Generation).
Grundlage für alles Weitere ist diese Dokumentation: API des Shelly Plus 1
Im Folgenden beschreibe ich, wie ich den Shelly Plus 1 benutze, um einen DSL-Router bei Verbindungsausfall neu zu starten (wobei ich nur einen Bruchteil der Möglichkeiten des Schalters nutze):
Die wichtigsten Befehle sind natürlich: Schalter ein …
http://shellyplus1/rpc/Switch.Set?id=0&on=true
und aus:
http://shellyplus1/rpc/Switch.Set?id=0&on=false
Da der Schalter im Normalfall „an“ sein soll, setze ich noch „auto_on“. Damit geht der Schalter nach einer vordefinierten Wartezeit (default ist 60 Sekunden) wieder auf „an“, egal auf welchem Weg (manuell, Stromausfall etc.) er ausgeschaltet wurde.
http://shellyplus1/rpc/Switch.SetConfig?id=0&config=%7Bauto_on:true%7D
Wenn man für den Shelly eine Authentication setzt, funktionieren Befehle unter Verwendung des gesetzten Passworts per Browser weiterhin, sofern man weiß, dass der Username immer „admin“ ist. Da ich allerdings das Ganze per Shellscript unter Linux mache und die http-requests mittels wget absetze, bin ich darauf angewiesen, dass das Passwort mittels „wget –user admin –password xxx ….“ (vor den Optionen user und password befinden sich zwei Minuszeichen, auch wenn WordPress das teils anders darstellt) übergeben wird. In meiner Testumgebung gelingt dies nicht, da mein wget kein SHA-256 unterstützt: „Authentication selected: Digest qop=“auth“, realm=“shellyplus1-a3062af90e80″, nonce=“6451962b“, algorithm=SHA-256. Unsupported algorithm ‚SHA-256‘. 401 Unauthorized.“
Es folgt das durchaus sehr hässliche bash-Script (geht auch in schön, aber das war die schnellste Lösung), welches, wenn alle ausgelösten pings erfolglos waren, den Schalter für die vordefinierte Zeit abschaltet. Das Script läuft bei mir auf einem Server im Haus, möglicherweise könnte man so ein Script auch auf dem Shelly selbst laufen lassen, damit habe ich mich nicht befasst.
if ! ping -c 1 1.1.1.1
then
sleep 60
if ! ping -c 1 8.8.8.8
then
sleep 60
if ! ping -c 1 131.107.255.255
then
sleep 60
if ! ping -c 1 www.google.de
then
sleep 60
if ! ping -c 1 www.akamai.com
then
sleep 60
if ! ping -c 1 www.denic.de
then
sleep 60
if ! ping -c 1 www.microsoft.com
then
sleep 240
if ! ping -c 1 8.8.8.8
then
wget --spider --quiet http://shellyplus1/rpc/Switch.Set?id=0\&on=false
printf "dsl-router restarted at $(date)" | mail -s"ALERT: dsl-router restarted!" mailadresse@domain.xy
fi
fi
fi
fi
fi
fi
fi
fi
Die maximale Gesamtlaufzeit des Scripts ist bei mir, sollten alle pings bis zum timeout laufen: 11m21.289s
Somit sollte es nicht zu race conditions kommen, wenn das Script per cron alle 15 Minuten gestartet wird. Und selbst wenn die DSL-Verbindung zum nächsten Scriptstart noch nicht wieder aufgebaut ist, sondern noch paar Minuten braucht, ist das kein Problem, da ja dann nicht alle pings fehlschlagen werden, sondern max. die ersten.
In ein zum Router passendes Verlängerungskabel (Kleinspannung, zwischen Router-Netzteil und Router) ist der Shelly eingeschleift. Das abgebildete Netzteil ist nur für die 12V DC-Versorgung des Shelly selbst.