Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
Eastron SDM630 Modbus
Beim „SDM630 Modbus“ von Eastron (Vertrieb durch B+G E-tech) handelt sich um einen billigen 3-Phasenzähler Zähler, der, wie der Name schon vermuten lässt, sich per RS485 und Modbusprotokoll auslesen lässt.
Billig meint hier auch, dass man vorsichtig mit dem Festziehen der Stromkabel sein muss (nach „fest“ kommt „kaputt“).
Der Zähler misst ziemlich viele Werte, wenn er mit Neutralleiter angeschlossen ist. Die Modbus-Registerübersicht kann man auf der Seite des deutschen Vertriebs herunterladen.
Hardware
Als USB-RS485 Konverter genügt einen Digitus DA-70157.
Diesen mit 860Ω Pull-Down und Pull-Up versehen. Außerdem sind beide Busenden mit 120Ω zu terminieren.
Kommunikation
Der Zähler soll das Auslesen laut Doku von angeblich nur 40 Register pro Abfrage unterstützen. Getestete Exemplare unterstützt die Abfrage von 50 Werten pro Nachricht.
Auslesen mit mbrtu
Für die folgenden Skripte benötigt man das kleine Programm mbrtu, das auf libmodbus basiert. Es ist gegen die (statisch)e Bibliothek libmodbus gelinkt. Achtung: Es wird die momentan noch nicht veröffentlichte Version libmodbus 3.1.3 benötigt. Diese kann man einfach von github herunterladen werden.
Installation der Software
libmodbus
cd ~ git clone git://github.com/stephane/libmodbus cd libmodbus ./autogen.sh ./configure --enable-static make sudo make install sudo cp ./src/.libs/libmodbus.a /usr/local/lib/
mbrtu
cd ~ git clone https://github.com/gitaeuber/mbrtu cd mbrtu make sudo make install
BASH-Script, direkt
Im Folgenden läuft die Verbindung mit 2400bd 8N1.
Das Beispiel loggt den Total-Zählerstand (und nur den) direkt über die VZ-Middleware.
- base bash
#!/bin/bash # # log a register (electric energie) of Eastron meter to Volkszaehler.org # # example conjob: # * * * * * root /usr/local/bin/sdm_mbrtu.sh # # PATH for cronjob PATH=/usr/local/bin:$PATH # config Modbus TTY="/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A50285BI-if00-port0" BAUD=2400 ADDR=1 REG=342 # config VZ HOST=localhost UUID=6836dd20-00d5-11e0-bab1-856ed5f959ae # read Modbus DATA=( $(mbrtu -d$TTY -b$BAUD -pn -s1 -a$ADDR -fi -tf32_dcba -n2 -r$REG) ) if [ -z ${DATA[2]} ] then echo "no data revcieved on modbus" else echo "${DATA[2]}" # Timestamp TS=$(date +%s) TS=$(($TS*1000)) # write VZ echo wget -O - -q "http://$HOST/middleware.php/data/$UUID.json?operation=add&ts=$TS&value=${DATA[2]#DATA=}" wget -O - -q "http://$HOST/middleware.php/data/$UUID.json?operation=add&ts=$TS&value=${DATA[2]#DATA=}" printf "\n" fi
BASH-Script, gepuffert
Im Folgenden läuft die Verbindung mit 9600bd 8E1.
Im Beispiel werden die Daten monatlich getrennt in eine Datei (mit log-powermeter.sh) geloggt.
Das Logging geschieht minütlich per cronjob:
/etc/cron.d/log_powermeter # # log power meter # * * * * * root /usr/local/bin/log_powermeter.sh
Per Cronjob wird dann auch der vergangene Monat komprimiert und nächtlich der letzte Tag in den Volkszähler importiert (vz-import_power.sh):
/etc/cron.d/import_vz # # remember to escape "%" # # import data into volkszaehler # 15 1 * * * root /bin/fgrep "$(date +\%F -d yesterday) " /srv/power/$(date +\%Y-\%m -d yesterday).log | /usr/local/bin/vz-import_sdm630.sh 2>/dev/null 6 0 2 * * root nice -n 9 xz -9 /srv/power/$(date +\%Y-\%m -d 2\ days\ ago).log