Add configuration options for WSLink Addon port.

ecowitt_support
SchiZzA 2026-03-23 18:14:46 +01:00
parent affd26e7a5
commit 64a5bdb1d7
No known key found for this signature in database
3 changed files with 51 additions and 28 deletions

View File

@ -6,12 +6,7 @@ from typing import Any
import voluptuous as vol import voluptuous as vol
from yarl import URL from yarl import URL
from homeassistant.config_entries import ( from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult, OptionsFlow
ConfigEntry,
ConfigFlow,
ConfigFlowResult,
OptionsFlow,
)
from homeassistant.core import callback from homeassistant.core import callback
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.network import get_url from homeassistant.helpers.network import get_url
@ -23,7 +18,6 @@ from .const import (
DOMAIN, DOMAIN,
ECOWITT_ENABLED, ECOWITT_ENABLED,
ECOWITT_WEBHOOK_ID, ECOWITT_WEBHOOK_ID,
# HEALTH_BEARER_TOKEN,
INVALID_CREDENTIALS, INVALID_CREDENTIALS,
POCASI_CZ_API_ID, POCASI_CZ_API_ID,
POCASI_CZ_API_KEY, POCASI_CZ_API_KEY,
@ -37,6 +31,7 @@ from .const import (
WINDY_STATION_ID, WINDY_STATION_ID,
WINDY_STATION_PW, WINDY_STATION_PW,
WSLINK, WSLINK,
WSLINK_ADDON_PORT,
) )
@ -66,6 +61,8 @@ class ConfigOptionsFlowHandler(OptionsFlow):
self.pocasi_cz_schema = {} self.pocasi_cz_schema = {}
self.ecowitt: dict[str, Any] = {} self.ecowitt: dict[str, Any] = {}
self.ecowitt_schema = {} self.ecowitt_schema = {}
self.wslink_addon_port: dict[str, int] = {}
self.wslink_addod_schema = {}
async def _get_entry_data(self): async def _get_entry_data(self):
"""Get entry data.""" """Get entry data."""
@ -93,22 +90,17 @@ class ConfigOptionsFlowHandler(OptionsFlow):
self.windy_data = { self.windy_data = {
WINDY_STATION_ID: self.config_entry.options.get(WINDY_STATION_ID, ""), WINDY_STATION_ID: self.config_entry.options.get(WINDY_STATION_ID, ""),
WINDY_STATION_PW: self.config_entry.options.get(WINDY_STATION_PW, ""), WINDY_STATION_PW: self.config_entry.options.get(WINDY_STATION_PW, ""),
WINDY_LOGGER_ENABLED: self.config_entry.options.get( WINDY_LOGGER_ENABLED: self.config_entry.options.get(WINDY_LOGGER_ENABLED, False),
WINDY_LOGGER_ENABLED, False
),
WINDY_ENABLED: self.config_entry.options.get(WINDY_ENABLED, False), WINDY_ENABLED: self.config_entry.options.get(WINDY_ENABLED, False),
} }
self.windy_data_schema = { self.windy_data_schema = {
vol.Optional( vol.Optional(WINDY_STATION_ID, default=self.windy_data.get(WINDY_STATION_ID, "")): str,
WINDY_STATION_ID, default=self.windy_data.get(WINDY_STATION_ID, "")
): str,
vol.Optional( vol.Optional(
WINDY_STATION_PW, WINDY_STATION_PW,
default=self.windy_data.get(WINDY_STATION_PW, ""), default=self.windy_data.get(WINDY_STATION_PW, ""),
): str, ): str,
vol.Optional(WINDY_ENABLED, default=self.windy_data[WINDY_ENABLED]): bool vol.Optional(WINDY_ENABLED, default=self.windy_data[WINDY_ENABLED]): bool or False,
or False,
vol.Optional( vol.Optional(
WINDY_LOGGER_ENABLED, WINDY_LOGGER_ENABLED,
default=self.windy_data[WINDY_LOGGER_ENABLED], default=self.windy_data[WINDY_LOGGER_ENABLED],
@ -116,11 +108,11 @@ class ConfigOptionsFlowHandler(OptionsFlow):
} }
self.pocasi_cz = { self.pocasi_cz = {
POCASI_CZ_API_ID: entry_data.get(POCASI_CZ_API_ID, ""), POCASI_CZ_API_ID: self.config_entry.options.get(POCASI_CZ_API_ID, ""),
POCASI_CZ_API_KEY: entry_data.get(POCASI_CZ_API_KEY, ""), POCASI_CZ_API_KEY: self.config_entry.options.get(POCASI_CZ_API_KEY, ""),
POCASI_CZ_ENABLED: entry_data.get(POCASI_CZ_ENABLED, False), POCASI_CZ_ENABLED: self.config_entry.options.get(POCASI_CZ_ENABLED, False),
POCASI_CZ_LOGGER_ENABLED: entry_data.get(POCASI_CZ_LOGGER_ENABLED, False), POCASI_CZ_LOGGER_ENABLED: self.config_entry.options.get(POCASI_CZ_LOGGER_ENABLED, False),
POCASI_CZ_SEND_INTERVAL: entry_data.get(POCASI_CZ_SEND_INTERVAL, 30), POCASI_CZ_SEND_INTERVAL: self.config_entry.options.get(POCASI_CZ_SEND_INTERVAL, 30),
} }
self.pocasi_cz_schema = { self.pocasi_cz_schema = {
@ -142,11 +134,13 @@ class ConfigOptionsFlowHandler(OptionsFlow):
ECOWITT_ENABLED: self.config_entry.options.get(ECOWITT_ENABLED, False), 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] = {}): async def async_step_init(self, user_input: dict[str, Any] = {}):
"""Manage the options - show menu first.""" """Manage the options - show menu first."""
_ = user_input _ = user_input
return self.async_show_menu( 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): async def async_step_basic(self, user_input: Any = None):
@ -283,6 +277,28 @@ class ConfigOptionsFlowHandler(OptionsFlow):
user_input = self.retain_data(user_input) user_input = self.retain_data(user_input)
return self.async_create_entry(title=DOMAIN, 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]: def retain_data(self, data: dict[str, Any]) -> dict[str, Any]:
"""Retain user_data.""" """Retain user_data."""
@ -292,6 +308,7 @@ class ConfigOptionsFlowHandler(OptionsFlow):
**self.pocasi_cz, **self.pocasi_cz,
**self.sensors, **self.sensors,
**self.ecowitt, **self.ecowitt,
**self.wslink_addon_port,
**dict(data), **dict(data),
} }

