Stromzähler auslesen mit dem Pico / Daten über LoRa senden

in #deutsch6 months ago

Vorschaubild Stromzähler HQ, Janis hält einen ESP32 in der Hand von dem Display den Stromverbrauch anzeigt. Im Hintergrund sind Stromzähler, an einem hängt ein Pico W mit Lesekopf

Ich weiß, neue SmartMeter werden Pflicht, aber ich wollte das unbedingt selbst als Bastelprojekt erledigen.

Bei diesem Projekt habe ich viel lernen können über Funk und LoRa, Akkuverbrauch, serielle IR-Kommunikation.

Also, wie funktioniert das Ganze:
Der Stromzähler gibt, wenn er freigeschaltet wurde, mit dem PIN vom Messstellenbetreiber Daten über eine IR-Diode mit unterschiedlicher Baudrate und je nach Modell und ohne Modulation aus. Genutzt wird die Smart Message Language (SML).
Den PIN könnt ihr beim Messstellenbetreiber anfordern, dieser wird etwas frickelig mit einer Taschenlampe eingegeben.
Danach müsst ihr ein paarmal blinken und je nach Modell die Info auf "On" schalten.
Meine ersten Versuche waren, mit einem normalen 38 kHz IR-Empfänger die Signale zu entschlüsseln.
Dabei ist nur Blödsinn herausgekommen. Der Grund ist einfach: Diese Empfänger sind für Fernbedienungen moduliert und senden ihre Daten auch meist in längeren Abständen.
Nach etwas Suchen im Netz ist mir aufgefallen, dass ich nicht der Einzige mit diesem Fehler war.
Um dieses Signal auszulesen, benötigt ihr eigentlich einen Phototransistor wie den SFH 309 FA Forum und daran macht ihr einen 10 kOhm Widerstand, um ein nutzbares Signal zu erreichen.
Ein sehr schönes Video vom CC2 zeigt ein Beispiel mit einem Raspberry Pi.
Allerdings muss man bei dieser Konstruktion den richtigen Abstand einhalten und ein Gehäuse bauen. Aus diesem Grund habe ich mich dann dazu entschieden, eine fertige Lösung mit Tasmota Volkszähler zu kaufen.
Das ist natürlich teurer, funktioniert aber später ganz sicher. Ich brauche einen 3D-Drucker, keinen Platinenhersteller, wenn ich es ganz genau will, und muss nur die Kabel löten.
Hier wird auch dieser Phototransistor genutzt. Zusätzlich gibt es eine IR-Sendediode, die bei manchen Stromzählern nötig ist, um sie aufzufordern, Daten zu senden. In meinem Fall war das nicht nötig.
Das Gehäuse kann auch bei einem anderen Hersteller Spritzguss sein, was etwas wertiger aussieht und eine etwas andere Platine haben, aber ansonsten sind diese Köpfe alle ähnlich.
Bei meinem Kopf war es nötig, RX zu RX und TX zu TX zu verbinden. Hier sollte man also kurz in den beigelegten Zettel schauen oder beim Hersteller fragen, da sich manchmal nicht an die Invertierung gehalten wird, wie man es von UART kennt.
Ansonsten ist das nur anlöten und draufstecken. Bei den Farben müsst ihr euch nicht an die Anleitung von Volkszähler halten, diese dienen nur zur Orientierung. Bei meinem waren die Lötpads sogar schon verzinnt, und ich musste sie nur mit dem Lötkolben, der eher seine Probleme gemacht hat, erhitzen.
Ich habe ein paar einfache Jumper-/Dupont-Kabel Female-Female mit 50 cm genutzt und das eine Ende zum Löten abgeschnitten und abisoliert.
Es gibt auch Stromzähler, die das in Pulsen ausgeben oder das zusätzlich wie mein Zähler können. Dafür wird oft ein TCRT5000 genutzt, aber hier geht es jetzt nur um Stromzähler, die SML nutzen.

