Inhaltsverzeichnis
DZG DVH 4013 Modbus
Der DZG DVH 4013 ist ein 3-Phasen-Zähler, der auf einer RS485-Schnittstelle über das Modbus-Protokoll angesprochen werden kann. Im Gegensatz zum eastron_sdm630_modbus arbeitet er saldierend, d.h. er bildet die Summe über alle 3 Phasen und je nach Ergebnis wird entweder die Bezugs- oder Lieferrichtung gezählt. Damit entspricht er, bei der Verwendung als Zweirichtungszähler, den deutschen Vorgaben.
Hardware
Der Zähler hat sich in ersten Tests im Jahr 2016 und 2017 als „Diva“ erwiesen. Es mussten mehrere USB-RS485-Adapter ausprobiert werden, bis es funktioniert hat. Dabei scheint es Unterschiede zwischen Linux und Windows zu geben; es gibt mindestens einen Adapter, der unter Windows prima funktioniert, unter Linux aber nicht. Andersherum lässt sich der Adapter, der bei der Installation des Autors dieses Textes unter Linux prima funktioniert, unter Windows partout nicht zur Mitarbeit überreden. Die ca 150 cm lange Leitung zwischen RS485-Adapter und dem Zähler bei der Installation des Autors ist weder terminiert noch mit Pullup/Pulldown-Widerständen versehen.
Leider hat der Autor dieses Textes bei den Tests mit dem Modbus-Zähler die Übersicht über die Quellen der RS485-Adapter verloren. Aktuell besteht der „Verdacht“, dass es sich bei dem funktionierenden Exemplar um dieses bei Aliexpress bezogene Produkt handelt, das sich am Raspberry Pi als „Bus 001 Device 006: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light“ zeigt.
Dieser optisch ähnliche MENGS-Adapter von Amazon hat im Test im Spätjahr 2016 unter Linux nicht funktioniert. Der Unterschied zum funktionerenden Adapter ist, dass der MENGS-Adapter nur zwei Anschlußklemmen hat; das funktionierende Exemplar hat derer drei (von denen aber nur zwei zu beschalten sind).
Als zuverlässiger USB-RS485 Konverter ist der Digitus DA-70157 bekannt. Als Pull-Down und Pull-Up 860Ω Widerstände verwenden. Die beide Busenden mit 120Ω terminieren.
Auslesen mit mbrtu
Für die folgenden Skripte benötigt man mbrtu, das auf libmodbus basiert. Es ist gegen die libmodbus gelinkt. mbrtu benötigt mindestens die Version 3.1.3 von libmodbus, die bei Debian-basierenden Distributionen erst ab „buster“ enthalten ist. Das Source-Paket aus Debian buster ist auf älteren Distributionen baubar.
Die seriellen Parameter sind 9600 8E2. Die Modbus-Adresse sind die letzten zwei Ziffern der Seriennummer plus eins, als Hex-Ziffern geschrieben. Zum Beispiel hat das Gerät des Autors die Seriennummer 2546 und die Modbus-Adresse 0x47 (-a 0x47 auf der mbrtu-Kommandozeile).
Installation der Software
Siehe die Wiki-Seite zum Eastron SDM 630.
Nennt apt show libmodbus-dev | grep Version eine Version 3.1.3 oder neuer, kann man apt install libmodbus-dev ausführen und ist fertig. Sonst muss eine manuelle Installation erfolgen, wie auf Eastron SDM 630 beschrieben. mbrtu muss man aktuell selbst bauen, da es (noch?) nicht für Debian paketiert ist.
Ein möglicher, erfolgreicher Test:
./mbrtu -d/dev/ttyUSB2 -b9600 -pE -s2 -Q -P -a0x47 -f3 -tint32 -n2 -r0x4000 71 16384 4452560
Der Zählerstand des Zählwerks 1.8.0 ist in diesem Fall 4452,560 kWh.
Einbindung über einen vzlogger exec-Kanal
Das folgende Script exec-modbus
kann über einen vzlogger exec-Kanal
angebunden werden
#!/bin/bash set -e set -u usage() { cat <<EOF $0 [options] register ... -t|--tty -b|--baudrate -p|--parity -s|--stopbits -a|--addr EOF } TEMP="$(getopt -n installremote \ -l tty:,baudrate:,parity:,stopbits:,addr: -- \ +t:b:p:s:a: "$@")" eval set -- "${TEMP}" MBRTU="mbrtu" TTY="" BAUDRATE="" PARITY="" STOPBITS="" ADDR="" while test "$1" != "--"; do case $1 in -t|--tty) shift TTY="$1" ;; -b|--baudrate) shift BAUDRATE="$1" ;; -p|--parity) shift PARITY="$1" ;; -s|--stopbits) shift STOPBITS="$1" ;; -a|--addr) shift ADDR="$1" ;; esac shift done shift checkparameter() { PARMNAME="${1:-}" CONTENT="${2:-}" if [ -z "${CONTENT}" ]; then printf "%s must not be empty\\n" "${PARMNAME}" exit 1 fi } checkparameter tty "${TTY}" checkparameter baudrate "${BAUDRATE}" checkparameter parity "${PARITY}" checkparameter stopbits "${STOPBITS}" checkparameter addr "${ADDR}" for reg in "$@"; do NOW="$(date +%s)" METER="$($MBRTU -d"${TTY}" -b"${BAUDRATE}" -p"${PARITY}" -s"${STOPBITS}" -Q -P -a"${ADDR}" -f3 -tint32 -n2 -r"${reg}" | cut -d\ -f3)" if [ -z "${METER}" ]; then printf >&2 "no data received on modbus\\n" else printf "%d: %s = %d\\n" "${NOW}" "${reg}" "${METER:-0}" fi done # end of file
vzlogger exec-Kanal
{ "enabled": true, "allowskip": true, "protocol": "exec", "command": "/path/to/exec-modbus --tty /dev/ttyUSBx --baudrate 9600 --parity E --stopbits 2 --addr 0x47 0x4001 0x0000 0x0002 0x0004 0x0006 0x0008", "format": "$t: $i = $v", "interval": 30, "channels": [ { "uuid": "", "identifier": "0x4001", "middleware": "" } ] }
GoSDM630
Eine schönere Methode, die Modbus-Kommunikation zu erledigen, bietet das Tool GoSDM630.