View File

@ -143,6 +143,7 @@ POCASI_CZ_SEND_MINIMUM: Final = 12 # minimal time to resend data
WSLINK: Final = "wslink" WSLINK: Final = "wslink"
WINDY_MAX_RETRIES: Final = 3 WINDY_MAX_RETRIES: Final = 3
WSLINK_ADDON_PORT: Final = "WSLINK_ADDON_PORT"
__all__ = [ __all__ = [
"DOMAIN", "DOMAIN",
@ -243,13 +244,7 @@ WINDY_STATION_ID = "WINDY_STATION_ID"
WINDY_STATION_PW = "WINDY_STATION_PWD" WINDY_STATION_PW = "WINDY_STATION_PWD"
WINDY_ENABLED: Final = "windy_enabled_checkbox" WINDY_ENABLED: Final = "windy_enabled_checkbox"
WINDY_LOGGER_ENABLED: Final = "windy_logger_checkbox" WINDY_LOGGER_ENABLED: Final = "windy_logger_checkbox"
WINDY_NOT_INSERTED: Final = ( WINDY_NOT_INSERTED: Final = "Windy responded with 400 error. Invalid ID/password combination?"
"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_INVALID_KEY: Final = ( WINDY_INVALID_KEY: Final = (
"Windy API KEY is invalid. Send data to Windy is now disabled. Check your API KEY and try again." "Windy API KEY is invalid. Send data to Windy is now disabled. Check your API KEY and try again."
) )

View File

@ -44,6 +44,7 @@
"windy": "Nastavení pro přeposílání dat na Windy", "windy": "Nastavení pro přeposílání dat na Windy",
"pocasi": "Nastavení pro přeposlání dat na Počasí Meteo CZ", "pocasi": "Nastavení pro přeposlání dat na Počasí Meteo CZ",
"ecowitt": "Nastavení pro stanice Ecowitt", "ecowitt": "Nastavení pro stanice Ecowitt",
"wslink_port_setup": "Nastavení portu WSLink Addonu",
"migration": "Migrace statistiky senzoru" "migration": "Migrace statistiky senzoru"
} }
}, },
@ -108,6 +109,16 @@
"ecowitt_enabled": "Povolit přijímání dat ze stanic Ecowitt" "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": { "migration": {
"title": "Migrace statistiky senzoru.", "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ů.", "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ů.",