Hallo,
Vielleicht hilft Euch dies: Ich kämpfe auch gerade mit dem B+G Tech DRT428M (bzw. ich DRT428M-3), das Auslesen einiger Register auf dem Raspberry Pi klappt korrekt (int und float ). Mit iobroker kenne ich mich aber nicht aus.
USB Adapter (QinHeng Electronics CH340 serial converter) funktioniert problemlos
- unter MS Windows 10 am PC mit der B+G Herstellersoftware (wie oben schon verlinkt/beschrieben)
- Auf dem Paspberry Pi 4 B am USB Port mit modbus rtu über python minimalmodbus.
Codebeispiel unten.
Ich musste aber in der Initialisierung die Timings/Konfiguration anpassen, damit das stabil läuft. Aktuell so:
#!/usr/bin/env python3
# see https://minimalmodbus.readthedocs.io/en/stable/apiminimalmodbus.html#minimalmodbus.MODE_RTU
import serial
import minimalmodbus
instrument = minimalmodbus.Instrument(port='/dev/ttyUSB0', slaveaddress=1, mode=minimalmodbus.MODE_RTU, close_port_after_each_call=True, debug=False)
instrument.serial.baudrate = 9600 # Baud
instrument.serial.parity = serial.PARITY_EVEN
instrument.serial.bytesize = 8
instrument.serial.stopbits = 1
instrument.clear_buffers_before_each_transaction = True # False
instrument.serial.timeout = 0.30 # 0.05 seconds is too fast
try:
## Read value
print('--- read values: ---')
print('serial number: ', instrument.read_register(registeraddress=int(0x0000), number_of_decimals=0))
print('meter ID: ', instrument.read_register(registeraddress=int(0x0002), number_of_decimals=0))
print('baud rate [bps] ', instrument.read_register(registeraddress=int(0x0003), number_of_decimals=0))
print('CT Rate: ', instrument.read_register(registeraddress=int(0x0008), number_of_decimals=0))
print('Combined Code: ', instrument.read_register(registeraddress=int(0x000B), number_of_decimals=0))
print('Cycletime: [s] ', instrument.read_register(registeraddress=int(0x000D), number_of_decimals=0))
print('SW version: ', instrument.read_float( registeraddress=int(0x0004), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) )
print('HW version: ', instrument.read_float( registeraddress=int(0x0006), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) )
print('L1 Voltage [V] ', instrument.read_float( registeraddress=int(0x000E), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) )
print('L2 Voltage [V] ', instrument.read_float( registeraddress=int(0x0010), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) )
print('L3 Voltage [V] ', instrument.read_float( registeraddress=int(0x0012), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) )
print('grid frequency [Hz] ', instrument.read_float( registeraddress=int(0x0014), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) )
print('L1 Current [A] ', instrument.read_float( registeraddress=int(0x0016), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) )
print('L2 Current [A] ', instrument.read_float( registeraddress=int(0x0018), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) )
print('L3 Current [A] ', instrument.read_float( registeraddress=int(0x001A), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) )
print('TOTAL Active Power[kW] ', instrument.read_float( registeraddress=int(0x001C), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) )
print(' L1 Active Power [kW] ', instrument.read_float( registeraddress=int(0x001E), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) )
print(' L2 Active Power [kW] ', instrument.read_float( registeraddress=int(0x0020), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) )
print(' L3 Active Power [kW] ', instrument.read_float( registeraddress=int(0x0022), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) )
print('TOTAL Active Energy [kWh]', instrument.read_float( registeraddress=int(0x0100), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) )
print(' L1 Total Active Energy[kWh]', instrument.read_float( registeraddress=int(0x0102), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) )
print(' L2 Total Active Energy[kWh]', instrument.read_float( registeraddress=int(0x0104), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) )
print(' L3 Total Active Energy[kWh]', instrument.read_float( registeraddress=int(0x0106), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) )
except IOError as e:
print('ERROR: Failed to read from instrument:\n',e)
instrument.serial.close()
Ausgabe mit korrekten Werten:
serial number: 0
meter ID: 1
baud rate [bps] 9600
CT Rate: 0
Combined Code: 9
Cycletime: [s ] 2
SW version: 1.0199999809265137
HW version: 1.0
L1 Voltage [V] 226.3000030517578
L2 Voltage [V] 225.60000610351562
L3 Voltage [V] 227.8000030517578
grid frequency [Hz] 49.9900016784668
L1 Current [A] 0.8299999833106995
L2 Current [A] 8.329999923706055
L3 Current [A] 0.4099999964237213
TOTAL Active Power[kW] 1.972000002861023
L1 Active Power [kW] 0.0860000029206276
L2 Active Power [kW] 1.8480000495910645
L3 Active Power [kW] 0.039000000804662704
TOTAL Active Energy [kWh] 42.720001220703125
L1 Total Active Energy[kWh] 9.989999771118164
L2 Total Active Energy[kWh] 14.619999885559082
L3 Total Active Energy[kWh] 18.110000610351562