Raspberry Pi als PowerMeter

Bitte last alle Elektrischen Arbeiten von einem Elektriker erledigen !!!!!!!

Ich übernehme keine Haftung für Schäden oder Unfälle Jeglicher Art. Dies ist nur eine Anleitung.
Ich Selber bin gelernter Elektriker und weis was ich tue.

230V ist Lebensgefährlich !!!!!

Verwendete Hardware

Bei dem Modbus Stromzähler könnt ihr auch einen 1 Phasen Zähler nehmen oder wie ich einen Geeichten 3 Phasen Zähler.

Verwendete Software

Gehäuse Vorbereiten

Damit Der Raspberry Pi und die ModBus Platine in Das Gehäuse passt muss dieses ein wenig angepasst werden.

ModBus Platine

Bitte achtet darauf das die ModBus Platine richtig auf die GPO Pins aufgesteckt wird.
Ich hab erfahren das wenn man nur eine Pinreihe daneben liegt die Platine Schrott ist.

Den Raspberry Pi für die Platine Konfigurieren. Dazu muss man die Serielle Hardware einschalten.

raspi-config

In der Raspi-config zum Menüpunkt
5 Interface Options
dann P6 Serial auswählen und
Would you like a login shell to be accessible over serial? NO
und nun noch
Would you like the serial port hardware to be enabled? YES
Und letztendlich die Raspi-Config verlassen.

Den Raspi noch nicht neustarten

Als nächstes müssen wir noch die UART Konfigurieren. Bzw das UART sharing zwischen Bluetooth und den pl011 UART auf Pins 14 und 15
Dazu fügen wir in die die /boot/config.txt folgendes ein.

nano /boot/config.txt
# Disable built in Bluetooth
dtoverlay=pi3-miniuart-bt

Infos von hier

Als nächstes müssen wir noch die Serielle Console ausschalten.

Dazu editieren wir die /boot/cmdline.txt und passen diese an.
Bitte achtet darauf das Ihr euer root=/dev/????? richtig setzt.
Sonst bootet der Raspi nicht mehr.

Bei mir schaut die Zeile so aus, Ohne Zeilenumbruch

nano /boot/cmdline.txt
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

Dann könnt Ihre Euren Raspberry neu starten.

reboot

Falls Ihr ein Unkontrolliertes Rebooten verhindern möchtet, bzw vorher gefragt werden wollt. Dann Installiert euch das Tool molly-guard

apt-get install molly-guard

Einbau des Stromzähler

Bitte last dies von einem Elektriker machen !!!

Nach dem Fachgerechten Einbau des Stromzählers, könnt ihr in seinem Menü ablesen bzw Konfigurieren.
Bei mir waren die Default ModBus Verbindungsdaten so:

  • Baud – 9600
  • Parität – None
  • Stop-Bit – 1

Wie Ihr die ändern könnt, entnehmt Ihr bitte den Handbuch des Stromzählers.

Verkabelung der Modbus Platine

Bitte last dies von einem Elektriker machen !!!

Die ModBus Platine muss mit den Kontakten A und B mit dem Stromzähler A und B verkabelt werden.
Bitte achtet darauf das Ihr A mit A und B mit B verbindet.

In einigen Anleitungen hab ich gelesen das man noch jeweils einen Abschlusswiederstand von 120 Ohm an die Enden des Bus anschließen soll.
Bei mir hat das ohne diese Widerstände geklappt.
Diese müssten dann an die Enden des Busses, zwischen A und B geklemmt werden.
Jeweils einer beim letzten Stromzähler und bei der Modbus Platine.

USB Stick für InfluxDB

Ich nutze hier lieber einen USB Stick, den ich im Fehlerfall einfach austauschen kann, für die InfluxDB als das ich mir die SD Karte kaputtmache.

Den USB Stick kann man mitjeden Dateisstem bestücken, Ich hab mich hier für f2fs endschieden.

Falls nicht bereits Installiert Flash-Friendly File System installieren.

apt-get install f2fs-tools

F2FS auf den USB Stick.

mkfs.f2fs /dev/sda
F2FS-tools: mkfs.f2fs Ver: 1.7.0 (2016-07-28)

Info: Debug level = 0
Info: Label =
Info: Trim is enabled
Info: Segments per section = 1
Info: Sections per zone = 1
Info: sector size = 512
Info: total sectors = 7892087 (3853 MB)
Info: zone aligned segment0 blkaddr: 512
Info: format version with
"Linux version 4.14.34-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611)) #1110 SMP Mon Apr 16 15:18:51 BST 2018"
Info: Discarding device
Info: This device doesn't support BLKSECDISCARD
Info: This device doesn't support BLKDISCARD
Info: Overprovision ratio = 3.250%
Info: Overprovision segments = 128 (GC reserved = 69)
Info: format successful

Verzeichnis erstellen und mounten

