Do you prefer the English version of the page elektroda?
No, thank you Send me over there#!/usr/bin/python3
import sys
import time
# pip3 install pymodbus
from pymodbus.client.sync import ModbusTcpClient
# pip3 install influxdb (?)
from influxdb import InfluxDBClient
ModbusHost = "192.168.X.X"
ModbusPort = "502"
InfluxDBHost = "192.168.X.X"
InfluxDBPort = "8086"
InfluxDBLogin = "LoGiN"
InfluxDBPassword = "Pa$$W0rd"
InfluxDBDatabase = "database_name"
HMInverterCount = 2
def db_write(measurement_name, value):
json_body = [
{
"measurement": measurement_name,
"fields": {
"value": value
}
}
]
db_client.write_points(json_body)
def arr_of_word2string(array):
string = ''
for i in array:
a,b = i.to_bytes(2,'big')
string = string + chr(a) + chr(b)
return string
def unsigned2signed(unsigned_value):
signed_value = unsigned_value if unsigned_value < (1 << 16-1) else unsigned_value - (1 << 16)
return signed_value
def read_registers(inv_nr):
print("inverter number: ", inv_nr)
offset_base = 0x1000
offset_step = 0x28
if modbus_client.connect():
rr = modbus_client.read_holding_registers(offset_base + offset_step*inv_nr, 20)
if rr.isError():
print("problem reading registers")
sys.exit(1)
else:
print("problem connecting to modbus")
sys.exit(1)
modbus_client.close()
if rr:
regs = rr.registers
PVVoltage = regs[4]/10
PVCurrent = regs[5]/100
GridVoltage = regs[6]/10
GridFreq = regs[7]/100
PVPower = regs[8]/10
PVTodayProd = regs[9]
PVTotalProd1 = regs[10]*10
PVTotalProd2 = regs[11]
PVTotalProd = PVTotalProd1 + PVTotalProd2
Temp = unsigned2signed(regs[12])/10
OperatingStatus = regs[13]
AlarmCode = regs[14]
AlarmCount = regs[15]
LinkStatus = regs[16]
print("PVVoltage: ", PVVoltage , "V")
print("PVCurrent: ", PVCurrent , "A")
print("PVPower: ", PVPower, "W")
print("PVTodayProd: ", PVTodayProd, "Wh")
print("PVTotalProd: ", PVTotalProd, "Wh")
print("GridVoltage: ", GridVoltage, "V")
print("GridFreq: ", GridFreq, "Hz")
print("Temp: ", Temp, "oC")
print("OperatingStatus: ", OperatingStatus)
print("AlarmCode: ", AlarmCode)
print("AlarmCount: ", AlarmCount)
print("LinkStatus: ", LinkStatus)
data_end_time = int(time.time() * 1000)
measurement = "hoymiles_inverter_" + str(inv_nr)
data = []
data.append("{measurement} PVVoltage={PVVoltage},PVCurrent={PVCurrent},PVPower={PVPower},GridVoltage={GridVoltage},GridFreq={GridFreq},Temp={Temp},OperatingStatus={OperatingStatus} {timestamp}"
.format(measurement=measurement,
PVVoltage=PVVoltage,
PVCurrent=PVCurrent,
PVPower=PVPower,
GridVoltage=GridVoltage,
GridFreq=GridFreq,
Temp=Temp,
OperatingStatus=OperatingStatus,
timestamp=data_end_time))
db_client.write_points(data, time_precision='ms', batch_size=10000, protocol='line')
else:
print("got no meter regs")
print(time.strftime("%Y-%m-%d %H:%M:%S"))
modbus_client = ModbusTcpClient(host=ModbusHost, port=ModbusPort)
db_client = InfluxDBClient(host=InfluxDBHost, port=InfluxDBPort, username=InfluxDBLogin, password=InfluxDBPassword, database=InfluxDBDatabase)
for inverter_nr in range(HMInverterCount):
read_registers(inverter_nr)
time.sleep(0.2)
Arek1990 wrote:Jeśli ktoś ma Home Assistant to zapraszam:
https://github.com/ArekKubacki/Hoymiles-Plant-DTU-Pro
gogers1 wrote:Jak ktoś woli integrację z Home Assistant przez MQTT to właśnie wydałem do tego narzędzie https://github.com/wasilukm/hoymiles-mqtt
Quote:Sorry for the late reply. I had a meeting with our R&D engineers and DTU designing engineers yesterday. They will update a new firmware instead of making tools to repair the question. So the new firmware will put on the platform in September. And I will help you make the update once the firmware put on the platform. You don't need to run anything by yourself. Thank you for patient and all the reply.
Arek1990 wrote:Niestety addon nie chce się połączyć z DTU. Wyrzuca błędy połączenia. Jakieś rady? Dodatkowe pytanie o mqtt. Nie trzeba nigdzie podać danych?
telnet 192.168.88.129 10081
Arek1990 wrote:Niestety addon nie chce się połączyć z DTU. Wyrzuca błędy połączenia. Jakieś rady? Dodatkowe pytanie o mqtt. Nie trzeba nigdzie podać danych?
Quote:ERROR | 2022-10-15 08:09:56 | [pool-2-thread-1] hoymiles.Entrypoint (Entrypoint.java:33) - Uncaught exception: java.util.concurrent.TimeoutException: The source did not signal an event for 5 seconds and has been terminated.
java.lang.RuntimeException: java.util.concurrent.TimeoutException: The source did not signal an event for 5 seconds and has been terminated.
at io.reactivex.rxjava3.internal.util.ExceptionHelper.wrapOrThrow(ExceptionHelper.java:46) ~[app.jar:?]
at io.reactivex.rxjava3.internal.observers.BlockingBaseObserver.blockingGet(BlockingBaseObserver.java:81) ~[app.jar:?]
at io.reactivex.rxjava3.core.Observable.blockingFirst(Observable.java:5452) ~[app.jar:?]
at com.hoymiles.infrastructure.repository.DtuRepository.getAppInfo(DtuRepository.java:42) ~[app.jar:?]
at com.hoymiles.application.AppController.start(AppController.java:108) ~[app.jar:?]
at com.hoymiles.application.AppController$Proxy$_$$_WeldClientProxy.start(Unknown Source) ~[app.jar:?]
at com.hoymiles.infrastructure.App.run(App.java:84) ~[app.jar:?]
at com.hoymiles.Entrypoint.lambda$main$1(Entrypoint.java:31) ~[app.jar:?]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) ~[?:?]
at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[?:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[?:?]
at java.lang.Thread.run(Thread.java:829) ~[?:?]
Caused by: java.util.concurrent.TimeoutException: The source did not signal an event for 5 seconds and has been terminated.
at io.reactivex.rxjava3.internal.operators.observable.ObservableTimeoutTimed$TimeoutObserver.onTimeout(ObservableTimeoutTimed.java:134) ~[app.jar:?]
at io.reactivex.rxjava3.internal.operators.observable.ObservableTimeoutTimed$TimeoutTask.run(ObservableTimeoutTimed.java:165) ~[app.jar:?]
at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:65) ~[app.jar:?]
at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:56) ~[app.jar:?]
at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[?:?]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) ~[?:?]
... 3 more
Arek1990 wrote:A takiej strony jak pokazujesz nie ms u mnie. DTU z tego roku. Nie widziałem też opcji żeby coś takiego włączyć.
Quote:
Wchodzi z przeglądarki na adres DTU port 80 (np.: http://192.168.88.129)