ja, man kann es auslesen. hier ein bsp. in python, das ein csv-file schreibt.
Code: Alles auswählen
#!/usr/bin/env python3
import minimalmodbus
import serial
import json
import time
from datetime import datetime
from dataclasses import dataclass
import csv
@dataclass
class Register:
address: int
size: int
name: str
unit: str
desc: str
orig_name: str =""
factor: int = 1
signed: bool = False
myList = []
myList.append(Register(234,1,"Solarspannung1","V","Solarspannung1","Solar input voltage 1",100))
myList.append(Register(235,1,"Solarspannung2","V","Solarspannung2","Solar input voltage 2",100))
myList.append(Register(696,1,"Solarstrom1","A","Solarstrom1","Solar input current 1",10))
myList.append(Register(698,1,"Solarstrom2","A","Solarstrom2","Solar input current 2",10))
myList.append(Register(188,1,"Batteriespannung","V","Batteriespannung","Battery voltage",1000))
myList.append(Register(226,1,"Batteriekapazitaet","%","Batteriekapazitaet","Battery capacity",1000))
myList.append(Register(230,2,"Batteriestrom","A","Batteriestrom","Battery current"))
myList.append(Register(798,1,"Netzspannung_R","V","Netzspannung_R","AC input voltage R",100))
myList.append(Register(799,1,"Netzspannung_S","V","Netzspannung_S","AC input voltage S",100))
myList.append(Register(800,1,"Netzspannung_T","V","Netzspannung_T","AC input voltage R",100))
myList.append(Register(801,1,"Netzfrequenz","Hz","Netzfrequenz","AC input frequency",10))
myList.append(Register(614,1,"Netzstrom_R","V","Netzstrom_R","AC input current R",100))
myList.append(Register(616,1,"Netzstrom_S","V","Netzstrom_S","AC input current S",100))
myList.append(Register(618,1,"Netzstrom_T","V","Netzstrom_T","AC input current T",100))
myList.append(Register(216,1,"AC_Ausgangsspannung_R","V","AC_Ausgangsspannung_R","AC output voltage R",100))
myList.append(Register(247,1,"AC_Ausgangsspannung_S","V","AC_Ausgangsspannung_S","AC output voltage S",100))
myList.append(Register(248,1,"AC_Ausgangsspannung_T","V","AC_Ausgangsspannung_T","AC output voltage T",100))
myList.append(Register(219,1,"AC_Ausgangsfrequenz","Hz","AC_Ausgangsfrequenz","AC output frequency",10))
myList.append(Register(220,1,"AC_Ausgangsstrom_R","V","AC_Ausgangsstrom_R","AC output current R",100))
myList.append(Register(239,1,"AC_Ausgangsstrom_S","V","AC_Ausgangsstrom_S","AC output current S",100))
myList.append(Register(240,1,"AC_Ausgangsstrom_T","V","AC_Ausgangsstrom_T","AC output current T",100))
myList.append(Register(892,1,"Temperatur","C","Temperatur","Inner temperature",1000))
myList.append(Register(204,1,"Batterie_Temperatur","C","Batterie_Temperatur","External battery temperature",1000))
myList.append(Register(228,2,"Solarleistung1","W","Solarleistung1", "Solar input power 1"))
myList.append(Register(232,2,"Solarleistung2","W","Solarleistung2","Solar input power 2"))
myList.append(Register(1196,2,"Batterieleistung","W","Batterieleistung","Battery power"))
myList.append(Register(211,2,"AC_Eingangsleistung_R","W","AC_Eingangsleistung_R","AC input active power R",1,True)) # note:
myList.append(Register(257,2,"AC_Eingangsleistung_S","W","AC_Eingangsleistung_S","AC input active power S",1,True)) #note:
myList.append(Register(258,2,"AC_Eingangsleistung_T","W","AC_Eingangsleistung_T","AC input active power T",1,True)) #note:
myList.append(Register(377,2,"AC_Eingangsleistung","W","AC_Eingangsleistung","AC input total active power",1,True)) #note:
myList.append(Register(217,2,"AC_Wirkleistung_R","W","AC_Wirkleistung_R","AC output active power R"))
myList.append(Register(241,2,"AC_Wirkleistung_S","W","AC_Wirkleistung_S","AC output active power S"))
myList.append(Register(243,2,"AC_Wirkleistung_T","W","AC_Wirkleistung_T","AC output active power T"))
myList.append(Register(245,2,"AC_Wirkleistung","W","AC_Wirkleistung","AC output active power T"))
myList.append(Register(781,2,"AC_Scheinleistung_R","VA","AC_Scheinleistung_R","AC output apperent power R"))
myList.append(Register(894,2,"AC_Scheinleistung_S","VA","AC_Scheinleistung_S","AC output apperent power S"))
myList.append(Register(1241,2,"AC_Scheinleistung_T","VA","AC_Scheinleistung_T","AC output apperent power T"))
#myList.append(Register(0,"AC_Scheinleistung","W","AC_Scheinleistung","AC output total apperent power")) # not available
myList.append(Register(864,1,"Ausgangslast","%","Ausgangslast","AC output power percentage"))
myList.append(Register(208,1,"Modus","","Arbeitsmodus","working mode",1000))
myList.append(Register(1457,1,"BatterieMaxLadestromSet","A","BatterieMaxLadestromSet","Battery maximum charge current",10))
myList.append(Register(1240,1,"BatterieMaxEntladestromSet","A","BatterieMaxEntladestromSet","Battery discharge max current in hybrid mode",10))
myList.append(Register(1460,1,"BatterieMaxLadestrom","A","BatterieMaxLadestrom","Battery maximum charge current",10))
def read_long(instrument,number,size):
count = 0
value=instrument.read_long(number,size)
while (value > 4270000000 and count < 10):
value=instrument.read_long(number,size)
count = count + 1
time.sleep(count*0.5)
if (value > 4270000000):
value=0
return value
def read_long_signed(instrument,number,size,signed):
count = 0
value=instrument.read_long(number,size,signed)
while (value > 4270000000 and count < 5):
value=instrument.read_long(number,size)
count = count + 1
time.sleep(count*0.5)
if (value > 4270000000):
value=0
return value
def read_data():
instrument = minimalmodbus.Instrument('/dev/ttyUSB0',2,minimalmodbus.MODE_RTU,False,True) # port name, slave address (in decimal)
instrument.serial.baudrate = 19200 # Baud
instrument.serial.bytesize = 8
instrument.serial.parity = serial.PARITY_ODD
#instrument.serial.stopbits = serial.STOPBITS_ONE
instrument.serial.timeout = 0.5 # seconds
instrument.mode = minimalmodbus.MODE_RTU
instrument.address = 2
instrument.debug = False
instrument.clear_buffers_before_each_transaction = True
def printData(reg):
if (reg.size == 1):
val=str(round(instrument.read_register(reg.address,3)*reg.factor,2))
print (reg.name, reg.unit,val)
if (reg.size == 2):
#val=str(round(instrument.read_long(reg.address,3,reg.signed)*reg.factor,2))
val=str(round(read_long_signed(instrument,reg.address,3,reg.signed)*reg.factor,2))
print (reg.name, reg.unit,val)
return val
header=[]
for element in myList:
header.append(element.name)
row=[]
for element in myList:
row.append(printData(element))
header.append("AC_Ausgang_Status")
header.append("Solar_Status1")
header.append("Solar_Status2")
header.append("Batteriestromrichtung")
header.append("WR_Stromrichtung")
header.append("Netzstromrichtung")
value_903 = ("6"+instrument.read_string(903,6))[0:7]
print(int(value_903))
digits = [int(x) for x in str(value_903)]
for x in range (1,7):
row.append(digits[x])
currentTimeString=datetime.now().strftime('%Y%m%d%H%M%S')
ret=instrument.write_string(453,currentTimeString[0:8]) #day
time.sleep(2)
energy_today = read_long(instrument,411,3)/1000
row.append(energy_today)
header.append("WattstundenGesamtHeute")
ret=instrument.write_string(457,currentTimeString[0:6]) #month
time.sleep(2)
energy_month = read_long(instrument,413,3)
row.append(energy_month)
header.append("WattstundenGesamtMonat")
ret=instrument.write_string(460,currentTimeString[0:4]) #year
time.sleep(2)
energy_year = read_long(instrument,415,3)
row.append(energy_year)
header.append("WattstundenGesamtJahr")
total_energy = read_long(instrument,407,3)
row.append(total_energy)
header.append("KiloWattstundenTotal")
v1 = instrument.read_string(275,7,3);
print("currentDateTime: ",v1)
row.append(v1[8:10])
row.append(v1[10:12])
row.append(v1[12:14])
header.append("Stunden")
header.append("Minuten")
header.append("Sekunden")
print("stunden",v1[8:10])
print("minuten",v1[10:12])
print("sekunden",v1[12:14])
ret=instrument.write_string(275,currentTimeString,7) # write current system time
print("error ? ",ret)
f = open('/home/pi/csv_file', 'w', )
writer = csv.writer(f, delimiter=';')
writer.writerow(header)
writer.writerow(row)
f.close()
instrument.serial.close()
while True:
try:
read_data()
break
except Exception:
print("Error")
print("ENDE")