mkdir -p /var/lib/influxdb/
echo "/dev/sda /var/lib/influxdb f2fs defaults,noatime 0 1" >> /etc/fstab
mount -a

Installation der benötigten Software

Als erstes benötigen wir ein paar Software Komponenten

apt-get install git lsof python-pip python3-yaml python3-serial python-influxdb python3-requests

Installation von InfluxDB

Hinzufügen des InfluxDB Repository

curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -

echo "deb https://repos.influxdata.com/debian stretch stable" | tee /etc/apt/sources.list.d/influxdb.list

Installation von InfluxDB

apt-get update
apt-get install influxdb

Damit InfluxDB nicht allzu viel auf die SD Karte Logt, schalten wir das Logging aus.

nano /etc/influxdb/influxdb.conf
query-log-enabled = false

[http]
enabled = true
bind-address = ":8086"
log-enabled = false

Autostart einrichten und InfluxDB Starten

systemctl enable influxdb
systemctl start influxdb

Datenbank und User erstellen, Bitte wählt ein vernünftiges Passwort.

influx

CREATE DATABASE db_meter_home
CREATE USER "db_meter_home" WITH PASSWORD 'db_meter_home'

exit

Installation von Telegraf

Optional könnt Ihr noch Telegraf installieren um Performance Daten vom Raspberry zu sammeln.

apt-get install telegraf

Datenbank und User erstellen erstellen

influx

CREATE DATABASE telegraf
CREATE USER "telegraf" WITH PASSWORD 'metricsmetricsmetricsmetrics'

exit

Das ist wieder das Default Passwort, bitte setzt ein vernünftiges.

Anschließend die Daten noch in der Telegraf Config hinterlegen

nano /etc/telegraf/telegraf.conf

[[outputs.influxdb]]
## The target database for metrics; will be created as needed.
  database = "telegraf"

## HTTP Basic Auth 
  username = "telegraf" 
  password = "metricsmetricsmetricsmetrics"

CPU und GPU Temperatur auslesen

Um die Temperatur der CPU und GPU auslesen zu können verwende ich dieses kleine script und binde es in Telegraf ein.

wget https://raw.githubusercontent.com/TheMickeyMike/raspberrypi-temperature-telegraf/master/telegraf_pi_temp.sh -O /usr/local/bin/telegraf_pi_temp.sh

chmod 755 /usr/local/bin/telegraf_pi_temp.sh

Der User Telegraf muss noch in die Gruppe von video aufgenommen werden.
Sonst kann er die GPU Temperatur nicht auslesen.

usermod -G video telegraf

Zum testen

sudo -u telegraf /usr/local/bin/telegraf_pi_temp.sh
{"cpu":53692, "gpu":53.7}

Das ganze in Telegraf eintragen und diesen neustarten

nano /etc/telegraf/telegraf.d/cpu_temp.conf
[[inputs.exec]]
  commands = ["/usr/local/bin/telegraf_pi_temp.sh"]
  timeout = "5s"
  data_format = "json"
  name_suffix = "_pi_temp"

Um den Netzwerk Traffic zu erfassen

nano /etc/telegraf/telegraf.d/network.conf
[[inputs.net]]
  interfaces = ["eth0"] 
## On linux systems telegraf also collects protocol stats.
## Setting ignore_protocol_stats to true will skip reporting of protocol metrics.
# ignore_protocol_stats = fals

Wifi Qualität auslesen

Leider ist bei Telegraf noch nichts dabei. Deswegen hier noch ein kleines Script das auch nach /usr/local/bin/telegraf_pi_wifi.sh kopiert wird.

#!/bin/bash

IWCONFIG="/sbin/iwconfig"
INTERFACE="wlan0"

WIFI=$(${IWCONFIG} ${INTERFACE})
BITRATE=($(echo "${WIFI}" |grep "Bit Rate" |awk '{print $2}'|awk -F '[=]' '{print $2}' ))
TXPOWER=($(echo "${WIFI}" |grep "Tx-Power" |awk '{print $4}'|awk -F '[=]' '{print $2}' ))
LINKQUALITY_MIN=($(echo "${WIFI}" |grep "Link Quality" |awk '{print $2}' |awk -F '[=]' '{print $2}' |awk -F '[/]' '{print $1}' ))
LINKQUALITY_MAX=($(echo "${WIFI}" |grep "Link Quality" |awk '{print $2}' |awk -F '[=]' '{print $2}' |awk -F '[/]' '{print $2}'))
SIGNALLEVEL=($(echo "${WIFI}" |grep "Signal level" |awk '{print $4}' |awk -F '[=]' '{print $2}'))

