ich dachte ich kenne mich jetzt ein wenig aus, aber scheinbar doch nicht

Ich lese aus Wechselrichter per Modbus Register aus.
Als ersten Versuch habe ich "minimalmodbus" verwendet. Jedes Register wurde einzeln abgefragt.
Es hat funktioniert, aber ich hatte ständig Verbindungsproblem.
Also stieg ich auf pymodbus um. Verbindungsprobleme sind Vergangenheit, aber er liest nicht alle Register.
Was mache ich, ich binde den Client so ein
Code: Alles auswählen
client_wr_1 = ModbusSerialClient(
port="/dev/ttyUSB0",
startbit=1,
databits=8,
parity="N",
stopbits=2,
errorcheck="crc",
baudrate=9600,
method="RTU",
timeout=3,
)
Code: Alles auswählen
spf_register = {
0: "Status",
1: "Vpv1",
2: "Vpv2",
3: "Ppv1H",
4: "Ppv1L",
5: "Ppv2H",
6: "Ppv2L",
7: "Buck1Curr",
8: "Buck2Curr",
9: "OP_WattH", # Output power
10: "OP_WattL", # Output power
11: "OP_VAH", # Output apparent power
12: "OP_VAL", # Output apparent power
.
.
.
67: "Eac_dischrtotalL",
68: "Acchrcurr", # kein Eintrag
69: "AC_dischrwattH", # AC discharge apparent power 1 oder 65535
70: "AC_dischrwattL", # AC discharge apparent power
71: "AC_dischrvaH", # AC discharge apparent power 1 oder 65535
72: "AC_dischrvaL", # AC discharge apparent power
73: "Bat_dischrwattH", # kein Eintrag
74: "Bat_dischrwattL", # kein Eintrag
75: "Bat_dischrvaH", # kein Eintrag
76: "Bat_dischrvaL", # kein Eintrag
77: "Bat_wattH", # Leistungsfluss Batt
78: "Bat_wattL", # Leistungsfluss Batt
79: "test",
80: "Batovercharge",
81: "Mpptfanspeed",
82: "Invfanspeed",
}
Eine weiter Liste enthält die Faktoren mit dem ich diese Werte multipliziere (laut Modbustabelle)
Code: Alles auswählen
spf_register_multipli = {
0: 1, # geprüft
1: 0.1,
2: 0.1,
3: 0.01, # geprüft
4: 0.01, # geprüft
5: 0.01, # geprüft
6: 0.01, #
.
.
.
73: 0.1,
74: 0.1,
75: 0.1,
76: 0.1,
77: 0.1, # geprüft
78: 0.1, # geprüft
79: 0.1,
80: 0.1,
81: 0.1,
82: 0.1,
}
Von 0 bis len(spf_register_multipli) Liste ist ja egal, da ja beide gleich lang sind.
So wie ich es sehe, bleibt mein Auslesevorgng bei ca. 70 hängen. 125 sollten doch möglich sein (laut modbus)
Code: Alles auswählen
def register_complett(spf_register, spf_register_multipli):
client_wr_1.connect()
row_wr1 = client_wr_1.read_input_registers([b]0, len(spf_register_multipli)[/b])
client_wr_1.close()
try:
for spf_register_nr in spf_register:
register_value_1 = float(row_wr1.registers[spf_register_nr] * spf_register_multipli[spf_register_nr])
json_body = [
{
"measurement": spf_register[spf_register_nr],
"tags": {
"user": user
},
"fields": {
spf_register[spf_register_nr] : register_value_1
}
}
]
try:
influx_client_1.write_points(json_body)
except Exception as db_error:
print('Influx_1_c write unsuccessfully')
except:
print('WR1_c Register n.i.O.')
Gruß Ralf