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.
- Raspberry Pi 3 B oder Raspberry Pi® 3 Model B+ 1GB ~ 40€
- Erweiterungs-Platine RB-RS485 ~ 9€
- Raspberry Pi® Gehäuse Licht-Grau RPI-BC 107,6 ~12 €
- Mean Well Hutschienen-Netzteil (DIN-Rail) DR-15-5 ~12€
- ModBus Stromzähler 3 Phasen ~ 125€
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
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
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
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
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
Gerne.
Wenn du fragen hast kannst dich gerne Melden.
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
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
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?
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
Hallo Alexander,
gibt‘s das Projekt noch? Überlege, es auch nachzubauen, weil es am Markt nichts Fertiges für meine Zwecke gibt.
VG, Hermann
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