Shelly & PicoW

Zurück

Eine schlanke Stromverbrauch-Kosten-Webseite auf dem Smartphone, kein Schnickschnack, dafür eignet sich der Raspberry Pi PicoW Microkontroller hervorragend. Dieses Kapitel zeigt ein Beispiel. Sind alle Micro Python Module aufgespielt hat er noch 42 Prozent frei Kapazität. Das ist doch eine tolle Sache!

Für die Applikation Shelly PicoW werden folgende Bibliotheken benötigt:
Web-Framework-Microdot: pip install microdot (Version 2.0.5)
utemplate Micropython: pip install utemplate (Version 1.2)
uModbus für MicroPython: pip install uModbus (Version 1.0.4)
Das Web-Framework-Microdot funktioniert auch auf PC-Ebene mit Python. Man kann bequem alle HTML-CSS Funktionalitäten am PC mit Visual Studio Code entwickeln. Du hast keinen Raspberry Pi PicoW? Ein ESP32 Microkontroller geht auch!



Shelly PicoW Aufbau


Das obige Bild zeigt den PicoW. Ein altes USB-Kabel, rote Ader (+5V) an Pin 40 – schwarze Ader (GND) an Pin 38 in Verbindung mit einem USB-Netzteil und ab geht die Post.

Shelly PicoW Smartphone


Die PicoW Shelly Applikation besteht aus drei Webseiten: 1. Stromverbrauch und die Kosten. 2. Synchronisieren mit dem Drehstromzähler. 3. Fehlermeldung.

Shelly PicoW Webserver


Der PC Browser Vivaldi zeigt die Hauptseite an.

Shelly PicoW Folder


microdot und Flask ähneln sich. Beide benötigen die gleiche Ordnerstruktur: static und template. Zu 2: CSS, JavaScript (PicoW-Shelly braucht kein JavaScript) und Images werden im Ordner static gespeichert. Zu 3: Alle HTML-Files werden im Ordner template gespeichert. Beim Hochlaufen der Software erzeugt microdot automatisch aus HTML-Dateien Python Skripte. Zu 4: Speicherort für alle Bibliotheken, Python Skripte und sonstige Dateien (hier JSON). Hier ist ein Fehler! Es fehlt das Skript main.py – habe ich gepennt. Entschuldigung.

Shelly PicoW Boot.py


boot.py
boot.py ist eine Initialisierungsroutine und wird beim Hochlaufen der Software einmalig ausgeführt. In unserem Fall wird ein WLAN-Netzwerk aufgebaut. Vorausgesetzt in Zeile 12 sind WLAN-Name und Passwort hinterlegt! Die bordeigene LED signalisiert die erfolgreiche Netzwerkverbindung.


Shelly PicoW Main.py


main.py
Die Zeilen 9 und 10, 37 bis 47 sind vom Entwickler Miguel Grinberg empfohlene Methoden bzw. Anweisungen. Wenn das Rendern der HTML-Seiten nicht funktioniert und / oder die Inhalte des static-Ordners nicht korrekt verarbeitet werden, liegt das an fehlenden Befehlen in den oben angegebenen Zeilen.

Zeile 13 bis 15: Mit dem Hochfahren der Software wird die Hauptwebseite (Verbrauchsdaten - index.html) gerendert. Diese wird dem Anwender präsentiert, wenn er den Browser öffnet und die, in der Zeile 54, angegebene IP-Adresse einschließlich Port in das Adressfeld des Browsers eingibt. Weiterhin werden der Webseite Daten mitgegeben, siehe Zeile 15. Die Daten liefern das Skript tools.py, Zeile 52 bis 70. Die index.html besteht nicht nur aus HTML und CSS, eine Jinja-Syntax sorgt für die Visualisierung der Daten.

Zeile 18 bis 22: Betätigt der Anwender den Button „Synchronisieren?“ erfolgt eine HTTP-Post-Transaktion. Der Server PicoW wird aufgefordert, die Seite synchron.html zu rendern. Im Gegensatz zum GET erfolgt hier keine Veränderung der URL. Auch hier werden Daten mitgegeben (der alte Drehstromzählerstand) Die Zeile 20 ist eigentlich überflüssig, das hätte man in Zeile 22 miterledigen können.

Zeile 25 bis 34: synchron.html ist ein Formular. Der Anwender wird zur Eingabe, Editierung aufgefordert. Mit Betätigung des Schalters erhält PicoW die Daten. Auch hier eine HTTP-Post-Transaktion. Die Namensgebung in Zeile 27 „username“ ist schlecht gewählt. Besser wäre Drehstromzählerstand. In Zeile 29 bis 31 erfolgt die Synchronisierung, Sprung in die Methode synchronisieren() Bestandteil von tools.py Zeile 73 bis 76. Im Fehlerfall wird error.html gerendert. Ansonsten springt das Programm zur index.html, die Hauptwebseite.

Zeile 52 bis 54: Nach root.py springt der Befehlszähler des Programms zur Zeile 52. Die Datei param.json wird ausgelesen und alle erforderlichen Variablen werden initialisiert, siehe Zeile 53 und tools.py. Nach der Testphase sollte die Anweisung: debug = True auf debug = False geändert werden, Zeile 54.


Shelly PicoW Modbus.py


shellyModbus.py
Die Shelly PicoW Applikation verarbeitet nur drei Register. 1. Zeitstempel im UNIX-Format (1160). 2. Verbrauchte elektrische Arbeit (1162). 3. Zurückgegebene elektrische Arbeit (1164, z.B. Solar). Die Klasse shellyModbus wird in tools.py Zeile 11 instanziiert, und kontaktiert die Bibliothek umodbus in den Zeilen 21 bis 24. Es werden nur Register gelesen, einen Schreibbefehl gibt es nicht.

Zeile 10 und 11: Die IP-Adresse des Shellys und der Modbus Port (Standard 502).

Zeile 13 bis 28: Das Lesen von Registern, die 2 oder 4 ganzzahlige 16-Bit-Register belegen, erfordert eine Dekodierung. Zwei Dekodierungsmethoden werden benötigt: 1. float und 2. int32. Diese Aufgabe übernimmt die Bibliothek struct, keine leichte Kost! Eine kleine Hilfe findest du hier. Die Zeilen 41 bis 62 sind selbsterklärend.


Shelly PicoW Tools.py Shelly PicoW Tools2.py


tools.py
Achtung! Ein Fehler in Zeile 37! Falsch ist : a = time.gmtime()! Richtig ist: a = time.gmtime(unix)!

tools.py wird im Skript main.py Zeile 53 instanziiert. Zeile 14 bis 21: param.json wird ausgelesen und den Variablen der Klasse shelly_enviroments zugewiesen. Zeile 24 bis 34: Bei einer Drehstromzähler-Synchronisierung erfolgt ein Schreibbefehl für die Datei param.json. Obwohl nur ein Wert neu gesetzt wird (Zeile 31), müssen alle anderen Parameter ebenfalls neu geschrieben werden. Zeile 36 bis 50: Alles zum Thema Zeit. Da unterscheiden sich MicroPython und Python gewaltig. Glücklicherweise gibt es das Forum "stack overflow"!


Shelly PicoW Index.html


\template\index.html


Shelly PicoW Synch.html


\template\synchron.html.

Shelly PicoW Error.html


\template\error.html.

Shelly PicoW CSS


\static\css\shelly.css.

Zurück