Ein TTL IR Lesekopf gelötet Lesektopf an Pico angeschlossen

PicoStromzählerHQ

Danach habe ich die Kabel testweise auf den Pico gesteckt und die Daten zuerst nur über einen Webserver übertragen, um sie zu testen.
Nachdem ich wusste, dass gescheite Daten ankommen, habe ich nach Inspiration gesucht und bin hier fündig geworden.
Nötig war eigentlich nur, den Code für den Stromzähler und LoRa anzupassen, meine Daten später wieder zu empfangen und an den Webserver und dessen Datenbank zu übermitteln, und diese Daten wieder mit Chart.js grafisch auszugeben.
SML ist leider je nach Stromzähler verschieden Erklärung Funktion. Zum Glück gibt es eine schöne Liste bei Tasmota, welche Geräte welche Sequenzen nutzen, so muss man es nicht selbst herausfinden.

WebseiteStromzähler


Aber was ist jetzt dieses LoRa? Puh, viel zu erklären, aber ich will ja niemandem den Kopf wegschmelzen, also halte ich mich einfach.

LoRa ermöglicht es mir, energieeffizient Daten zu senden, mit einer Reichweite von bis zu 20 Kilometern – und unter optimalen Bedingungen sogar noch weiter. Dies funktioniert auf 433 MHz oder 863-870 MHz in Europa sowie 902-928 MHz in den USA.
Das wird ermöglicht durch einen Korrekturalgorithmus und die Daten werden zusätzlich über den Spreading Faktor schneller und langsamer gesendet.
Der CCC hat auf der 33c3 einen interessanten Vortrag dazu gehabt, wie man diese Signale mit SDR-Software dekodieren kann und hier eine Erklärung vom CCC und CC2, was Software Defined Radio ist.
Für dieses Projekt ist interessant, mit welchen Einstellungen unser Signal möglichst schnell zu uns kommt und welche Frequenz am besten geeignet ist.
Die Frage mit der Frequenz hängt von eurem Land ab. Ich lebe in Deutschland und schaue daher bei der Bundesnetzagentur, welche Frequenz ich nutzen darf und im Fall von 863-870 MHz wie lange ich diese nutzen darf.
Ihr fragt euch jetzt sicher, wieso ich nicht 433 MHz nutze. Das kommt doch leichter durch Wände und hat keine Time on Air, die ich beachten muss.
Das liegt daran, dass 433 MHz von vielen Geräten ohne feste Limits genutzt wird. Es kommt also schnell zu Interferenzen mit Fernbedienungen, Autoschlüsseln, Temperatursensoren, Reifendrucksensoren.
Bei 865-868 MHz darf ich nur 25 mW senden und einen maximalen Arbeitszyklus von 1 % nutzen.
Bei einer Stunde, also 3600 Sekunden, müssen wir = 1 / 100 ( = 0,01 ) × 3600 Sekunden rechnen und erhalten 36 Sekunden Sendedauer in einer Stunde.
Bei Meshtastic wird deshalb 869,40-869,65 MHz mit bis zu 500 mW und einem maximalen Arbeitszyklus von 10 % genutzt.
Der Vorteil: Es stehen uns 6 Minuten pro Stunde Sendezeit zur Verfügung, mehr als genug für dieses Projekt.

