Benutzer-Werkzeuge

Webseiten-Werkzeuge


hardware:channels:meters:power:dzg_dvh4013_modbus

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 bkeannt.
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 (statisch)e Bibliothek libmodbus gelinkt. mbrtu benötigt mindestens die Version 3.1.3 von libmodbus. Die im Dezember 2018 in Debian stable und dem darauf basierenden Raspbian enthaltene Version 3.0.6 ist zu alt für mbrtu. Es gibt ein Source-Paket einer neueren libmodbus in Debian unstable; ein Backport dieser Library könnte vermutlich zum gewünschten Ergebnis führen.

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.

BASH-Script, direkt

Das Beispiel loggt den Total-Zählerstand (und nur den) direkt über die VZ-Middleware.

#!/bin/bash
#
# log a register (electric energie) of Eastron meter to Volkszaehler.org
#
# example conjob:
# * * * * *	root	/usr/local/bin/dvh4013_mbrtu.sh >> /var/log/mbrtu.log 2>> /var/log/mbrtu.log
#
 
# PATH for cronjob
PATH=/usr/local/bin:$PATH
 
# config Modbus
TTY="/dev/ttyUSB0"
BAUD=9600
PARITY=E
STOPBITS=2
ADDR=0x47
REG=0x4000
 
# config VZ
HOST=localhost
UUID=6836dd20-00d5-11e0-bab1-856ed5f959ae
 
# read Modbus
METER="$($HOME/mbrtu/mbrtu/mbrtu -d$TTY -b$BAUD -p$PARITY -s$STOPBITS -Q -P -a$ADDR -f3 -tint32 -n2 -r$REG | cut -d\  -f3)"
 
if [ -z "$METER" ]; then
    echo "no data revcieved on modbus"
else
    echo "$METER"
 
    # 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=${METER}"
    wget -O - -q "http://$HOST/middleware.php/data/$UUID.json?operation=add&ts=$TS&value=${METER}"
    printf "\n"
fi

GoSDM630

Eine schönere Methode, die Modbus-Kommunikation zu erledigen, bietet das Tool GoSDM630.

hardware/channels/meters/power/dzg_dvh4013_modbus.txt · Zuletzt geändert: 2019/01/13 17:08 von zugschlus