Shelly
Diese niedlichen, kleinen Boxen sind aktuell sehr populär und beliebt zum Schalten von elektrischen Geräten und
z.B. zur Leistungsmessung in Solaranlagen. Es gibt ein ganzes "Universum" an unterschiedlichen HW-Ausführungen und
Softwareunterstützung für alle gängigen Systeme. Typischerweise sind sie in das häusliche WiFi eingebunden
und werden darüber kontrolliert. Eine der simpelsten Boxen ist die Shelly 1 Mini Gen3:
Erste Inbetriebnahme
Der Shelly baut einen eigenen WiFi-Access-Point auf und wartet auf Kontaktaufnahme. In dieses neue Netz muss man
sich (mit einem Smartphone) vorübergehend einbuchen und dann in einem Browser die folgende Adresse aufrufen:
- http://192.168.33.1
Dies ist die universell gültige Default-Startseite aller neuen Shellys.
Das Shelly hat ein eingebautes Web-Interface. Dort die Konfiguration und Zugangsdaten für das
heimische WiFi setzen und aktivieren. Danach den Shelly-WiFi-Access-Point verlassen und zurück ins heimische WiFi einbuchen.
Der Shelly bekommt vom Heim-Router eine neue IP zugewiesen über die er ab jetzt im Heim-Wifi
ansprechbar ist. Die IP muss man in der Geräteliste des Routers nachschauen.
Diese ganze Prozedur kann man auch schnell und bequem mit der Shelly-App auf einem Smartphone erledigen.
Internals
Die Elektronik basiert auf einem
ESP32-C3 von Espressif der auf 8MB Flash und
512KB RAM erweitert wurde.
Er stellt eine WiFi und Bluetooth Verbindung bereit. Ein simples Netzteil ist ebenfalls enthalten. Achtung Bastler,
die Elektronik ist NICHT galvanisch vom Netz getrennt!
Die beiden Schaltkontakte des eingebauten Relais (HF32FA-G 12V) sind auf den Klemmenblock
geführt (Kontakte "O" und "I"). Sie sind elektrisch sicher und vollständig vom Rest der Elektronik isoliert und
können beliebig eingesetzt werden.
Das Relais sitzt um 90° gedreht auf einer Hilfsplatine.
Am Netz-Eingang sitzt ein Schutz-Varistor und eine 500mA Sicherung. Darauf folgen eine simple Gleichrichtung und
2 Kondensatoren (3.3uF/400V).
Das Netzteil ist zweistufig aufgebaut. Ein BP2522 (buck-converter) setzt die Netzspannung auf 12V
herunter (wird vermutlich nur für das Relais benötigt). Abweichend zum Datenblatt-Vorschlag wird am Eingang nur
eine einzige Diode an Stelle eines Brückengleichrichters eingesetzt. Am Ausgang ist ein 330uF/16V Elko.
Es folgt ein STI3470 der die 12V auf 3.3V für den Prozessor herabsetzt.
Neben dem On-Chip Temperatursensor scheint es noch einen weiteren 10kOhm NTC auf der Platine zu geben. Der wird aber
in keiner Dokumentation erwähnt und seine Funktion ist mir unklar.
Auf der Rückseite der Antennenstruktur sitzt ein fetter Keramik-Kondensator. Er ist auf beiden Seiten mit Masse
verbunden und scheinbar nur eine mechanische Stütze um für einen definierten Abstand des Relais zu sorgen.
Die Platine ist 1.0mm dick und hat 4 Kupferlagen mit normalen gebohrten und auch Micro-Laser-Vias.
12V-Betrieb und Pinout
Direktes Arbeiten an der Elektronik ist lebensgefährlich weil das Netzteil nicht galvanisch getrennt ist.
Zum sicheren Basteln, oder auch für dauernden Betrieb, kann man die 12V auch direkt über ein externes
Labornetzteil einspeisen. Ein geeigneter Einspeisepunkt ist parallel zum Ausgangskondensator des BP2522 (C26).
Am Rand der Platine befinden sich Testpads für einen (USB-)UART und zum Programmieren des ESP.
Die 3.3V kann man alternativ auch über den entsprechenden Testpunkt einspeisen. Die externe 12V-Einspeisung
darf aber NICHT gleichzeitig aktiv sein.
Eine externe 12V zu verwenden ist sehr zu empfehlen. Die 3.3V aus einem USB-UART Umsetzer sind möglicherweise
nicht in der Lage den Peak-Strombedarf zu liefern.
Die Shelly-Firmware plappert im normalen Betrieb bereits fleissig und ständig über seine serielle Schnittstelle
(115200,8,1,N) und sendet ihren Status und Infos zu gerade laufenden Aktionen.
Viele der Prozessorpins können mit alternativen Funktionen belegt werden. Die folgende Skizze zeigt die Ausgangskonfiguration:
Die Pegel einiger Pins werden beim Boot-Vorgang abgefragt und steuern ob der Download-Modus gestartet werden soll.
Diese Pins sollte man nicht verwenden oder entsprechend umsichtig beschalten.
Der Shelly verwendet die folgenden IOs:
Pin # | IO | Funktion |
---|---|---|
4 | GPIO0 | LED |
5 | GPIO1 | Taster |
8 | ADC1_CH3 | NTC |
13 | GPIO7 | Relay |
16 | GPIO10 | Schalter |
UART und Programmieren
Als Programmieradapter sind ein simpler USB-UART und 2 Taster ausreichend. Der Betrieb ist halbautomatisch. Zum
Starten des Bootloaders den Taster FLASH gedrückt halten und kurz RESET drücken. Die Pin-Belegung des
Steckverbinders im Beispiel ist für ein ESP-01S-Modul ausgelegt, die Signalnamen sind beim Shelly aber identisch.
Mit angeschlossenem USB-UART-Adapter kann man die Monitor-Daten auf der seriellen Schnittstelle (115200,8,1,N) mitlesen.
Nach einem normalen Reset meldet sich der Shelly mit den folgenden Daten (gekürzt):
ESP-ROM:esp32c3-api1-20210207
Build:Feb 7 2021
rst:0x1 (POWERON),boot:0xd (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fcd5820,len:0x11a8
load:0x403cc710,len:0x148c
load:0x403ce710,len:0x28c0
entry 0x403cc71a
boot: Shelly OS loader 1.0.0 (Oct 11 2024 11:45:33 IDF 5.2.1-s2)
boot: chip revision: v0.4
boot.esp32c3: SPI Speed : 80MHz
boot.esp32c3: SPI Mode : DIO
boot.esp32c3: SPI Flash Size : 8MB
boot: Enabling RNG early entropy source...
...
Das Bild ändert sich wenn GPIO9/[15]/"FLASH" während des Reset auf Masse liegt. Der Bootloader wird aktiviert und
der Programmiermodus gestartet. Das Gerät wartet auf neue Firmware:
ESP-ROM:esp32c3-api1-20210207
Build:Feb 7 2021
rst:0x1 (POWERON),boot:0x5 (DOWNLOAD(USB/UART0/1))
waiting for download
PlatformIO
PlatformIO ist eine der aktuell gängigsten Programmierungebungen.
Üblicherweise beginnt man dort mit der Angabe des verwendeten Board-Typs. Dadurch werden alle für die SW-Erstellung
wesentlichen Details (z.B. Port-Belegungen und Speichergrössen) gesetzt. Leider sind "die Shellys" dort
unbekannt. Eine schnelle und einfache Lösung ist es ein primitives/generisches Board mit dem gleichen Prozessor
als Basis zu nehmen und die Abweichungen händisch in der "platformio.ini" aufzulisten. Für den ESP32-C38F ist
das insbesondere die Speicherkonfiguration:
[env:esp32-c3-devkitc-02]
platform = espressif32
board = esp32-c3-devkitc-02
board_upload.flash_size = "8MB"
board_upload.maximum_size = 8388608
board_upload.maximum_ram_size = 512000
board_build.partitions = default_8MB.csv
framework = arduino
monitor_speed = 115200
WiFi Reichweite und Signalstärke
Ein kritischer Punkt ist die Signalstärke des Home-Wifi am Einbauort des Shelly. Eine dicke Wand in der
Verbindungslinie zum Router kann bereits eine Verbindung verhindern. Auf der Status-Seite des Routers kann man
prüfen ob der Shelly überhaupt "gesehen" wird. Falls nicht dann muss man das zuerst "irgendwie ändern"..
Die Stärke des Empfangssignals kann man aus dem Shelly auslesen (wenn eine Verbindung zum Router etabliert
wurde..). Die aktuelle IP-Adresse des Shelly findet man im Router. Diese Adresse in einen Browser eingeben
und durch das Menü zum passenden Unterpunkt wandern:
- http://192.169.178.169 (Shelly-Startseite) -> Settings -> Wi-Fi -> Wi-Fi status -> Status: RSSI
Je höher dieser Wert desto besser ist der Empfang (-60 ist besser als -80).
Der im Shelly hinterlegte Grenzwert ist -80dBm. Bei kleineren Pegeln wird automatisch ein Scan gestartet um ein besseres
Netzwerk zu finden. Eine halbwegs brauchbare Verbindung konnte ich bis ca. -90dBm aufbauen.
Alternativ gibt es auf der Shelly-Startseite noch den Punkt "Diagnostics". Mit "Download device data"
werden alle relevanten Daten in eine Protokolldatei geschrieben. In der Sektion "status":"wifi" wird der
"rssi"-Wert ausgegeben.
Jedesmal eine Datei herunterzuladen ist natürlich super lästig. Es geht aber auch viel einfacher und direkter.
Der an die IP-Adresse angehängte Parameter
- http://192.168.178.169/rpc/Wifi.GetStatus
fragt die Statusdaten des WiFi ab und zeigt sie direkt im Browser an.
Mit Hilfe des RSSI-Wertes kann man dann die Ausrichtung des Shelly und der Router-Antennen für besten Empfang
optimieren.
Weitere Details zu den Daten und alle sonst noch verfügbaren Services sind auf der
Shelly Dokumentationsseite
zu finden.
Empfang und Antenne optimieren
Im Haus hatte ich einige Ecken ohne ausreichende Signalstärke. Dieser Zustand ist Anfangs sehr
irritierend weil man nicht erkennen kann ob es nicht doch ein Konfigurationsfehler ist oder eine falsche
IP-Adresse.
Die WiFi-Antenne ist auf der Platine integriert, die Mäander-Struktur in der unteren Ecke:
Die Antenne ist kein Rundstrahler und wird eine leichte Vorzugsrichtung haben (keine Ahnung welche..).
Gewinn und Effizienz werden auch sehr begrenzt sein. Aber für die Umstände funktioniert sie ganz ordentlich.
Als "alter Funker" habe ich
sofort versucht eine bessere Antenne anzuschliessen. Die Antennenzuleitung auf der Platine ist leicht zugänglich.
Ich habe sie unterbrochen, die Isolierschicht abgekratzt und ein Antennenkabel angelötet.
Diese Arbeit ist sehr fummelig und ohne passendes Werkzeug und Können überhaupt nicht zu empfehlen.
Mit dem langen Kabel wollte ich weiterhin versuchen die neue Antenne aus dem Funkschatten heraus zu bringen.
Die Ergebnisse waren leider sehr bescheiden und diese Modifikation ist nicht wirklich zu empfehlen..
- Der RSSI-Wert ist niedriger als vorher. Vermutlich ist die Kabeldämpfung (2m Länge) grösser als der zusätzliche Gewinn der Antenne. Die neue Antenne hatte ich mit mehr als -10dB Anpassung bei 2,4GHz gemessen, sie sollte daher eigentlich okay sein.
- Die Signalstärke ist generell (auch mit der integrierten Antenne) extrem wackelig und stark von der Umgebung abhängig. Kleinste Standortänderungen können das Signal um mehrere dB schwanken lassen. Man kann bestenfalls eine grobe, gemittelte Schätzung über den Zustand abgeben.
- Eine weitere Unbekannte ist der aktuell verwendete WiFi-Funkkanal. Der wird vom Router festgelegt und ist kaum beeinflussbar. Die Eigenschaften der Antennen und der Funkstrecke variieren mit der Frequenz.
Eine optimale Antennen-/Gehäuseposition findet man nur wenn man den RSSI-Wert dabei fortlaufend beobachtet. Reflexionen
der Signale an der Umgebung spielen eine sehr grosse Rolle und sind nicht wirklich offensichtlich oder
vorhersagbar.
- Den Shelly in kleinen Schritten (ein paar cm) im Raum bewegen
- An brauchbaren/guten Punkten zusätzlich das Gehäuse um alle Achsen rotieren
- Der Shelly sollte dabei "schweben" und nicht durch eine Hand oder sonstige nahe Objekte abgeschattet werden
Glücklicherweise ist das alles nur für schlechte und grenzwertige Empfangssituationen relevant. Ansonsten spielt
es keine Rolle ob der Pegel um 20dB wackelt. Die Menge der zu übertragenen Daten ist minimal und die Geschwindigkeit
spielt dabei keine Rolle.
Temperatur auslesen
Ein weiterer interessanter Statuswert ist die interne Chip-Temperatur. Sie wird in den Einheiten Celsius ("tC") und
Fahrenheit ("tF") ausgegeben:
Die Übertemperatursicherung des Prozessors wird bei 95°C aktiv. Die Temperatur ist proportional zur Arbeitslast
des Prozessors. Das Abfragen selbst führt bereits zu einem spürbaren Temperatursprung. Die interne
Temperatur ist immer wesentlich höher als die Gehäusetemperatur und i.a. kein Grund zur Besorgnis.
Für die Lebensdauer, und auch die der umgebenden Komponenten (z.B. Netzteil-Elkos), ist es aber vorteilhaft die
Temperatur so niedrig wie möglich zu halten. Mögliche Massnahmen wären:
- Nicht benötigte Funktionen abschalten (z.B. Bluetooth)
- Netzwerkzugriffe und regelmässige Abfragen minimieren
- Eine "gute" Funkverbindung um häufige WiFi-Scans zu vermeiden
- Den ECO-Mode aktivieren
Mit diesen Massnahmen konnte ich die Übertemperatur bis auf ca 10°K verringern.
Range Extender
Eine weitere interessante Eigenschaft der Shellys ist der sog. "Range Extender" Modus. Der Shelly fungiert
in dieser Betriebsart als Signal-Relais. Er ist dabei gleichzeitig Access-Point und Client um eine
Brücke für das Router-Signal zu bilden. So kann man Teilnehmer erreichen die zu weit vom Router entfernt sind.
Erfreulicherweise ist diese Funktion nicht exklusiv und das Shelly kann parallel als ganz normaler Schalter
weiterarbeiten.
Der passende Eintrag findet sich unter:
- Home -> Settings -> Connectivity settings -> Range extender
In dieser Betriebart muss der "Access Point" aktiviert werden und einen (SSID-)Namen und ein Passwort bekommen.
Im entfernten Shelly werden SSID+PW unter "Wi-Fi 2" hinzugefügt und aktiviert.
Um das Shelly ansprechen zu können benötigt man seine neue IP-Adresse. Dazu muss man zurück zur Startseite des
Range-Extender-Shelly. Dort ist es jetzt als neues Client-Device gelistet:
- Home -> Advanced -> Device Clients -> External IPv4
In diesem Beispiel erreicht man das Web-Interface über
- http://192.168.178.191:13344
Alternativ kann man die Infos zu den Clients auch im Range-Extender über einen Service per HTML abfragen:
- http://192.168.178.191/rpc/Wifi.ListAPClients
Die Port-Adresse (in diesem Beispiel :13344) wird in der Sektion "mport" aufgelistet.
Der Range-Extender-Modus funktioniert prinzipiell überraschend gut.
Bevor man sich jetzt aber darüber freut auch das entlegenste Shelly mit WiFi zu versorgen zu können sollte man
die Besonderheiten und Einschränkungen im Auge behalten.
- Das weit entfernte Shelly benötigt eine gute Funkverbindung zum Range-Extender. Oft ist diese Verbindung aber nur marginal besser als die direkte zum Router.
- Gleichzeitig benötigt der Range-Extender eine gute Verbindung zum Router.
- Die Range-Extender Betriebsart ist in der Benutzung des Funkkanals sehr ineffizient. Der Datendurchsatz im gesamten Netz leidet darunter.
- Alle Daten müssen durch den Prozessor "geschleusst" werden. Das benötigt Zeit und Resourcen. Die werden vermutlich (hoffentlich) nirgendwo fehlen.
In meinem Szenario konnte ich keinen der vorhandenen Shellys als Range-Extender mitbenutzen. Die Funkverbindungen
waren alle grenzwertig und halfen nicht weiter. Ich habe deshalb einen separaten Shelly als nur-Range-Extender
konfiguriert und an einer optimalen Position montiert. Das erschien mir wesentlich ökonomischer als das ganze WiFi
durch eine zusätzliche "fette Box" aufzurüsten.
Sonstiges
Ein paar zusätzliche Anmerkungen
- Die Shellys funken nur im 2,4GHz WiFi Band, basierend auf den üblichen Standards 802.11b/g/n.
- 5GHz-WiFi wird nicht unterstützt.
- Bluetooth 4.2 wird unterstützt.
Links
Die Homepage von Shelly mit dem kompletten Produkt-Lineup.
Eine Getting Started Seite mit Hilfe zur Inbetriebnahme.
Eine Übersicht der
Components and Services
der RPCs (Remote Procedure Calls) zur einfachen Abfrage von z.B. Statusdaten per HTML GET. Das typische Format dieser Abfragen ist:
http://192.168.33.1/rpc/Shelly.GetStatus
Eine Übersicht aller Shelly-Varianten und ihrer Spezifikationen.
Die Produktseite des
ESP32-C3 von Espressif. Shelly soll eine
Customized-Variante (ESP32-C38F) mit mehr Speicher verwenden.
https://devices.esphome.io/devices/shelly-1pm-gen3/
https://community.shelly.cloud/topic/661-shelly-c3f8-specification/