#echo "${WIFI}"
#echo ${BITRATE}" MBit"
#echo ${TXPOWER}" dBm"
#echo ${LINKQUALITY_MIN}
#echo ${LINKQUALITY_MAX}
#echo ${SIGNALLEVEL}" dBm"
echo -e "{\"Bit-Rate_MBit\":"${BITRATE}", \"Tx-Power_dBm\":"${TXPOWER}", \"Link Quality_min\":"${LINKQUALITY_MIN}", \"Link Quality_max\":"${LINKQUALITY_MAX}", \"Signal-level_dBm\":"${SIGNALLEVEL}" }"
nano /etc/telegraf/telegraf.d/wifi_status.conf
[[inputs.exec]]
  commands = ["/usr/local/bin/telegraf_pi_wifi.sh"]
  timeout = "5s"
  data_format = "json"
  name_suffix = "_wifi"

Jetzt noch Telegraf configtest und restart des Dienstes

telegraf -config /etc/telegraf/telegraf.conf -test
systemctl restart telegraf

Installation von Grafana

Zum auswerten der Daten verwenden wir Gafana in der aktuellen Version. 5.1.0 war es bei mir.

Hinzufügen des Grafanas Repository

curl https://bintray.com/user/downloadSubjectPublicKey?username=bintray | apt-key add -

echo "deb https://dl.bintray.com/fg2it/deb-rpi-1b stretch main" | tee /etc/apt/sources.list.d/grafana.list

Installation von Grafana

apt-get update
apt-get install grafana

Autostart einrichten und Starten

systemctl daemon-reload
systemctl enable grafana
systemctl start grafana

Grafana lauscht jetzt auf Port 3000
Login per admin / admin , Passwort solltet ihr dann gleich ändern.

Ihr könnt auch Grafana so einstellen das man sich nicht einloggen muss um die Grafen zu sehen.
Dazu editiert man die /etc/grafana/grafana.ini und passt [auth.anonymous] an

nano /etc/grafana/grafana.ini
[auth.anonymous]
# enable anonymous access
;enabled = false
enabled = true

# specify organization name that should be used for unauthenticated users
;org_name = Main Org.

# specify role for unauthenticated users
;org_role = Viewer

Und restartet den Grafana Dienst

systemctl restart grafana

Installation des Energy Meter Loggers

Download von Git

cd /opt
git clone https://github.com/samuelphy/energy-meter-logger

Das Setup Script laufen lasse, dies prüft ob alle Python Abhängigkeiten vorhanden sind

cd /opt/energy-meter-logger
python setup.py install

read_energy_meter.py testen

./read_energy_meter.py --help
usage: read_energy_meter.py [-h] [--interval INTERVAL] [--meters METERS]
[--log LOG] [--logfile LOGFILE]
optional arguments:
-h, --help show this help message and exit
--interval INTERVAL Meter readout interval (seconds), default 60
--meters METERS YAML file containing Meter ID, name, type etc. Default
"meters.yml"
--log LOG Log levels, DEBUG, INFO, WARNING, ERROR or CRITICAL
--logfile LOGFILE Specify log file, if not specified the log is streamed
to console

Soweit so gut.

Konfiguration Energy Meters

Anpassungen an der influx_config.yml und hier tragt Ihr die Daten von vorher ein.

nano influx_config.yml
host : 'localhost'
port : 8086
user : 'db_meter_home'
password : 'db_meter_home'
dbname : 'db_meter_home'

Anpassung der meters.yml, hier gebt ihr die infos über den Stromzähler an. In Meinem Fall schaut das so aus.

nano meters.yml
meters:
    - name : Meter Group 1
      type : SDM630.yml
      id : 1     # this is the slave address number
      baudrate : 9600   # Baud
      bytesize : 8
      parity : none # none | odd | even
      stopbits : 1
      timeout  : 0.5   # seconds

Testen

Zum testen des Scripts kann man diesen Befehl nutzen.

/opt/energy-meter-logger/read_energy_meter.py --log DEBUG --interval 10

Und das Ergebnis sollte dann so aussehen


Started app
Meters:
Reloading meter map as file changed
1 <--> Meter Group 1
Collected 0 readouts
Reading meter 1.
2018-05-11T20:09:29.653194Z Data written for 1 meters.
Reading meter 1.
2018-05-11T20:09:39.652505Z Data written for 1 meters.
Reading meter 1.
2018-05-11T20:09:49.658114Z Data written for 1 meters.
Reading meter 1.
2018-05-11T20:09:59.652494Z Data written for 1 meters.
Reading meter 1.
2018-05-11T20:10:09.658101Z Data written for 1 meters.
Reading meter 1.
2018-05-11T20:10:19.652465Z Data written for 1 meters.
Reading meter 1.
2018-05-11T20:10:29.658114Z Data written for 1 meters.
Reading meter 1.
2018-05-11T20:10:39.658107Z Data written for 1 meters.
Reading meter 1.
2018-05-11T20:10:49.658108Z Data written for 1 meters.
Reading meter 1.
2018-05-11T20:10:59.658111Z Data written for 1 meters.
Reading meter 1.
2018-05-11T20:11:09.658175Z Data written for 1 meters.
Reading meter 1.
2018-05-11T20:11:19.652475Z Data written for 1 meters.

