🏠 FabLab Startseite | Nutzungsbedingungen | Impressum | Wiki

Programmieren eines Shelly 1PM / Programming a Shelly 1PM

english version below

Moin zusammen,

für die Freischaltung unserer Geräte mithilfe der Makercard basteln wir gerade an der Verwendung von Shellys in Version 1PM (also mit Strommessung). Da wir beim Programmieren einige Probleme hatten, möchte ich hier die unterschiedlichen Stolpersteine beschreiben.

In unserem Aufbau haben wir einen USB to TTL Serial Debugger (um genau zu sein diesen hier) verwendet, der an den Programmierheader des Shellys angeschlossen wurde.
Wichtig ist, den Reset-Pin (in der Doku GPIO0) mit GND zu verbinden, sonst klappt der Programmiervorgang nicht.

Serielle Ausgabe

Bei der Verwendung des Seriellen Monitors kam es häufiger zu Problemen. Das größte hierbei ist, dass eine ältere Version der ESP Libraries verwendet werden muss. Unter Platformio funktionierten in unserem Test Versionen der espressif8266 Library <= 2.0.4. Einstellen kann man dies in PlatformIO mithilfe der platformio.ini mit der Zeile platform = espressif8266@2.0.4.
In Arduino Studio müsste dies Version 2.5.1 der esp8266 Library entsprechen (vorsicht, ungetestet).

Zusätzlich kam es häufiger zu Verbindungsproblemen direkt nach dem Flashen. Ein Aus- und Wiedereinstöpseln des Debuggers und Neustarten der Konsole musste dann durchgeführt werden, um wieder Debug-Ausgaben anzeigen zu können.

Pinout

In der Doku des Shelly1PM sind GPIO-Pins angegeben. Diese beschreiben aber nicht die GPIO-Pins des ESP sondern scheinen von 0 - 5 durchnummeriert worden zu sein. Zusätzlich findet man dort keine Pin-Nummer für die Durchführung der Strommessung.
Beim Durchwühlen der Tasmota-Dokumentation für den Shelly1PM konnten wir für die Strommessung GPIO-Pin 5 und für die Ansteuerung des Relays Pin 15 ausfinding machen.

Verbindung mit dem Programmier-Header

!!!Die Verbindung mit dem Progammer sollte auf jeden Fall getrennt werden, bevor der Shelly an 240V angeschlossen wird. Anderenfalls kann es zu einer Beschädigung des Programmers, des Shellys oder sogar des verbundenen PCs kommen!!!
Das Relay im Shelly schaltet nicht, wenn er nicht an Netzspannung angeschlossen ist. Da aber der Programmer in diesem Zustand nicht angeschlossen sein darf, gestaltet sich das Debuggen teilweise schwierig.
Zusätzlich muss man darauf achten, dass nicht nur der Programmer aus dem USB-Port des PCs entfernt wird. Bleibt nämlich der Header verbunden, startet der Shelly nicht!

Strommessung

Die Strommessung auf dem Shelly erfolgt mithilfe des BL0937 (wieder mit Hilfe der Tasmota-Community gefunden). Der CF-Pin des Chips ist mit Pin 5 des Shellys verbunden.
Der BL0937 gibt auf dem CF-Pin eine PWM aus, deren Frequenz von der gemessenen Leistung abhängt. Man kann also nicht einfach einen Analog-Wert auslesen, um die Messergebnisse zu erhalten. Stattdessen kann man beispielsweise die Methode pulseIn(5, LOW) verwenden. Diese misst die Länge eines Pulses in Mikrosekunden und das Ergebnis lässt Rückschlüsse auf die gemessene Leistung zu.
Diese Methode ist nicht unbedingt praktisch, da die CPU während der Messung blockiert und nicht anderweitig verwendet werden kann. Dieser Beitrag listet zwei weitere Methoden auf, mit derer man beispielsweise durch die Verwendung von Interrupts die CPU durch die Berechnung weniger belastet.

Grundsätzliche Bemerkungen

