From ea94a2fbfdb96481d62af25d2fab348fc690c1d0 Mon Sep 17 00:00:00 2001 From: mletenay Date: Mon, 13 Feb 2023 12:49:11 +0100 Subject: [PATCH] Add support for 4 MPTT inverter (#86901) --- homeassistant/components/goodwe/__init__.py | 2 +- homeassistant/components/goodwe/manifest.json | 2 +- homeassistant/components/goodwe/select.py | 50 ++++++++++++------- homeassistant/components/goodwe/strings.json | 15 ++++++ requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 6 files changed, 50 insertions(+), 23 deletions(-) diff --git a/homeassistant/components/goodwe/__init__.py b/homeassistant/components/goodwe/__init__.py index 5dcc66e90d4..a888752f508 100644 --- a/homeassistant/components/goodwe/__init__.py +++ b/homeassistant/components/goodwe/__init__.py @@ -46,7 +46,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: name=entry.title, manufacturer="GoodWe", model=inverter.model_name, - sw_version=f"{inverter.software_version} ({inverter.arm_version})", + sw_version=f"{inverter.firmware} / {inverter.arm_firmware}", ) async def async_update_data(): diff --git a/homeassistant/components/goodwe/manifest.json b/homeassistant/components/goodwe/manifest.json index 6f93cc638e6..53e093758cc 100644 --- a/homeassistant/components/goodwe/manifest.json +++ b/homeassistant/components/goodwe/manifest.json @@ -6,5 +6,5 @@ "documentation": "https://www.home-assistant.io/integrations/goodwe", "iot_class": "local_polling", "loggers": ["goodwe"], - "requirements": ["goodwe==0.2.18"] + "requirements": ["goodwe==0.2.25"] } diff --git a/homeassistant/components/goodwe/select.py b/homeassistant/components/goodwe/select.py index b76633c4368..bfaef5d537a 100644 --- a/homeassistant/components/goodwe/select.py +++ b/homeassistant/components/goodwe/select.py @@ -1,7 +1,7 @@ """GoodWe PV inverter selection settings entities.""" import logging -from goodwe import Inverter, InverterError +from goodwe import Inverter, InverterError, OperationMode from homeassistant.components.select import SelectEntity, SelectEntityDescription from homeassistant.config_entries import ConfigEntry @@ -15,17 +15,26 @@ from .const import DOMAIN, KEY_DEVICE_INFO, KEY_INVERTER _LOGGER = logging.getLogger(__name__) +_MODE_TO_OPTION: dict[OperationMode, str] = { + OperationMode.GENERAL: "general", + OperationMode.OFF_GRID: "off_grid", + OperationMode.BACKUP: "backup", + OperationMode.ECO: "eco", + OperationMode.PEAK_SHAVING: "peak_shaving", + OperationMode.ECO_CHARGE: "eco_charge", + OperationMode.ECO_DISCHARGE: "eco_discharge", +} + +_OPTION_TO_MODE: dict[str, OperationMode] = { + value: key for key, value in _MODE_TO_OPTION.items() +} + OPERATION_MODE = SelectEntityDescription( key="operation_mode", name="Inverter operation mode", icon="mdi:solar-power", entity_category=EntityCategory.CONFIG, - options=[ - "General mode", - "Off grid mode", - "Backup mode", - "Eco mode", - ], + translation_key="operation_mode", ) @@ -38,6 +47,7 @@ async def async_setup_entry( inverter = hass.data[DOMAIN][config_entry.entry_id][KEY_INVERTER] device_info = hass.data[DOMAIN][config_entry.entry_id][KEY_DEVICE_INFO] + supported_modes = await inverter.get_operation_modes(False) # read current operating mode from the inverter try: active_mode = await inverter.get_operation_mode() @@ -45,17 +55,17 @@ async def async_setup_entry( # Inverter model does not support this setting _LOGGER.debug("Could not read inverter operation mode") else: - if (options := OPERATION_MODE.options) and 0 <= active_mode < len(options): - async_add_entities( - [ - InverterOperationModeEntity( - device_info, - OPERATION_MODE, - inverter, - options[active_mode], - ) - ] - ) + async_add_entities( + [ + InverterOperationModeEntity( + device_info, + OPERATION_MODE, + inverter, + [v for k, v in _MODE_TO_OPTION.items() if k in supported_modes], + _MODE_TO_OPTION[active_mode], + ) + ] + ) class InverterOperationModeEntity(SelectEntity): @@ -68,17 +78,19 @@ class InverterOperationModeEntity(SelectEntity): device_info: DeviceInfo, description: SelectEntityDescription, inverter: Inverter, + supported_options: list[str], current_mode: str, ) -> None: """Initialize the inverter operation mode setting entity.""" self.entity_description = description self._attr_unique_id = f"{DOMAIN}-{description.key}-{inverter.serial_number}" self._attr_device_info = device_info + self._attr_options = supported_options self._attr_current_option = current_mode self._inverter: Inverter = inverter async def async_select_option(self, option: str) -> None: """Change the selected option.""" - await self._inverter.set_operation_mode(self.options.index(option)) + await self._inverter.set_operation_mode(_OPTION_TO_MODE[option]) self._attr_current_option = option self.async_write_ha_state() diff --git a/homeassistant/components/goodwe/strings.json b/homeassistant/components/goodwe/strings.json index 61da6961df1..28765c005af 100644 --- a/homeassistant/components/goodwe/strings.json +++ b/homeassistant/components/goodwe/strings.json @@ -16,5 +16,20 @@ "already_configured": "[%key:common::config_flow::abort::already_configured_device%]", "already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]" } + }, + "entity": { + "select": { + "operation_mode": { + "state": { + "general": "General mode", + "off_grid": "Off grid mode", + "backup": "Backup mode", + "eco": "Eco mode", + "peak_shaving": "Peak shaving mode", + "eco_charge": "Eco charge mode", + "eco_discharge": "Eco discharge mode" + } + } + } } } diff --git a/requirements_all.txt b/requirements_all.txt index 3887cdbb069..c4e6344c926 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -798,7 +798,7 @@ glances_api==0.4.1 goalzero==0.2.1 # homeassistant.components.goodwe -goodwe==0.2.18 +goodwe==0.2.25 # homeassistant.components.google_mail google-api-python-client==2.71.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index d5941d1b14a..928e0daee72 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -611,7 +611,7 @@ glances_api==0.4.1 goalzero==0.2.1 # homeassistant.components.goodwe -goodwe==0.2.18 +goodwe==0.2.25 # homeassistant.components.google_mail google-api-python-client==2.71.0