Crontab / Autostart ….

Damit das ganze beim Nächsten reboot automatisch gestartet wird. Kann man ich entweder ein nettes Init Script schreiben, oder man packt das ganze einfach in die Crontab

nano /etc/crontab
# PowerMeter Logger
@reboot root /opt/energy-meter-logger/read_energy_meter.py --interval 10 > /var/log/energy_meter.log &

Das Dashbord in Grafana

Nach ein bisschen experimentieren und rumspielen m Grafana könnte dann so aussehen.

Gerne stelle ich euch auch mein Daschbord zur Verfügung

10 Kommentare zu „Raspberry Pi als PowerMeter

  1. Hallo Alexander

    Frage zu Grafana , wo hast Du das Dashboard her bzw. kannst Du es eventuell zur Verfügung stellen ?

    Bin gerade dabei Dein Projekt nachzubauen, die Teile kommen diese Woche noch.

    Beste Grüße , Joachim

  2. Hi Joachim,

    Die Dashboards hab ich selber gemacht. Das ist im Grafana sehr einfach gelöst, ein paar klicks hier ein paar da.
    Einfach im Grafana bisschen rumspielen.
    Zum Testen kannst du die Daten von Telegraf nehmen die die CPU / MEM uns vom Raspi aufzeichnen. Bei den Grafen vom Strom ist es dann das gleiche.
    Gerne kann ich dir mein Dashbord zu Verfügung stellen. Allerdings müssen die Quellen der Daten im Grafana dann Identisch sein, sonst würde er dir nur leere Grafen anzeigen.

    Grüße Alexander

  3. Hallo Alexander

    ganz vielen herzlichen Dank für die Zusendung deiner JSON-Files.
    Bin da leider kein Experte was SQL betrifft , irgendwie klappen die Statements bei mir nie.

    Heute kommt das RS485 Board noch und bin schon sehr gespannt wie das alles funktioniert und passt. Die Quellen der Daten übernehme ich einfach 1:1 das wird schon passen.

    Vielen Dank nochmal und beste Grüße , Joachim

  4. Hallo Alexander

    mir ist ein kleines Malheur passiert. Ich hab das RS485 Board auf den Raspberry Pi um einen
    Pin versetzt falsch aufgesetzt und dabei ist mir das RS485 Board kaputt gegangen. Hab jetzt ein neues erhalten und siehe da es hat auf Anhieb funktioniert.

    Die ersten Testdaten sind schon in der Datenbank und in Grafana zu sehen:
    https://screenshots.firefox.com/syXSowx1I2Y0vI4f/192.168.10.102

    Vielen Dank nochmal für Deine Unterstützung und für das wunderschöne Dashboard mit Grafana. Ich würde dann noch einen eigenen Blogartikel schreiben und veröffentlichen. Darf ich hierzu Deine beiden Grafana JSON Files über Github zum Download zur Verfügung stellen?

    Beste Grüße , Joachim

  5. Hallo Joachim
    Ohh, das hätte ich nicht gedacht das dass board so schnell über den Jordan geht.
    Klar kannst du meine Grafana Json Files veröffentlichen. Open Source for the world.

    Viel Spaß beim Strom anschauen :)
    Grüße Alexander

  6. Hi Alexander,
    kann man den PI auch als reinen Meßkasten z.b. für Veranstlungen nutzen indem ich noch an den PI ein Touchbildschirm anschließe und die werte direkt an dem Meßkasten ablesen? Wenn ja was muss man noch zusetzlich installieren?

  7. Ja das ist möglich.
    Hab ich selber noch nicht gemacht, da er im Verteiler Kasten sitzt.
    Aber man kann ein kleines Display anschließen und dann lokale den Webbrowser starten und auf das lokale Grafana zugreifen.
    Wie gut man dann da die Graphen erkennen kann ist halt eine andere Sache :)

    Ich würde da lieber einen Stromzähler nehmen wo man den Tages Stand zurücksetzen kann. Die haben auch ein Display und da ist schon alles mit dabei. Klar hat man dann keine so schöne Übersicht, aber das würde zum berechnen des Stromverbrauchs auch reichen.

    Grüße

  8. Hallo Alexander,
    gibt‘s das Projekt noch? Überlege, es auch nachzubauen, weil es am Markt nichts Fertiges für meine Zwecke gibt.
    VG, Hermann

  9. Hallo Schöberl,
    ich hab mittlerweile alles umgestellt auf homeassistent das sammelt die daten genauso gut ein und man kann dann auch darauf reagieren.
    Eventuell schreib ich da mal eine anleitung

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*