From 9d5fafa8d0ad5c24305d6e5d2ea18fe789539f91 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 | 73 ++++++++++--------- custom_components/sws12500/const.py | 23 ++---- .../sws12500/translations/cs.json | 11 +++ 3 files changed, 58 insertions(+), 49 deletions(-) diff --git a/custom_components/sws12500/config_flow.py b/custom_components/sws12500/config_flow.py index 42949d9..bc391a7 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, ) @@ -65,6 +60,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.""" @@ -94,22 +91,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], @@ -120,28 +112,18 @@ class ConfigOptionsFlowHandler(OptionsFlow): 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 - ), + 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 = { - vol.Required( - POCASI_CZ_API_ID, default=self.pocasi_cz.get(POCASI_CZ_API_ID) - ): str, - vol.Required( - POCASI_CZ_API_KEY, default=self.pocasi_cz.get(POCASI_CZ_API_KEY) - ): str, + vol.Required(POCASI_CZ_API_ID, default=self.pocasi_cz.get(POCASI_CZ_API_ID)): str, + vol.Required(POCASI_CZ_API_KEY, default=self.pocasi_cz.get(POCASI_CZ_API_KEY)): str, vol.Required( POCASI_CZ_SEND_INTERVAL, default=self.pocasi_cz.get(POCASI_CZ_SEND_INTERVAL), ): int, - vol.Optional( - POCASI_CZ_ENABLED, default=self.pocasi_cz.get(POCASI_CZ_ENABLED) - ): bool, + vol.Optional(POCASI_CZ_ENABLED, default=self.pocasi_cz.get(POCASI_CZ_ENABLED)): bool, vol.Optional( POCASI_CZ_LOGGER_ENABLED, default=self.pocasi_cz.get(POCASI_CZ_LOGGER_ENABLED), @@ -153,11 +135,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): @@ -294,6 +278,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.""" @@ -303,6 +309,7 @@ class ConfigOptionsFlowHandler(OptionsFlow): **self.pocasi_cz, **self.sensors, **self.ecowitt, + **self.wslink_addon_port, **dict(data), } @@ -339,9 +346,7 @@ class ConfigFlowHandler(ConfigFlow, domain=DOMAIN): elif user_input[API_KEY] == user_input[API_ID]: errors["base"] = "valid_credentials_match" else: - return self.async_create_entry( - title=DOMAIN, data=user_input, options=user_input - ) + return self.async_create_entry(title=DOMAIN, data=user_input, options=user_input) return self.async_show_form( step_id="user", diff --git a/custom_components/sws12500/const.py b/custom_components/sws12500/const.py index b1a27f1..97fb18a 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", @@ -235,28 +236,20 @@ POCASI_CZ_API_ID = "POCASI_CZ_API_ID" POCASI_CZ_SEND_INTERVAL = "POCASI_SEND_INTERVAL" POCASI_CZ_ENABLED = "pocasi_enabled_chcekbox" POCASI_CZ_LOGGER_ENABLED = "pocasi_logger_checkbox" -POCASI_INVALID_KEY: Final = ( - "Pocasi Meteo refused to accept data. Invalid ID/Key combination?" -) +POCASI_INVALID_KEY: Final = "Pocasi Meteo refused to accept data. Invalid ID/Key combination?" POCASI_CZ_SUCCESS: Final = "Successfully sent data to Pocasi Meteo" -POCASI_CZ_UNEXPECTED: Final = ( - "Pocasti Meteo responded unexpectedly 3 times in row. Resendig is now disabled!" -) +POCASI_CZ_UNEXPECTED: Final = "Pocasti Meteo responded unexpectedly 3 times in row. Resendig is now disabled!" 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_UNEXPECTED: Final = ( - "Windy responded unexpectedly 3 times in a row. Send to Windy is now disabled!" +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_UNEXPECTED: Final = "Windy responded unexpectedly 3 times in a row. Send to Windy is now disabled!" PURGE_DATA_POCAS: Final = [ diff --git a/custom_components/sws12500/translations/cs.json b/custom_components/sws12500/translations/cs.json index 7649fd2..6eb5a49 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ů.",