Jetzt kommen wir zu der Time on Air: Woher wissen wir, welche Nachricht mit welchen Einstellungen wie lange braucht?
Dafür gibt es zum Glück Rechner, die uns diese Arbeit abnehmen. Dieser Rechner ist eigentlich für die Nutzung von LoRaWAN gedacht und könnte daher den Header auch bei der Berechnung enthalten.
Wir probieren es also zuerst mit den minimalsten Einstellungen.
Input Bytes: 8, Spreading Factor: SF7, Region: EU868, Bandwidth: 250 kHz und erhalten eine Sendedauer von 28.3 ms pro Nachricht ohne Client-ID, mit einer Client-ID von +8 Bytes 33.4 ms.
In meinem Fall sende ich alle 20 Sekunden, also 60 / 20 = 3 Mal die Minute. Nehmen wir also 3 Nachrichten × 60, kommen wir auf 180 Nachrichten. Jetzt rechnen wir nur noch 180 Nachrichten × 33,4 ms und kommen auf 6.012 ms / 1000 ms, also 6,012 Sekunden Sendedauer pro Stunde.
Wenn wir aber jetzt wirklich 3600 Nachrichten, also jede Sekunde eine Nachricht senden würden, dann würden wir bei 3600 Nachrichten × 33,4 ms = 120240 ms / 1000 ms = 120,24 Sekunden / 60 Sekunden = 2,004 Minuten und ganz genau, 0,004 Minuten × 60 Sekunden × 1000 ms = 240 ms kommen.
In dem Fall müssten wir also auf 869,40-869,65 MHz ausweichen und LoRaWAN wäre mit seinen eigenen Limits überschritten, falls ihr das an einen Gateway senden wollt.
Ich weiß, das ist viel Mathematik und kann verwirrend sein mit den Tabellen, aber hat man es einmal verstanden, ist es einfach.

Wenn euer Stromzähler nicht mehr als 200 Meter entfernt ist, kann das sogar mit einer Sendeleistung von 1 dBm funktionieren, selbst mit einer Standardantenne. Was ist der Vorteil? Unser Signal ist mit dieser Leistung sehr schnell übertragen, wir halten alle Grenzwerte ein, und wir können die Sendeweite auf einen Radius beschränken. Das spart Energie, was im Akkubetrieb einen kleinen Unterschied machen kann. Ich nutze aktuell einen Akku mit 10.000 mAh und 3,7 Volt, also 10.000 mAh / 1.000 mAh = 10 Ah × 3,7 Volt = 37 Wh.

Akku

Wieso nutze ich keine Powerbank mehr? Diese ist immer ausgegangen, wenn sie den 600 mAh Akku geladen hat, und hat einen Mindestverbrauch sowie eine Schüttelinteraktion nötig. Der Pico verbraucht viel zu wenig, um diese auszulösen. Der Pico W hat einen Verbrauch von 600 mAh, die in 33 Stunden verbraucht wurden, also etwa 18 mA ohne WiFi, mit LoRa und 50 MHz Takt. Ich war also alle 33 Stunden im Keller und musste meine Powerbank wach schütteln. Jetzt muss ich nur noch etwa alle 23 Tage in den Keller laufen und aufladen, dafür ist das alles größer.

Ja, das größte Problem bei diesem Projekt ist der Stromverbrauch. Ich schreibe gerne in C++, es ist einfach meine Sprache, und Arduino ist eigentlich sehr anfängerfreundlich. Ich habe mich also entschlossen, auf MicroPython zu verzichten, aber bei diesem Projekt wäre der DeepSleep mit Real Time Clock zum Aufwecken wichtig gewesen. Der Pico ist ein Mikrocontroller mit großem Energiehunger im Vergleich zu vielen ESP32 Mikrocontrollern. Beispielsweise kann der DeepSleep zwischen 1 und 2 mAh erreichen, im Vergleich zu einem Heltec ESP32-S3 WiFi LoRa V3 mit 10 µA, den ich oben habe. Ja, Mikroampere, also 1.000 µA sind 1 mA, ich habe also das falsche Gerät unten.

Aber würde der DeepSleep mit Arduino oder wenigstens C++ störungsfrei laufen oder auch wirklich unterstützt sein, also mehr als nur ein Proof of Work Konzept, dann wären auch mit dem Pico W gute Akkulaufzeiten möglich, sogar Batteriebetrieb. So habe ich mich erst einmal entschieden zu warten oder vielleicht doch eine MicroPython-Version zu erstellen. Meine Versuche, die CPU herunterzutakten und die Spannung zu senken beim Sleep, haben auch eher zu Problemen geführt, und im Gemeinschaftskeller konnte ich nicht die ganze Zeit das Problem suchen. Mein Notebook hatte ständig keinen Akku mehr, und ich bin zu der Steckdose unserer Waschmaschine gelaufen und dann wieder zum Stromkasten.

