Stromzähler mit Raspberry Pi und ModBus auslesen

  • Ziel des Projektes:

    Stromzähler/Smartmeter via ModBus und Raspberry Pi auslesen, die Werte in eine Datenbank speichern und mit Grafana visualisieren


    Vorbereitungen

    Benötigte Hardware

    • Verwendeter Stromzähler: SDM530 von bg-etech: http://bg-etech.de/bgshop/prod…ehler-sdm530-modbus-p-461
      Ebenso möglich ist der Typ SDM230 (hier wurde aber die Klasse in der Software noch nicht geprüft) oder ähnliche Stromzähler mit ModBus Schnittstelle
    • Raspberry Pi mit Zubehör
    • USB ModBus Adapter: z.B hier
      Gibts auch billiger, aber da war mir die Wartezeit im Verhältnis zum Preis zu hoch
    • geschirmtes Buskabel lt. Anleitung vom Stromzähler
    • 2x 120Ohm 1/4Watt Abschlusswiderstand

    Einbau des Stromzählers nur durch Elektrofachpersonal!

    Angaben ohne Gewähr! Besser nochmals nach Anleitung prüfen

    Benötigte Software

    • Python 3.5 oder höher
    • PostgreSQL (optional mit timescale)
    • Andere Datenbanken wären auch möglich, hierfür existiert aber noch keine Schnittstelle
    • Grafana zur Visualisierung

    Benötigte Python Module

    • Toml
    • SQLAlchemy
    • sshtunnel

    Installation dieser:

    Apt Installation erfordert ggf. root Rechte! Paketquellen zuvor updaten. (apt update)


    apt install build-essential libssl-dev libffi-dev python3-dev


    Code
    1. pip3 install --user toml
    2. pip3 install --user SQLAlchemy psycopg2-binary
    3. pip3 install --user cryptography paramiko sshtunnel
    4. pip3 install --user systemd-python

    Telegrambot bei Botfather regestrieren

    Telegrambot bei Botfather erstellen, wenn Telegram nicht erwünscht Skriptanpassungen

    vornehmen. (Geht noch nicht automatisch) # Todo: automatisieren?


    Datenbank vorbereiten

    Tabellenspalten müssen den Namen der Messwerte besitzen


    Programm einrichten

    Konfiguration anpassen

    smartmeter_cfg.toml:

    Konfigurationsdatei muss im selben Ordner wie die Skripte mit dem Namen smartmeter_cfg.toml gespeichert werden


    • EletricMeter.py enthält die Klassen für die Stromzähler
    • smartmeter.py Ausführbares Skript (Hauptskript)
    • smartmeter_telegrambot.py Enthält den Telegrambot
    • telegram_bot_api.py API für den Telegrambot

    Alle Dateien müssen im selben Ordner gespeichert sein!

    Wenn die Verwendung des Telegrambots nicht erwünscht ist müssen die entsprechenden Zeilen im Hauptskript

    auskommentiert werden.


    Erstmaliger Test:


    python3 smartmeter.py

    Wenn dieser Erfolgreich verläuft:


    Service Unit erstellen

    Ausführung erfordert Rootrechte


    nano /etc/systemd/system/smartmeter.service

    systemctl start smartmeter.service

    Kontrolle ob Skript nun wieder aktiv ist, wenn ja automtische Ausführung anlegen:

    systemctl enable smartmeter.service

    Grafana

    Die Visualisierung findet in Grafana statt, auf nähere Ausführungen wird hier jedoch verzichtet, natürlich können die

    Messwerte mit anderen Tools visualsiert werden.


    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


    Todo:

    • Grafana Messwerte weitere Abfragen erstellen

    Bekannte Fehler:

    • Obwohl das Skript nicht abstürzt, werden keine weiteren Messwerte eingetragen. Vorübergehende Lösung, alle 24h wird das Skript neu gestartet

    Verlauf:

    • Messen und Senden der Werte eventuell in 2 seperaten Threads um ein niedriges Messintervall gewährleisten zu können
      threading oder multiprocessing waren nicht die Lösung, sondern das nicht ständig der SSH Tunnel und die DB Verbindung neu aufgebaut werden


    Bilder





    Jegliche Änderungen werden immer hier in Beitrag #1 mit einfließen, sodass immer #1 seine Aktualität behält.


    Danksagung

    Hier noch ein paar Worte des Dankes die dieses Projekt mitermöglicht haben!

    • Danke an Zentris , der mit seinem Thread Umwandlung Array of int ( 4 byte) in float nach IEEE 754 bei mir überhaupt das Interesse an diesem Projekt weckte und mir anschließend seinen bisherigen Code zur Weiterentwicklung überreichte
    • Danke an Pertl welcher die Serverressourcen für mich bereitstellt.
    • Danke an Linus für die ständigen Codekontrollen und Hilfestellungen
    • Danke an noisefloor für die vielen systemd Artikel im Wiki auf ubuntuusers, waren schon oftmals sehr hilfreich bei der Einrichtung von Service Units, welcher immer mehr werden :)


    Konstruktive Kritik am Code immer gern erwünscht! (Bei telegram_bot_api jedoch nicht notwendig, dieser Stand ist sehr veraltet)

  • Wo? Ist mir heute das erste mal untergekommen :denker:

    Nun ja, eben da, wo mit Konfigurationsfiles gearbeitet wird... (Industrie, Wirtschaft, Betriebssystemen... bei den "Profies" eben), ja selbst Linux nutzt dieses Format:


    Schau dir die Konfigfiles

    /etc/mke2fs.conf, /etc/autofs.conf, /etc/mysql/fabric.cfg, /etc/skel/examples.desktop, /etc/mono/browscap.ini

    usw. an, die nutzen das..


    Die Formate XML, JSON und eben auch TOML sind sehr verbreitet, wobei letztere oft nicht den Postfix "toml" haben sondern schlicht auf *.cfg, *.cf oder sogar *.txt enden, eben so, wie in verschiedenen Linux-Konfigfiles oben gezeigt....


    "Toms Own Markup Language"... - Er hat dem Kind einen Namen gegeben, das Format selbst ist "alt".

  • Naja, mir gehts da wie dbv , außer bei Hofei ist mir TOML (steht übrigens für „

    Tom's Obvious, Minimal Language“, Siehe https://en.wikipedia.org/wiki/TOML und https://github.com/toml-lang/toml#toml) noch nicht begegnet.


    Außerdem verwechselst du TOML mit INI (ja, da gibt’s Unterschiede...): https://en.wikipedia.org/wiki/INI_file. Ich kenne nicht alle Dateien, die du aufgezählt hast, aber .ini ist doch eher INI statt TOML...


    Nichts für ungut...

  • Ja, das INI Format ist quasi eine Untermenge von TOML...


    Offensichtlich :-) ... ich habe mir die Abk. immer so gemerkt... wieder was gelernt :lol:


    NACHTRAG:

    https://news.ycombinator.com/item?id=5272634




    Wusste ich es doch... Damals hieß die noch so, die Abk. ist wohl "neu interpretiert" worden...



    Nachtrag 2:


    Wie alles begann (1979):

    https://github.com/uiri/toml-1

    https://www.reddit.com/r/ruby/…toms_own_markup_language/