Shelly Bulb

Die Möglichkeit eine 220V LED mit E27-Sockel einfach per WLAN zu steuern, eröffnet viele neue Einsatzbereiche. Mal abgesehen von dem Einsatz zuhause als klassische Beleuchtung für Licht-Szenen kann so eine über Netzwerk beeinflussbare Leuchte für viele Dinge eingesetzt werden: Ein paar Beispiele:

  • Große Skype/Teams Präsenzanzeige
    Quasi "Busylight XL"
  • Alarmanzeige für Monitoring
    PRTG kann bei Benachrichtigungen eine HTTP-Aktion auslösen (https://www.paessler.com/manuals/prtg/notifications_settings#http) und damit die Farbe z.B. ändern
  • Anzeige der verfügbaren Parkplätze in einer Tiefgarage
    Oder natürlich auch andere IoT Projekte

Abseits der Haus-Automatisierung interessiert mich natürlich, ob und wenn ja wie einfach so ein Gerät als Statusindikator verwendet werden kann

Shelly Bulb

Die Firma Shelly, welche schon mit den Shelly-1 und Shell-2 erste ESP8266-basierte Geräte vertreibt, hat mittlerweile auch eine LED-Leuchte mit E27 Sockel. Leider kann ich genau diese LED nicht öffnen um eine eigene Firmware zu flashen. Allerdings ist die eingebaute Shelly-Firmware ausgesprochen offen, leistungsfähig, gut dokumentiert und per Default nicht mit der Cloud verbunden. Anders, als viele Smart-Home-Devices aus China, die den ESP8266 nur mit einem Cloud-Backend betreiben. Ich habe mir daher mal eine Shelly Bulb genauer angeschaut. Sie kostet ca. 20€ und passt in einen normalen E327 Socket.

Interessant an dem Device ist, dass die gleiche offene API mit der eingebauten Firmware zur Verfügung steht. Auch sie spannt erst einmal ein eigenes WLAN auf, mit dem man sich per PC oder Smartphone verbindet und über eine Webseite dann den Beitritt in ein vorhandenes WLAN per Benutzername/Kennwort konfiguriert. Nachdem das Gerät dann in dem WLAN ist, kann es weiter verwaltet werden.

Steuerung per App

Zuerst nutze ich die App des Herstellers, um die allgemeine Funktion zu verstehen. Über die Webseite des Geräts kann nicht nur konfiguriert sondern auch gesteuert werden:

Die LED lässt sich also auch mit einem beliebigen Browser steuern. Über die Browser Debugging Tools oder auch Fiddler können Sie auch die Kommunikation mitschneiden. Letztlich sind es ein Paar REST-Aufrufe, die der Browser mit JavaScript zur Leuchte sendet. Aber Sie müssen gar nicht hacken, denn die API ist gut beschrieben.

Shelly Bulb per PowerShell steuern

Also habe ich mir die API als auch den Verkehr der Webseite mal etwas genauer angeschaut:

Die HTTP-Anfragen können als URL-Parameter oder Form-Parameter übermittelt werden. Für den Start können Sie einfach ein Shelly als AccessPoint in Betrieb nehmen und ihren Notebook per WLAN verbinden. Der PC bekommt dann die 192.168.33.2 und das Shelly-Device hat die 192.168.33.1. Es reagiert auf PING und natürlich HTTP-Anfragen: Eine einfache Anfrage liefert schon MAC-Adresse und Firmware

Invoke-RestMethod http://192.168.33.1/shelly

type        : SHBLB-1
mac         : 827D3A123456
auth        : False
fw          : 20171218-103527/???
num_outputs : 1

Ein Zugriff auf "/settings" liefert doch weitere Details

Invoke-RestMethod http://192.168.33.1/settings


device     : @{type=SHBLB-1; mac=827D3A123456; hostname=shellybulb-123456; num_outputs=1}
wifi_ap    : @{enabled=True; ssid=shellybulb-420FD7; key=}
wifi_sta   : @{enabled=False; ssid=; key=}
login      : @{enabled=False; unprotected=False; username=admin; password=admin}
pin_code   :
name       :
fw         : 20171218-103527/???
build_info : @{build_id=20171218-103527/???; build_timestamp=2017-12-18T10:35:27Z; build_version=1.0}
cloud      : @{enabled=False; connected=False}
timezone   :
time       :
hwinfo     : @{hw_revision=prod-1.3; batch_id=1}
mode       : color
lights     : {@{ison=True; red=0; green=0; blue=255; white=0; gain=100; temp=4750; brightness=100; effect=0;
             default_state=on; auto_on=0,00; auto_off=0,00; schedule=False; schedule_rules=System.Object[]; sun=False;
             sun_on_times=0000000000000000000000000000; sun_off_times=0000000000000000000000000000}}

Standardmäßig ist keine Authentifizierung aktiv.

Invoke-RestMethod "http://192.168.33.1/settings/login"

enabled unprotected username password
------- ----------- -------- --------
  False       False admin    admin

Auch der Systemstatus ist so abrufbar:

Invoke-RestMethod "http://192.168.33.1/status"

wifi_sta   : @{connected=False; ssid=; ip=192.168.33.1}
cloud      : @{enabled=False; connected=False}
time       :
serial     : 1
has_update : False
mac        : 827D3A123456
lights     : {@{ison=True; mode=color; red=0; green=0; blue=255; white=0; gain=100; temp=4750; brightness=100}}
ram_total  : 51496
ram_free   : 42180
uptime     : 4300

Über die gleiche API lassen sich auch Werte setzen. Am Beispiel einer Lampe funktioniert das wie folgt. Zuerst habe ich über die Webseite einige Aktionen ausgelöst und parallel im Browser Debugger die Requests gesehen:

Danach war es natürlich sehr einfach die Farbe auch per PowerShell zu ändern.

# Aus und Einschalten
Invoke-Restmethod http://192.168.33.1/color/0?turn=off
Invoke-Restmethod http://192.168.33.1/color/0?turn=on

# Einmal Rot, Gruen# Einmal Rot, Gruen, Blau, Gelb
Invoke-Restmethod "http://192.168.33.1/settings/?mode=color"
Invoke-Restmethod "http://192.168.33.1/color/0?turn=on&red=255&green=0&blue=0&white=0"
Invoke-Restmethod "http://192.168.33.1/color/0?turn=on&red=0&green=255&blue=0&white=0"
Invoke-Restmethod "http://192.168.33.1/color/0?turn=on&red=0&green=0&blue=255&white=0"
Invoke-Restmethod "http://192.168.33.1/color/0?turn=on&red=255&green=255&blue=0&white=0"

# Default bei Spannung Da auf Ein, Aus oder letzter Stsandvoke-Restmethod "http://192.168.33.1/settings/color/0?default_state=off"
Invoke-Restmethod "http://192.168.33.1/settings/color/0?default_state=last"

#Umschalten auf weiss mit unteterschiedlicher Temperatur
Invoke-Restmethod "http://192.168.33.1/settings/?mode=white"
Invoke-Restmethod "http://192.168.33.1/white/0?turn=on&temp=3000&brightness=100"
Invoke-Restmethod "http://192.168.33.1/white/0?turn=on&temp=47500&brightness=100"
Invoke-Restmethod "http://192.168.33.1/white/0?turn=on&temp=6500&brightness=100"

Die Änderung des "Mode" kann nicht mit den anderen Parametern kombiniert werden und die RGB-Steuerung funktioniert nur in der Betriebsart "mode=color". Der Versuch die Lampe mit RBB=0/0/0 abzuschalten geht nicht.
Daher sollte Sie beim Setzen von Farbwerten auch immer vorher einen Request zum Setzen des Color-Mode senden. Speziell, wenn das Shelly Device von anderen Geräten erreicht werden kann

Invoke-Restmethod "http://192.168.33.1/color/0?turn=on&red=0&green=0&blue=0&white=100"
Invoke-Restmethod : Bad RGB values!

Ein sehr helles Weiß kann aber sehr wohl mit 255/255/255/255 erreicht werden.

Interessant ist auch die Option die Lampe automatisch abschalten zu lassen. Die angegebene Zeit ist in Sekunden. Allerdings hat meine Lampe sich da nicht dran gehalten. Schade, denn so könnte eine Statusleuchte ausgehen, wenn keine regelmäßigen Updates mehr kommen.

# Leuchte automatisch x Sekunden abschalten
Invoke-RestMethod "http://192.168.33.1/settings/color/0?auto_off=5"
Invoke-RestMethod "http://192.168.33.1/settings/color/0?auto_off=0"
# Leuchte nach x Sekunden Einschalten
Invoke-RestMethod "http://192.168.33.1/settings/color/0?auto_on=5"
Invoke-RestMethod "http://192.168.33.1/settings/color/0?auto_on=0"

Als Rückantwort kommt immer ein JSON-Datensatz mit dem Ergebnis. Weitergehende Aktionen, z.B. basierend auf Sonnenaufgang/Untergang oder Zeitplanung werden nur über die Cloud angeboten.

Das Umschalten der Leuchte auf ein vorhandenes WLAN geht dann natürlich auch sehr einfach.

Invoke-Webrequest "http://192.168.33.1/settings/sta?&enabled=1&ssid=ssidname&key=kennwort"

Das Thema "Security" ist bislang sehr kurz gekommen. Die Shelly Bulb unterstützt leider kein HTTPS, so dass bei einem konfigurierten Zugriffsschutz die Anmeldedaten unverschlüsselt übertragen werden.

Weitere Links