Den Akku habe ich mit Versand für etwas über 10 Euro von AliExpress bekommen, der Anschluss war ein JST PH 2.0, ich habe aber einen JST SH 1.25 gebraucht. Ich hatte also die Wahl, das Kabel direkt zu löten oder einen Adapter zu bauen. Ich habe einen Adapter gebaut, dafür musste ich mir für etwa 6 Euro Kabel bestellen. Ja, jetzt habe ich wenigstens einen Vorrat, aber die sind leider überall ungefähr so teuer gewesen in der Stückzahl. Wie gut der Widerstand war, ist für mich nicht von Bedeutung gewesen bei dem Verbrauch vom Pico W. Was Plus und Minus ist, ist übrigens nicht genormt, daher passt auf, ob das richtig ist, und wenn nicht, korrigiert die Kabel, indem ihr das Plastik nach oben drückt und das Kabel herauszieht, und dann in das für euer Gerät richtige Loch steckt. Mein Gehäuse ist jedenfalls für den neuen Akku zu klein, meine Brotdose, die es hätte werden sollen, hat leider auch einen Zentimeter zu wenig. Daher habe ich das so wunderschön provisorisch festgeklemmt mit Zewarollen und dem Brief mit Luftpolsterfolie, womit er gekommen ist. Mir geht es dabei nur darum, dass niemand ihn herunterwirft, das mögen die Akkus gar nicht. Sie blähen sich auf, wenn man Pech hat, vor Schreck oder Wut, wenn die Hülle nicht standhält.

Wer den Pico mit Batterien betreiben möchte, sollte sich bewusst sein, dass diese voll aufgeladen eine höhere Spannung haben. Daher an VSYS mit 1,8 bis 5,5 Volt mit nicht mehr als drei NiMH-Batterien genutzt werden sollten. Ohne Abwärtswandler können die Batterien sonst den Pico beschädigen. Die Ladeschlussspannung beträgt bei einer 1,2 Volt Batterie etwa 1,45 Volt, also insgesamt 3 x 1,45 Volt = 4,35 Volt.


Ich nutze ein Waveshare LoRa Modul für den Pico, ihr könnt aber eigentlich auch über die Pins vom Pico andere Module anschließen und in der Software festlegen. Diese Lösung war aber für mich am einfachsten und hatte auch gleich einen Laderegler dabei.

Was man sonst noch beachten könnte:
Den Pico erst dann an den Strom anschließen, wenn die Verkabelung gesteckt ist. Das Gleiche gilt auch für die Antenne.
Schlechte Notebook-Netzteile können durch Kriechstrom Gleichtaktstörung, conducted common mode noise, Blindstrom vielleicht Geräte beschädigen, auf das Thema wurde ich letztens aufmerksam gemacht von einem Leser.
Keine zu hohe Zuglast am Kabel, Kabelbinder, die das Kabel am Gehäuse befestigen, können genutzt werden, um diese zu reduzieren.
Pinout des LoRa-Moduls prüfen, nur Pins nutzen, die nicht belegt sind.

