Natürlich könnt ich 1x täglich den Wert notieren, aber dazu bin ich zu faul und außerdem würd ich öfter vergessen. Also werde ich meinen SDM630 Drehstromzähler per Modbus auslesen.
Modbus? Hä? Was isn das? Kannte ich vorher auch nicht..
kurz Wikipedia rezitiert: Das Modbus-Protokoll ist ein Kommunikationsprotokoll, das auf einer Client/Server-Architektur basiert. Es wurde 1979 von Gould-Modicon für die Kommunikation mit seinen speicherprogrammierbare Steuerungen ins Leben gerufen. In der Industrie hat sich der Modbus zu einem De-facto-Standard entwickelt, da es sich um ein offenes Protokoll handelt.
Aha na dann.
Zu meinem Glück können die NIBE S1255 Wärmepumpe und der SDM630 Drehstromzähler per Modbus angesteuert werden. Ich werd hier aber nur auf den SDM360 eingehen.
Es gibt einen ganzen Haufen fertiger Geräte, Steuerungen und Modbus Konverter, meist ziemlich teuer und eher industrielastig. Ich hab mich für einen Raspberry Pi entschieden und für einen RS485 USB Dongle. Das ist mehr oder Weniger eine Minimalbesetzung und erfordert zwar a Bissl Spielerei, aber schadet ja ned, wenn ich auch was dazulerne. Also ich habe verwendet:
Das Ganze ist recht schnell zusammengemankelt, 3 Drähte in den SDM630 === USB Dongle. Angesteckt. fertig. Das ist mein huschpfusch Versuchsaufbau.
Das SDM630 stromtechnisch anhängen, zum Testen hab ich nur L1 angeschlossen, hat auch funktioniert.
Um die RS485 Settings einzustellen, wie folgt vorgehen (ich hab 19200baud, no Parity, 1 Stoppbit genommen):
E lang drücken
[Passwort] eingeben
E lang drücken
Set Addr 001
pfeil runter
baud 19200
pfeil runter
parity NONE
pfeil runter
Stop 1
pfeil runter
mit U/I raus aus dem Menü
Der RS485 Adapter ist eigentlich Plug&Play fähig, allerdings muß ma rausfinden, als welches Gerät der Raspi den erkennt. Am Besten nach dem Anstecken in der Console eintippen:
dmesg
ergibt Ausgabe in etwa
[ 2901.376778] usb 4-2: new full-speed USB device number 4 using ohci-pci
[ 2901.572992] usb 4-2: New USB device found, idVendor=10c4, idProduct=ea60, bcdDevice= 1.00
[ 2901.573003] usb 4-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 2901.573009] usb 4-2: Product: CP2102 USB to UART Bridge Controller
[ 2901.573015] usb 4-2: Manufacturer: Silicon Labs
[ 2901.573020] usb 4-2: SerialNumber: 0001
[ 2901.696199] usbcore: registered new interface driver usbserial_generic
[ 2901.697910] usbserial: USB Serial support registered for generic
[ 2901.719590] usbcore: registered new interface driver cp210x
[ 2901.719622] usbserial: USB Serial support registered for cp210x
[ 2901.719691] cp210x 4-2:1.0: cp210x converter detected
[ 2901.730477] usb 4-2: cp210x converter now attached to ttyUSB0
Also wiss ma, daß das Device /dev/ttyUSB0 heißt.
Nach ziemlich lang andauernder Suche - die Meisten nehmen hier ein PERL script - hab ich dann doch noch was gefunden: modpoll
Das ist ein kleines tool, mit dem ma Modbus Geräte aus der BASH ansteuern kann. Super, nehm ich. Gibts übrigens für Windows und Linux.
BASH ist schreibt sich ähnlich wie DASH, das Waschmittel, ist aber was Anderes. Als Abkürzung für Bourne-again shell ists eine Mensch-Maschine-Schnittstelle mit der man dem Computer sagen kann, was er tun soll. Die BASH ist auf allen aktuellen UNIX oder Linux Computern - u.a. Raspberry Pi - mit dabei.
Wenn Ihnen die Schlagworte VI, Shellscript und Verzeichnistiefe etwas sagen, freut es mich, wenn sie meine kleine Anleitung weiterlesen.
Wenn nicht, packen Sie die Kompoenten wieder in die Schachteln ein, schenken sie dem Nachbarsbub und kaufen Sie sich einen Hamster.
(übrigens: das war eine IF-Abfrage in Textform...)
Modpoll einrichten geht ganz gschwind in 2 Schritten:
1. Schritt
Das Ganze kommt praktisch per Download als modpoll.tgz, muß ma nur in ein Verzeichnis entpacken.
2. Schritt
entweder vorm Aufruf oder ins Profil eintragen, damit beim Start geladen wird:
export PATH=/opt/modpoll/arm-linux-gnueabihf :$PATH
Verzeichnis, in der die modpoll binaries liegen
Je nach Architektur das jeweilige Unterverzeichnis angeben, in meinem Fall halt ARM für den Raspberry Pi
export blabla ausführen zum Testen und schon gehts los:
mit modpoll -h bekommt ma die Hilfe angezeigt und wenn das funkt könnt ma gleich amal die bisher verbrauchte Energie auslesen:
modpoll -1 -b 19200 -s 1 -p none -m rtu -a 1 -r 343 -c 1 -f -t 3:float /dev/ttyUSB0
es kommt eine ganze Litanei zurück, aber unter Anderem die gewünschte Nutzinfo - Energie in kWh:
-- Polling slave...
[343]: 129.871994
wenn ma nur die Zahl ausgegeben haben will, muss ma a zweite Zeile hinten nachschießen
Etot=$(modpoll -1 -b 19200 -s 1 -p none -m rtu -a 1 -r 343 -c 1 -f -t 3:float /dev/ttyUSB0 | tail -1)
Etot=$(echo $Etot | egrep -o '[0-9]{1,8}\.[0-9]{3}'); echo $Etot
was wird konkret da angestellt?
1. Zeile: vom modpoll Befehl wird mit tail -1 nur die letzte Zeile verwendet und in die Variable Etot geschrieben
2. Zeile: von der Ausgabe wird mittlels regular expression '[0-9]{1,8}\.[0-9]{3}' nur der Zahlenwert in die variable Etot geschrieben.
raus kommt dann nur: 129.871
So und derart kann ma jetzt alle möglichen Werte ausn SDM630 auslesen, per BASH aufbereiten und weiterverarbeiten.
Ich schick ma den Wert der verbrauchten Energie momentan 1x täglich per mail, irgendwann wirds amal in eine Influx DB geschossen.
für die physikalischen und elektrischen Nacherbatzln, Energie hat als Einheit Kilowattstunden und ist das Produkt aus Leistung mal Zeit.
Paxisbeispiel: 10Stk 100W Glühbirnen leuchten eine Stunde lang => 10*100W * 1 Std = 1kWh
angepasstes aktuelles Praxisbeispiel: 100Stk 10W LED Lampen leuchten eine Stunde lang => 100*10W * 1 Std = 1kWh
is eh watscheneinfach....