|
6 | 6 | import inspect |
7 | 7 | import logging |
8 | 8 |
|
| 9 | +from awesomeversion import AwesomeVersion |
| 10 | +from awesomeversion.exceptions import ( |
| 11 | + AwesomeVersionCompareException, |
| 12 | + AwesomeVersionStrategyException, |
| 13 | +) |
9 | 14 | from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PORT |
10 | 15 | from homeassistant.core import HomeAssistant |
11 | 16 | from homeassistant.exceptions import HomeAssistantError |
|
28 | 33 | DOMAIN, |
29 | 34 | METER_REG_BASE, |
30 | 35 | PYMODBUS_REQUIRED_VERSION, |
| 36 | + STATUS_VENDOR4_VERSION, |
31 | 37 | ConfDefaultFlag, |
32 | 38 | ConfDefaultInt, |
33 | 39 | ConfDefaultStr, |
@@ -844,6 +850,7 @@ def __init__(self, device_id: int, hub: SolarEdgeModbusMultiHub) -> None: |
844 | 850 | self.site_limit_control = None |
845 | 851 | self._grid_status = None |
846 | 852 | self._last_update_timestamp = None |
| 853 | + self._use_status_vendor4 = False |
847 | 854 |
|
848 | 855 | async def init_device(self) -> None: |
849 | 856 | """Set up data about the device from modbus.""" |
@@ -1036,6 +1043,16 @@ async def init_device(self) -> None: |
1036 | 1043 | self.name = f"{self.hub.hub_id.capitalize()} I{self.inverter_unit_id}" |
1037 | 1044 | self.uid_base = f"{self.model}_{self.serial}" |
1038 | 1045 |
|
| 1046 | + try: |
| 1047 | + this_ver = AwesomeVersion(self.decoded_common["C_Version"]) |
| 1048 | + self._use_status_vendor4 = this_ver >= AwesomeVersion( |
| 1049 | + STATUS_VENDOR4_VERSION |
| 1050 | + ) |
| 1051 | + except (AwesomeVersionCompareException, AwesomeVersionStrategyException) as e: |
| 1052 | + _LOGGER.error( |
| 1053 | + f"Error checking inverter version: {e}. Please report this issue." |
| 1054 | + ) |
| 1055 | + |
1039 | 1056 | if self.decoded_mmppt is not None: |
1040 | 1057 | for unit_index in range(self.decoded_mmppt["mmppt_Units"]): |
1041 | 1058 | self.mmppt_units.append(SolarEdgeMMPPTUnit(self, self.hub, unit_index)) |
@@ -1127,6 +1144,7 @@ async def read_modbus_data(self) -> None: |
1127 | 1144 | + [inverter_data.registers[28]] |
1128 | 1145 | + inverter_data.registers[30:40] |
1129 | 1146 | ) |
| 1147 | + |
1130 | 1148 | self.decoded_model.update( |
1131 | 1149 | dict( |
1132 | 1150 | zip( |
@@ -1154,6 +1172,24 @@ async def read_modbus_data(self) -> None: |
1154 | 1172 | ) |
1155 | 1173 | ) |
1156 | 1174 |
|
| 1175 | + if self.use_status_vendor4: |
| 1176 | + inverter_data = await self.hub.modbus_read_holding_registers( |
| 1177 | + unit=self.inverter_unit_id, address=40119, rcount=2 |
| 1178 | + ) |
| 1179 | + self.decoded_model.update( |
| 1180 | + dict( |
| 1181 | + [ |
| 1182 | + ( |
| 1183 | + "I_Status_Vendor4", |
| 1184 | + ModbusClientMixin.convert_from_registers( |
| 1185 | + inverter_data.registers[0:2], |
| 1186 | + data_type=ModbusClientMixin.DATATYPE.UINT32, |
| 1187 | + ), |
| 1188 | + ), |
| 1189 | + ] |
| 1190 | + ) |
| 1191 | + ) |
| 1192 | + |
1157 | 1193 | if ( |
1158 | 1194 | self.decoded_model["C_SunSpec_DID"] == SunSpecNotImpl.UINT16 |
1159 | 1195 | or self.decoded_model["C_SunSpec_DID"] not in [101, 102, 103] |
@@ -1913,6 +1949,10 @@ def is_mmppt(self) -> bool: |
1913 | 1949 | def last_update(self) -> datetime.datetime | None: |
1914 | 1950 | return self._last_update_timestamp |
1915 | 1951 |
|
| 1952 | + @property |
| 1953 | + def use_status_vendor4(self) -> bool: |
| 1954 | + return self._use_status_vendor4 |
| 1955 | + |
1916 | 1956 |
|
1917 | 1957 | class SolarEdgeMMPPTUnit: |
1918 | 1958 | """Defines a SolarEdge inverter MMPPT unit.""" |
|
0 commit comments