Wer sich jetzt fragt, muss es denn LoRa und ein Pico sein? Nein, muss es nicht. Es kann auch ein normaler 433 MHz Sender und Empfänger für 2 Euro sein, WiFi geht natürlich auch, und wer eine Steckdose zur Verfügung hat, kann diese nutzen. Dieses Projekt sollte nur eben auch in Kellern funktionieren, wo es kein WiFi gibt und wo der Strom wie bei mir nicht einfach angesteckt werden kann. Wer das Ganze also vielleicht noch günstiger bauen will: Es gibt ESP32 oder ESP8266 mit DeepSleep, die dann auch deutlich länger durchhalten können mit Batterien. Je nach Platine kann das natürlich variieren, auch von der Möglichkeit, wie viele Batterien oder welche Akkus ihr nutzen könnt. Der 433 MHz Sender und Empfänger könnte vielleicht einfacher mit der RC-Switch Bibliothek genutzt werden. Daten könnte man auch verschlüsseln mit AES. Pico WH: 8 Euro, Waveshare: 17 Euro, TTL IR Lesekopf 20 Euro ohne Gehäuse 10 Euro, Alternative zum Lesekopf nur Photodiode 5-50 Cent und Widerstand Cents und falls nötig 5-30 Cent IR Sendediode, Akku 10.000 mAh 10 Euro. Falls ihr euch für Heltec WiFi LoRa 32 V3 für 18-25 Euro entscheidet, solltet ihr V3 nutzen, da ist einiges, was das Laden angeht und den Stromverbrauch verbessert. Lilygo wäre vielleicht auch noch eine Option, falls eine SD-Karte gewünscht ist. Ich habe also 63-70 Euro bezahlen müssen, es wäre aber natürlich für weniger möglich gewesen, aber ich wollte mit LoRa experimentieren.


Dieses Projekt hätte zugegeben manchmal besser laufen können. Es gab Fehlschläge, viel zu lesen, und auch noch ein paar offene Probleme, wie z.B. mit dem Stromverbrauch vom Pico W, also der Akkulaufzeit und dem Gehäuse. Aber ich konnte dabei auch viel lernen und dieses Projekt hat mir auch Spaß gemacht. Ich habe für Interessierte, die es nachbauen oder anders umsetzen wollen, den Source Code auf GitHub veröffentlicht. Die Weboberfläche ist zum aktuellen Zeitpunkt noch nicht fertig, ihr könnt natürlich auch eine andere Lösung wie z.B. Grafana nutzen.


*Pico W ohne Header*2 für 12,78–13,44 Euro mit Versand, Stand 12.06.2024. In den offiziellen Pico-Shops könnt ihr es vielleicht noch günstiger bekommen und zusätzlich noch etwas dazu kaufen, dann lohnt sich auch der Versand. Bei Geizhals - Pico W ohne Header könntet ihr auch vergleichen. Falls ihr auch Picos, die nicht vom Originalhersteller gebaut wurden, in Betracht zieht, könnt ihr auch auf AliExpress versuchen, ein Schnäppchen zu machen.
*Pin Header 2.54 - Suche Amazon
*20 Paare JST Steckverbinder PH 2.0 für 5,99 Euro, Stand 12.06.2024
*20 Paare JST 1,25
*Jumper 40x 20cm 3er Set
*Waveshare SX1262 LoRa Node Module for Raspberry Pi Pico Support LoRaWAN Protocol EU868 Band für 20,47 Euro mit Versand, Stand 12.06.2024
*FS1000A (433 MHz Sender & Empfänger) - Suche Amazon
*Heltec LoRa V3 868 - Suche Amazon
*Akku 10000 mAh JST 1.25 - Suche Amazon Bei Akkus werden auch bei eBay und Amazon teils die gleichen AliExpress-Akkus für 10 Euro mehr verkauft, aber auch Markenakkus mit hoffentlich echtem CE.
*bitShake SmartMeterReader - UART | IR Lesekopf für 26,90 Euro mit Versand, Stand 12.06.2024
*Hichi TTL - IR Lesekopf für Stromzähler optisch auslesen - SmartMeter - Volkszähler Lesekopf - UART für 27,49 Euro mit Versand, Stand 12.06.2024
*Tasmota Volkszähler TTL - Suche Amazon
Tasmota Volkszähler TTL - Suche Ebay
Als Amazon-Partner verdiene ich an qualifizierten Verkäufen bei Links mit einem *.

Artikel als Audio