Skip to content

Commit 3ecb5e3

Browse files
Merge pull request #567 from WillCodeForCats/config-flow-reconfigure
Add support for config flow reconfigure
2 parents 32096ad + d0e3e3b commit 3ecb5e3

File tree

12 files changed

+177
-15
lines changed

12 files changed

+177
-15
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ After rebooting Home Assistant, this integration can be configured through the i
4242
[WillCodeForCats/solaredge-modbus-multi/wiki](https://github.com/WillCodeForCats/solaredge-modbus-multi/wiki)
4343

4444
### Required Versions
45-
* Home Assistant 2024.3.2 or newer
45+
* Home Assistant 2024.4.0 or newer
4646
* Python 3.11 or newer
4747
* pymodbus 3.6.6 or newer
4848

custom_components/solaredge_modbus_multi/config_flow.py

Lines changed: 86 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
from __future__ import annotations
44

5+
from typing import Any
6+
57
import homeassistant.helpers.config_validation as cv
68
import voluptuous as vol
79
from homeassistant import config_entries
@@ -35,7 +37,9 @@ def async_get_options_flow(config_entry: ConfigEntry) -> OptionsFlow:
3537
"""Create the options flow for SolarEdge Modbus Multi."""
3638
return SolaredgeModbusMultiOptionsFlowHandler(config_entry)
3739

38-
async def async_step_user(self, user_input=None) -> FlowResult:
40+
async def async_step_user(
41+
self, user_input: dict[str, Any] | None = None
42+
) -> FlowResult:
3943
"""Handle the initial config flow step."""
4044
errors = {}
4145

@@ -99,6 +103,78 @@ async def async_step_user(self, user_input=None) -> FlowResult:
99103
errors=errors,
100104
)
101105

106+
async def async_step_reconfigure(
107+
self, user_input: dict[str, Any] | None = None
108+
) -> FlowResult:
109+
"""Handle the reconfigure flow step."""
110+
errors = {}
111+
config_entry = self.hass.config_entries.async_get_entry(
112+
self.context["entry_id"]
113+
)
114+
assert config_entry
115+
unique_id = config_entry.unique_id
116+
117+
if user_input is not None:
118+
user_input[CONF_HOST] = user_input[CONF_HOST].lower()
119+
120+
if not host_valid(user_input[CONF_HOST]):
121+
errors[CONF_HOST] = "invalid_host"
122+
elif user_input[CONF_PORT] < 1:
123+
errors[CONF_PORT] = "invalid_tcp_port"
124+
elif user_input[CONF_PORT] > 65535:
125+
errors[CONF_PORT] = "invalid_tcp_port"
126+
elif user_input[ConfName.DEVICE_ID] > 247:
127+
errors[ConfName.DEVICE_ID] = "max_device_id"
128+
elif user_input[ConfName.DEVICE_ID] < 1:
129+
errors[ConfName.DEVICE_ID] = "min_device_id"
130+
elif user_input[ConfName.NUMBER_INVERTERS] > 32:
131+
errors[ConfName.NUMBER_INVERTERS] = "max_inverters"
132+
elif user_input[ConfName.NUMBER_INVERTERS] < 1:
133+
errors[ConfName.NUMBER_INVERTERS] = "min_inverters"
134+
elif (
135+
user_input[ConfName.NUMBER_INVERTERS] + user_input[ConfName.DEVICE_ID]
136+
> 247
137+
):
138+
errors[ConfName.NUMBER_INVERTERS] = "too_many_inverters"
139+
else:
140+
return self.async_update_reload_and_abort(
141+
config_entry,
142+
unique_id=unique_id,
143+
data={**config_entry.data, **user_input},
144+
reason="reconfigure_successful",
145+
)
146+
else:
147+
user_input = {
148+
CONF_HOST: config_entry.data.get(CONF_HOST),
149+
CONF_PORT: config_entry.data.get(CONF_PORT, ConfDefaultInt.PORT),
150+
ConfName.NUMBER_INVERTERS: config_entry.data.get(
151+
ConfName.NUMBER_INVERTERS, ConfDefaultInt.NUMBER_INVERTERS
152+
),
153+
ConfName.DEVICE_ID: config_entry.data.get(
154+
ConfName.DEVICE_ID, ConfDefaultInt.DEVICE_ID
155+
),
156+
}
157+
158+
return self.async_show_form(
159+
step_id="reconfigure",
160+
data_schema=vol.Schema(
161+
{
162+
vol.Required(CONF_HOST, default=user_input[CONF_HOST]): cv.string,
163+
vol.Required(CONF_PORT, default=user_input[CONF_PORT]): vol.Coerce(
164+
int
165+
),
166+
vol.Required(
167+
f"{ConfName.NUMBER_INVERTERS}",
168+
default=user_input[ConfName.NUMBER_INVERTERS],
169+
): vol.Coerce(int),
170+
vol.Required(
171+
f"{ConfName.DEVICE_ID}", default=user_input[ConfName.DEVICE_ID]
172+
): vol.Coerce(int),
173+
},
174+
),
175+
errors=errors,
176+
)
177+
102178

