Skip to content

Commit dfcc91d

Browse files
authored
improve handling of a com.victronenergy.inverter (#167)
Added some more values bases on experiments and https://github.com/victronenergy/venus/wiki/dbus#inverter In the "Advanced" Section of the VRM portal, the inverter seems to show up correctly now (power, voltage, current and even state changes correctly).
1 parent 75166da commit dfcc91d

File tree

2 files changed

+25
-8
lines changed

2 files changed

+25
-8
lines changed

dbus-opendtu.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ def _v(_p, value: float) -> str:
101101
"/Ac/L3/Energy/Forward": {"initial": None, "textformat": _kwh},
102102
"/Ac/Out/L1/I": {"initial": None, "textformat": _a},
103103
"/Ac/Out/L1/V": {"initial": None, "textformat": _v},
104+
"/Ac/Out/L1/P": {"initial": None, "textformat": _w},
104105
"/Dc/0/Voltage": {"initial": None, "textformat": _v},
105106
}
106107

@@ -113,7 +114,7 @@ def _v(_p, value: float) -> str:
113114
actual_inverter=0,
114115
)
115116

116-
if number_of_inverters == 0:
117+
if number_of_inverters == 0:
117118
number_of_inverters = service.get_number_of_inverters()
118119

119120
if number_of_inverters > 1:

dbus_service.py

+23-7
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,8 @@ def __init__(
143143
onchangecallback=self._handlechangedvalue,
144144
)
145145

146-
# add _sign_of_life 'timer' to get feedback in log every 5minutes
147146
gobject.timeout_add(self._get_sign_of_life_interval() * 60 * 1000, self._sign_of_life)
147+
gobject.timeout_add(self._get_polling_interval(), self._update)
148148

149149
@staticmethod
150150
def get_ac_inverter_state(current):
@@ -287,8 +287,6 @@ def _get_serial(self, pvinverternumber):
287287
elif self.dtuvariant == constants.DTUVARIANT_TEMPLATE:
288288
serial = self.serial
289289

290-
gobject.timeout_add(self._get_polling_interval(), self._update)
291-
292290
return serial
293291

294292
def _get_name(self):
@@ -534,6 +532,7 @@ def _sign_of_life(self):
534532
return True
535533

536534
def _update(self):
535+
logging.debug("_update")
537536
successful = False
538537
try:
539538
# update data from DTU once per _update call:
@@ -603,13 +602,13 @@ def get_values_for_inverter(self):
603602
# OpenDTU v24.2.12 breaking API changes 2024-02-19
604603
if "AC" in meter_data["inverters"][self.pvinverternumber]:
605604
root_meter_data = meter_data["inverters"][self.pvinverternumber]
606-
firmware_v24_2_12_or_newer=True
605+
firmware_v24_2_12_or_newer = True
607606
else:
608607
inverter_serial = meter_data["inverters"][self.pvinverternumber]["serial"]
609608
logging.info(f"Inverter #{self.pvinverternumber} Serial: {inverter_serial}")
610609
root_meter_data = self.fetch_opendtu_inverter_data(inverter_serial)["inverters"][0]
611610
logging.debug(f"{root_meter_data}")
612-
firmware_v24_2_12_or_newer=False
611+
firmware_v24_2_12_or_newer = False
613612

614613
producing = is_true(root_meter_data["producing"])
615614
power = (root_meter_data["AC"]["0"]["Power"]["v"]
@@ -639,23 +638,40 @@ def get_values_for_inverter(self):
639638
def set_dbus_values(self):
640639
'''read data and set dbus values'''
641640
(power, pvyield, current, voltage, dc_voltage) = self.get_values_for_inverter()
641+
state = self.get_ac_inverter_state(current)
642642

643643
# This will be refactored later in classes
644644
if self._servicename == "com.victronenergy.inverter":
645+
# see https://github.com/victronenergy/venus/wiki/dbus#inverter
645646
self._dbusservice["/Ac/Out/L1/V"] = voltage
646647
self._dbusservice["/Ac/Out/L1/I"] = current
648+
self._dbusservice["/Ac/Out/L1/P"] = power
647649
self._dbusservice["/Dc/0/Voltage"] = dc_voltage
648-
self._dbusservice["/State"] = self.get_ac_inverter_state(current)
650+
self._dbusservice["/Ac/Power"] = power
651+
652+
self._dbusservice["/Ac/Energy/Forward"] = pvyield
653+
self._dbusservice["/State"] = state
654+
self._dbusservice["/Mode"] = 2 # Switch position: 2=Inverter on; 4=Off; 5=Low Power/ECO
655+
656+
self._dbusservice["/Ac/L1/Current"] = current
657+
self._dbusservice["/Ac/L1/Energy/Forward"] = pvyield
658+
self._dbusservice["/Ac/L1/Power"] = power
659+
self._dbusservice["/Ac/L1/Voltage"] = voltage
649660

650661
logging.debug(f"Inverter #{self.pvinverternumber} Voltage (/Ac/Out/L1/V): {voltage}")
651662
logging.debug(f"Inverter #{self.pvinverternumber} Current (/Ac/Out/L1/I): {current}")
663+
664+
logging.debug(f"Inverter #{self.pvinverternumber} Current (/Dc/0/Voltage): {dc_voltage}")
665+
logging.debug(f"Inverter #{self.pvinverternumber} Voltage (/Ac/Power): {power}")
666+
logging.debug(f"Inverter #{self.pvinverternumber} Current (/Ac/Energy/Forward): {pvyield}")
667+
logging.debug(f"Inverter #{self.pvinverternumber} Current (/State): {state}")
652668
logging.debug("---")
653669
else:
654670
# three-phase inverter: split total power equally over all three phases
655671
if ("3P" == self.pvinverterphase):
656672
powerthird = power/3
657673

658-
#Single Phase Voltage = (3-Phase Voltage) / (sqrt(3))
674+
# Single Phase Voltage = (3-Phase Voltage) / (sqrt(3))
659675
# This formula assumes that the three-phase voltage is balanced and that
660676
# the phase angles are 120 degrees apart
661677
# sqrt(3) = 1.73205080757 <-- So we do not need to include Math Library

0 commit comments

Comments
 (0)