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

    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:

    • Messen und Senden der Werte eventuell in 2 seperaten Threads um ein niedriges Messintervall gewährleisten zu können
    • Grafana Messwerte weitere Abfragen erstellen

    Bekannte Fehler:

    • .


    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


    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/