103179
class SolaredgeModbusMultiOptionsFlowHandler(OptionsFlow):
104180
"""Handle an options flow for SolarEdge Modbus Multi."""
@@ -107,7 +183,9 @@ def __init__(self, config_entry: ConfigEntry):
107183
"""Initialize options flow."""
108184
self.config_entry = config_entry
109185

110-
async def async_step_init(self, user_input=None) -> FlowResult:
186+
async def async_step_init(
187+
self, user_input: dict[str, Any] | None = None
188+
) -> FlowResult:
111189
"""Handle the initial options flow step."""
112190
errors = {}
113191

@@ -194,7 +272,9 @@ async def async_step_init(self, user_input=None) -> FlowResult:
194272
errors=errors,
195273
)
196274

197-
async def async_step_battery_options(self, user_input=None) -> FlowResult:
275+
async def async_step_battery_options(
276+
self, user_input: dict[str, Any] | None = None
277+
) -> FlowResult:
198278
"""Battery Options"""
199279
errors = {}
200280

@@ -249,7 +329,9 @@ async def async_step_battery_options(self, user_input=None) -> FlowResult:
249329
errors=errors,
250330
)
251331

252-
async def async_step_adv_pwr_ctl(self, user_input=None) -> FlowResult:
332+
async def async_step_adv_pwr_ctl(
333+
self, user_input: dict[str, Any] | None = None
334+
) -> FlowResult:
253335
"""Power Control Options"""
254336
errors = {}
255337

custom_components/solaredge_modbus_multi/strings.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@
1010
"device_id": "Inverter Modbus Address (Device ID)",
1111
"number_of_inverters": "Number of Inverters"
1212
}
13+
},
14+
"reconfigure": {
15+
"title": "SolarEdge Modbus Configuration",
16+
"data": {
17+
"host": "Inverter IP Address",
18+
"port": "Modbus/TCP Port",
19+
"device_id": "Inverter Modbus Address (Device ID)",
20+
"number_of_inverters": "Number of Inverters"
21+
}
1322
}
1423
},
1524
"error": {
@@ -23,7 +32,8 @@
2332
"invalid_tcp_port": "Valid port range is 1 to 65535."
2433
},
2534
"abort": {
26-
"already_configured": "Device is already configured!"
35+
"already_configured": "Device is already configured",
36+
"reconfigure_successful": "Re-configuration was successful"
2737
}
2838
},
2939
"options": {

custom_components/solaredge_modbus_multi/translations/de.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@
1010
"device_id": "Wechselrichter-Modbus-Adresse (Geräte-ID)",
1111
"number_of_inverters": "Anzahl Wechselrichter"
1212
}
13+
},
14+
"reconfigure": {
15+
"title": "SolarEdge Modbus-Konfiguration",
16+
"data": {
17+
"host": "Wechselrichter-IP-Adresse",
18+
"port": "Modbus/TCP-Port",
19+
"device_id": "Wechselrichter-Modbus-Adresse (Geräte-ID)",
20+
"number_of_inverters": "Anzahl Wechselrichter"
21+
}
1322
}
1423
},
1524
"error": {
@@ -23,7 +32,8 @@
2332
"invalid_tcp_port": "Der gültige Portbereich ist 1 bis 65535."
2433
},
2534
"abort": {
26-
"already_configured": "Der Wechselrichter ist bereits konfiguriert."
35+
"already_configured": "Gerät ist bereits konfiguriert",
36+
"reconfigure_successful": "Die Neukonfiguration war erfolgreich"
2737
}
2838
},
2939
"options": {

custom_components/solaredge_modbus_multi/translations/en.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@
1010
"device_id": "Inverter Modbus Address (Device ID)",
1111
"number_of_inverters": "Number of Inverters"
1212
}
13+
},
14+
"reconfigure": {
15+
"title": "SolarEdge Modbus Configuration",
16+
"data": {
17+
"host": "Inverter IP Address",
18+
"port": "Modbus/TCP Port",
19+
"device_id": "Inverter Modbus Address (Device ID)",
20+
"number_of_inverters": "Number of Inverters"
21+
}
1322
}
1423
},
1524
"error": {
@@ -23,7 +32,8 @@
2332
"invalid_tcp_port": "Valid port range is 1 to 65535."
2433
},
2534
"abort": {
26-
"already_configured": "Device is already configured!"
35+
"already_configured": "Device is already configured",
36+
"reconfigure_successful": "Re-configuration was successful"
2737
}
2838
},
2939
"options": {

custom_components/solaredge_modbus_multi/translations/fr.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@
1010
"device_id": "L'adresse Modbus de l'onduleur (Device ID)",
1111
"number_of_inverters": "Nombre d'onduleurs"
1212
}
13+
},
14+
"reconfigure": {
15+
"title": "Configuration SolarEdge Modbus",
16+
"data": {
17+
"host": "Adresse IP de l'onduleur",
18+
"port": "Port Modbus/TCP",
19+
"device_id": "L'adresse Modbus de l'onduleur (Device ID)",
20+
"number_of_inverters": "Nombre d'onduleurs"
21+
}
1322
}
1423
},
1524
"error": {
@@ -23,7 +32,8 @@
2332
"invalid_tcp_port": "La plage de ports valide est comprise entre 1 et 65535."
2433
},
2534
"abort": {
26-
"already_configured": "L'appareil est déjà configuré!"
35+
"already_configured": "L'appareil est déjà configuré",
36+
"reconfigure_successful": "La reconfiguration a réussi"
2737
}
2838
},
2939
"options": {

custom_components/solaredge_modbus_multi/translations/it.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@
1010
"device_id": "Indirizzo Modbus dell'inverter (ID dispositivo)",
1111
"number_of_inverters": "Numero di inverter"
1212
}
13+
},
14+
"reconfigure": {
15+
"title": "Configurazione Modbus SolarEdge",
16+
"data": {
17+
"host": "Indirizzo IP dell'inverter",
18+
"port": "Porta Modbus/TCP",
19+
"device_id": "Indirizzo Modbus dell'inverter (ID dispositivo)",
20+
"number_of_inverters": "Numero di inverter"
21+
}
1322
}
1423
},
1524
"error": {
@@ -23,7 +32,8 @@
2332
"invalid_tcp_port": "L'intervallo di porte valido è compreso tra 1 e 65535."
2433
},
2534
"abort": {
26-
"already_configured": "Il dispositivo è già configurato!"
35+
"already_configured": "Il dispositivo è già configurato",
36+
"reconfigure_successful": "La riconfigurazione ha avuto successo"
2737
}
2838
},
2939
"options": {

custom_components/solaredge_modbus_multi/translations/nb.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@
1010
"device_id": "Inverter Modbus-adresse (enhets-ID)",
1111
"number_of_inverters": "Antall omformere koblet sammen"
1212
}
13+
},
14+
"reconfigure": {
15+
"title": "SolarEdge Modbus-konfigurasjon",
16+
"data": {
17+
"host": "IP-adres van omvormer",
18+
"port": "Modbus/TCP-poort",
19+
"device_id": "Inverter Modbus-adresse (enhets-ID)",
20+
"number_of_inverters": "Antall omformere koblet sammen"
21+
}
1322
}
1423
},
1524
"error": {
@@ -23,7 +32,8 @@
2332
"invalid_tcp_port": "Gyldig portområde er 1 til 65535."
2433
},
2534
"abort": {
26-
"already_configured": "Enheten er allerede konfigurert"
35+
"already_configured": "Enheten er allerede konfigurert",
36+
"reconfigure_successful": "Omkonfigureringen var vellykket"
2737
}
2838
},
2939
"options": {

custom_components/solaredge_modbus_multi/translations/nl.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@
1010
"device_id": "Omvormer Modbus-adres (apparaat-ID)",
1111
"number_of_inverters": "Aantal aangesloten omvormers"
1212
}
13+
},
14+
"reconfigure": {
15+
"title": "SolarEdge Modbus-configuratie",
16+
"data": {
17+
"host": "omvormer IP-adres",
18+
"port": "Modbus/TCP Port",
19+
"device_id": "Omvormer Modbus-adres (apparaat-ID)",
20+
"number_of_inverters": "Aantal aangesloten omvormers"
21+
}
1322
}
1423
},
1524
"error": {
@@ -23,7 +32,8 @@
2332
"invalid_tcp_port": "Geldig poortbereik is 1 tot 65535."
2433
},
2534
"abort": {
26-
"already_configured": "Apparaat is al geconfigureerd"
35+
"already_configured": "Apparaat is al geconfigureerd",
36+
"reconfigure_successful": "De herconfiguratie was succesvol"
2737
}
2838
},
2939
"options": {

custom_components/solaredge_modbus_multi/translations/pl.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@
1010
"device_id": "Adres Modbus Inwertera (Device ID)",
1111
"number_of_inverters": "Ilość inwerterów"
1212
}
13+
},
14+
"reconfigure": {
15+
"title": "Konfiguracja SolarEdge Modbus",
16+
"data": {
17+
"host": "Adres IP inwertera",
18+
"port": "Modbus/TCP Port",
19+
"device_id": "Adres Modbus Inwertera (Device ID)",
20+
"number_of_inverters": "Ilość inwerterów"
21+
}
1322
}
1423
},
1524
"error": {
@@ -23,7 +32,8 @@
2332
"invalid_tcp_port": "Dozwolony zakres portów to od 1 do 65535."
2433
},
2534
"abort": {
26-
"already_configured": "Urządzenie jest już skonfigurowane!"
35+
"already_configured": "Urządzenie jest już skonfigurowane",
36+
"reconfigure_successful": "Ponowna konfiguracja przebiegła pomyślnie"
2737
}
2838
},
2939
"options": {

0 commit comments

Comments
 (0)