From 64a5bdb1d7181e0414d97c4add702a44151cfbe8 Mon Sep 17 00:00:00 2001 From: SchiZzA Date: Mon, 23 Mar 2026 18:14:46 +0100 Subject: [PATCH] Add configuration options for WSLink Addon port. --- custom_components/sws12500/config_flow.py | 59 ++++++++++++------- custom_components/sws12500/const.py | 9 +-- .../sws12500/translations/cs.json | 11 ++++ 3 files changed, 51 insertions(+), 28 deletions(-) diff --git a/custom_components/sws12500/config_flow.py b/custom_components/sws12500/config_flow.py index a413813..2e4f217 100644 --- a/custom_components/sws12500/config_flow.py +++ b/custom_components/sws12500/config_flow.py @@ -6,12 +6,7 @@ from typing import Any import voluptuous as vol from yarl import URL -from homeassistant.config_entries import ( - ConfigEntry, - ConfigFlow, - ConfigFlowResult, - OptionsFlow, -) +from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.core import callback from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers.network import get_url @@ -23,7 +18,6 @@ from .const import ( DOMAIN, ECOWITT_ENABLED, ECOWITT_WEBHOOK_ID, - # HEALTH_BEARER_TOKEN, INVALID_CREDENTIALS, POCASI_CZ_API_ID, POCASI_CZ_API_KEY, @@ -37,6 +31,7 @@ from .const import ( WINDY_STATION_ID, WINDY_STATION_PW, WSLINK, + WSLINK_ADDON_PORT, ) @@ -66,6 +61,8 @@ class ConfigOptionsFlowHandler(OptionsFlow): self.pocasi_cz_schema = {} self.ecowitt: dict[str, Any] = {} self.ecowitt_schema = {} + self.wslink_addon_port: dict[str, int] = {} + self.wslink_addod_schema = {} async def _get_entry_data(self): """Get entry data.""" @@ -93,22 +90,17 @@ class ConfigOptionsFlowHandler(OptionsFlow): self.windy_data = { WINDY_STATION_ID: self.config_entry.options.get(WINDY_STATION_ID, ""), WINDY_STATION_PW: self.config_entry.options.get(WINDY_STATION_PW, ""), - WINDY_LOGGER_ENABLED: self.config_entry.options.get( - WINDY_LOGGER_ENABLED, False - ), + WINDY_LOGGER_ENABLED: self.config_entry.options.get(WINDY_LOGGER_ENABLED, False), WINDY_ENABLED: self.config_entry.options.get(WINDY_ENABLED, False), } self.windy_data_schema = { - vol.Optional( - WINDY_STATION_ID, default=self.windy_data.get(WINDY_STATION_ID, "") - ): str, + vol.Optional(WINDY_STATION_ID, default=self.windy_data.get(WINDY_STATION_ID, "")): str, vol.Optional( WINDY_STATION_PW, default=self.windy_data.get(WINDY_STATION_PW, ""), ): str, - vol.Optional(WINDY_ENABLED, default=self.windy_data[WINDY_ENABLED]): bool - or False, + vol.Optional(WINDY_ENABLED, default=self.windy_data[WINDY_ENABLED]): bool or False, vol.Optional( WINDY_LOGGER_ENABLED, default=self.windy_data[WINDY_LOGGER_ENABLED], @@ -116,11 +108,11 @@ class ConfigOptionsFlowHandler(OptionsFlow): } self.pocasi_cz = { - POCASI_CZ_API_ID: entry_data.get(POCASI_CZ_API_ID, ""), - POCASI_CZ_API_KEY: entry_data.get(POCASI_CZ_API_KEY, ""), - POCASI_CZ_ENABLED: entry_data.get(POCASI_CZ_ENABLED, False), - POCASI_CZ_LOGGER_ENABLED: entry_data.get(POCASI_CZ_LOGGER_ENABLED, False), - POCASI_CZ_SEND_INTERVAL: entry_data.get(POCASI_CZ_SEND_INTERVAL, 30), + POCASI_CZ_API_ID: self.config_entry.options.get(POCASI_CZ_API_ID, ""), + POCASI_CZ_API_KEY: self.config_entry.options.get(POCASI_CZ_API_KEY, ""), + POCASI_CZ_ENABLED: self.config_entry.options.get(POCASI_CZ_ENABLED, False), + POCASI_CZ_LOGGER_ENABLED: self.config_entry.options.get(POCASI_CZ_LOGGER_ENABLED, False), + POCASI_CZ_SEND_INTERVAL: self.config_entry.options.get(POCASI_CZ_SEND_INTERVAL, 30), } self.pocasi_cz_schema = { @@ -142,11 +134,13 @@ class ConfigOptionsFlowHandler(OptionsFlow): ECOWITT_ENABLED: self.config_entry.options.get(ECOWITT_ENABLED, False), } + self.wslink_addon_port = {WSLINK_ADDON_PORT: self.config_entry.options.get(WSLINK_ADDON_PORT, 443)} + async def async_step_init(self, user_input: dict[str, Any] = {}): """Manage the options - show menu first.""" _ = user_input return self.async_show_menu( - step_id="init", menu_options=["basic", "ecowitt", "windy", "pocasi"] + step_id="init", menu_options=["basic", "wslink_port_setup", "ecowitt", "windy", "pocasi"] ) async def async_step_basic(self, user_input: Any = None): @@ -283,6 +277,28 @@ class ConfigOptionsFlowHandler(OptionsFlow): user_input = self.retain_data(user_input) return self.async_create_entry(title=DOMAIN, data=user_input) + async def async_step_wslink_port_setup(self, user_input: Any = None) -> ConfigFlowResult: + """WSLink Addon port setup.""" + + errors: dict[str, str] = {} + await self._get_entry_data() + + if not (port := self.wslink_addon_port.get(WSLINK_ADDON_PORT)): + port = 433 + + wslink_port_schema = { + vol.Required(WSLINK_ADDON_PORT, default=port): int, + } + if user_input is None: + return self.async_show_form( + step_id="wslink_port_setup", + data_schema=vol.Schema(wslink_port_schema), + errors=errors, + ) + + user_input = self.retain_data(user_input) + return self.async_create_entry(title=DOMAIN, data=user_input) + def retain_data(self, data: dict[str, Any]) -> dict[str, Any]: """Retain user_data.""" @@ -292,6 +308,7 @@ class ConfigOptionsFlowHandler(OptionsFlow): **self.pocasi_cz, **self.sensors, **self.ecowitt, + **self.wslink_addon_port, **dict(data), } diff --git a/custom_components/sws12500/const.py b/custom_components/sws12500/const.py index 2c5ff26..f21c7bc 100644 --- a/custom_components/sws12500/const.py +++ b/custom_components/sws12500/const.py @@ -143,6 +143,7 @@ POCASI_CZ_SEND_MINIMUM: Final = 12 # minimal time to resend data WSLINK: Final = "wslink" WINDY_MAX_RETRIES: Final = 3 +WSLINK_ADDON_PORT: Final = "WSLINK_ADDON_PORT" __all__ = [ "DOMAIN", @@ -243,13 +244,7 @@ WINDY_STATION_ID = "WINDY_STATION_ID" WINDY_STATION_PW = "WINDY_STATION_PWD" WINDY_ENABLED: Final = "windy_enabled_checkbox" WINDY_LOGGER_ENABLED: Final = "windy_logger_checkbox" -WINDY_NOT_INSERTED: Final = ( - "Windy responded with 400 error. Invalid ID/password combination?" -) -WINDY_INVALID_KEY: Final = "Windy API KEY is invalid. Send data to Windy is now disabled. Check your API KEY and try again." -WINDY_SUCCESS: Final = ( - "Windy successfully sent data and data was successfully inserted by Windy API" -) +WINDY_NOT_INSERTED: Final = "Windy responded with 400 error. Invalid ID/password combination?" WINDY_INVALID_KEY: Final = ( "Windy API KEY is invalid. Send data to Windy is now disabled. Check your API KEY and try again." ) diff --git a/custom_components/sws12500/translations/cs.json b/custom_components/sws12500/translations/cs.json index 772025d..bcd175f 100644 --- a/custom_components/sws12500/translations/cs.json +++ b/custom_components/sws12500/translations/cs.json @@ -44,6 +44,7 @@ "windy": "Nastavení pro přeposílání dat na Windy", "pocasi": "Nastavení pro přeposlání dat na Počasí Meteo CZ", "ecowitt": "Nastavení pro stanice Ecowitt", + "wslink_port_setup": "Nastavení portu WSLink Addonu", "migration": "Migrace statistiky senzoru" } }, @@ -108,6 +109,16 @@ "ecowitt_enabled": "Povolit přijímání dat ze stanic Ecowitt" } }, + "wslink_port_setup": { + "description": "Nastavení portu, kde naslouchá WSLink Addon. Slouží pro příjem diagnostik.", + "title": "Port WSLink Addonu", + "data": { + "WSLINK_ADDON_PORT": "Naslouchající port WSLink Addonu" + }, + "data_description": { + "WSLINK_ADDON_PORT": "Zadejte port, tak jak jej máte nastavený ve WSLink Addonu." + } + }, "migration": { "title": "Migrace statistiky senzoru.", "description": "Pro správnou funkci dlouhodobé statistiky je nutné provést migraci jednotky senzoru v dlouhodobé statistice. Původní jednotka dlouhodobé statistiky pro denní úhrn srážek byla v mm/d, nicméně stanice zasílá pouze data v mm bez časového rozlišení.\n\n Senzor, který má být migrován je pro denní úhrn srážek. Pokud je v seznamu již správná hodnota u senzoru pro denní úhrn (mm), pak je již migrace hotová.\n\n Výsledek migrace pro senzor: {migration_status}, přepvedeno celkem {migration_count} řádků.",