Die Entwicklung auf dem Shelly gestaltet sich durch die oben genannten Einschränkungen als schwierig. Einfacher war die Verwendung eines gewöhnlichen ESP8266 zum Entwurf der Software. Anschließend die fertige Software auf den Shelly zu portieren, war dann einfacher. Wichtig ist, dass der Shelly einen kleineren Speicher besitzt, als die meisten gängigen ESP8266-Platinen (2MB), darauf sollte beim Programmieren geachtet werden!

Dieser Post wird um weitere Punkte ergänzt, sollten zusätzliche Dinge auffallen. Kommentiert gern selbst, falls ihr auf andere Probleme stoßt :slight_smile:

Alles in allem war die Programmierung der Shellys kein Spaß zu Beginn. Die fehlende Dokumentation in Kombination mit den unterschiedlichen Stolpersteinen stellten eine große Herausforderung dar. Wir hoffen diese Bemerkungen helfen euch, euren Shelly1PM ohne größere Schwierigkeiten zu Programmieren.

English version

Greetings,
to enable our Makercard-System to turn our machines on and off, we started working on programming the Shelly1PM. Since we encountered some problems while doing so, we wanted to share the obstacles we discovered.

In our environment we used a USB-to-TTL Debugger (this one to be exact), that was connected to the programming header of the Shelly. It is important to connect the Reset-Pin (GPIO0 in Shelly-documentation) to GND, otherwise the flashing process will fail.

Serial output

When using the Serial Monitor, we faced a couple of Problems. The largest one was, that only older versions of the esp library worked. In PlatformIO only versions of espressif8266 <= 2.0.4 enabled us to receive debug output. This setting can be changed in platformio.ini with the line platform=espressif8266@2.0.4. In arduino studio this should correspond with the esp8266-Library in version 2.5.1, but this was not tested by us.

Additionally, oftentimes the connection failed after flashing. Replugging the Debugger and restarting the monitor did the trick in those cases.

Pinout

In the Shelly1PM-Documentation GPIO-Pins are listed. However, these dont name the ESP-GPIO pins but rather an internal numeration of Shelly. Using the Tasmota-Documentation for Shelly1PM we discovered, that GPIO-Pin 5 (ESP-Notation) was used for power monitoring, while GPIO-Pin 15 (ESP-Notation) is used for toggeling the relay.

Connection to the programmer

!!!The connection to the programmer should be disconnected, before plugging the shelly to AC. Otherwise, the programmer, the shelly or even the connected PC may take damage!!!
The Shelly’s relay does only switch while connected to AC. Since the programmer should not be connected in this time, debugging can be difficult at times.
Additionally, it does not suffice to disconnect the USB-Debugger from the PC. While the programming header is connected to the shelly, it does not boot!

Measuring power

The power measurement on the Shelly1PM is performed by a BL0937 (again, found with help of the tasmota-community. The CF-Pin of the chip is connected to pin 5 (ESP-notation) of the Shelly1PM.
The BL0937 outputs a PWM-Signal on CF-Pin, the frequency corresponds to the measured power. Simply reading an analog value on that pin does suffice. Instead, you can use the method pulseIn(5, LOW) which measures the length of a pulse in microseconds. The result can then be used to calculate the measured power.
This method is quite resource-heavy, since the cpu blocks for the duration of the pulse. This blogpost lists two additional methods that utilize interrupts to keep the CPU free during the computation.

General remarks

Developing the software on Shelly1PM can be quite cumbersome due to the listed complications. It proved to be easier to use a generic ESP8266-board for development and then testing the finished software on the Shelly. Be carefull, though, since the Shelly has a smaller Memory than most generic ESP-boards (2MB)!

This post will be edited to include new remarks that we find. Feel free to comment with your own experiences :slight_smile:

That being said, programming the Shelly was no fun, since the lack of documentation and the number of different tripwires combined posed quite a big challenge to begin with. We hope these remarks helps you to program your shelly1pm without the hassle that we went through.

4 Like

Hammer!!
Vielen Dank für den Erfahrungsaustausch!
Das werde ich sicher auch noch einmal benötigen! :heart: