From c9671a5c589fe62fccfd5195cab5851e8bcbcaf8 Mon Sep 17 00:00:00 2001 From: Jean-Marc Collin Date: Sun, 22 Oct 2023 15:31:49 +0000 Subject: [PATCH] Add configFlow and translations --- .../versatile_thermostat/config_flow.py | 59 +++++++++++++++++-- .../versatile_thermostat/const.py | 22 +++++-- .../versatile_thermostat/strings.json | 37 ++++++++---- .../versatile_thermostat/translations/en.json | 3 +- .../versatile_thermostat/translations/fr.json | 27 +++++++-- .../versatile_thermostat/translations/it.json | 37 ++++++++---- 6 files changed, 149 insertions(+), 36 deletions(-) diff --git a/custom_components/versatile_thermostat/config_flow.py b/custom_components/versatile_thermostat/config_flow.py index a198771..1987242 100644 --- a/custom_components/versatile_thermostat/config_flow.py +++ b/custom_components/versatile_thermostat/config_flow.py @@ -1,3 +1,7 @@ +# pylint: disable=line-too-long +# pylint: disable=too-many-lines +# pylint: disable=invalid-name + """Config flow for Versatile Thermostat integration.""" from __future__ import annotations @@ -24,6 +28,7 @@ from homeassistant.helpers.entity_component import EntityComponent from homeassistant.helpers import selector from homeassistant.components.climate import ClimateEntity, DOMAIN as CLIMATE_DOMAIN from homeassistant.components.switch import DOMAIN as SWITCH_DOMAIN +from homeassistant.components.number import DOMAIN as NUMBER_DOMAIN from homeassistant.components.input_boolean import ( DOMAIN as INPUT_BOOLEAN_DOMAIN, ) @@ -91,6 +96,11 @@ from .const import ( CONF_USE_POWER_FEATURE, CONF_AC_MODE, CONF_THERMOSTAT_TYPES, + CONF_THERMOSTAT_VALVE, + CONF_VALVE, + CONF_VALVE_2, + CONF_VALVE_3, + CONF_VALVE_4, UnknownEntity, WindowOpenDetectionMethod, ) @@ -249,6 +259,39 @@ class VersatileThermostatBaseConfigFlow(FlowHandler): } ) + self.STEP_THERMOSTAT_VALVE = vol.Schema( # pylint: disable=invalid-name + { + vol.Required(CONF_VALVE): selector.EntitySelector( + selector.EntitySelectorConfig( + domain=[NUMBER_DOMAIN, INPUT_NUMBER_DOMAIN] + ), + ), + vol.Optional(CONF_VALVE_2): selector.EntitySelector( + selector.EntitySelectorConfig( + domain=[NUMBER_DOMAIN, INPUT_NUMBER_DOMAIN] + ), + ), + vol.Optional(CONF_VALVE_3): selector.EntitySelector( + selector.EntitySelectorConfig( + domain=[NUMBER_DOMAIN, INPUT_NUMBER_DOMAIN] + ), + ), + vol.Optional(CONF_VALVE_4): selector.EntitySelector( + selector.EntitySelectorConfig( + domain=[NUMBER_DOMAIN, INPUT_NUMBER_DOMAIN] + ), + ), + vol.Required( + CONF_PROP_FUNCTION, default=PROPORTIONAL_FUNCTION_TPI + ): vol.In( + [ + PROPORTIONAL_FUNCTION_TPI, + ] + ), + vol.Optional(CONF_AC_MODE, default=False): cv.boolean, + } + ) + self.STEP_TPI_DATA_SCHEMA = vol.Schema( # pylint: disable=invalid-name { vol.Required(CONF_TPI_COEF_INT, default=0.6): vol.Coerce(float), @@ -479,6 +522,10 @@ class VersatileThermostatBaseConfigFlow(FlowHandler): return await self.generic_step( "type", self.STEP_THERMOSTAT_SWITCH, user_input, self.async_step_tpi ) + elif self._infos[CONF_THERMOSTAT_TYPE] == CONF_THERMOSTAT_VALVE: + return await self.generic_step( + "type", self.STEP_THERMOSTAT_VALVE, user_input, self.async_step_tpi + ) else: return await self.generic_step( "type", @@ -509,7 +556,7 @@ class VersatileThermostatBaseConfigFlow(FlowHandler): elif self._infos[CONF_USE_PRESENCE_FEATURE]: next_step = self.async_step_presence - if self._infos.get(CONF_AC_MODE) == True: + if self._infos.get(CONF_AC_MODE) is True: schema = self.STEP_PRESETS_WITH_AC_DATA_SCHEMA else: schema = self.STEP_PRESETS_DATA_SCHEMA @@ -565,7 +612,7 @@ class VersatileThermostatBaseConfigFlow(FlowHandler): """Handle the presence management flow steps""" _LOGGER.debug("Into ConfigFlow.async_step_presence user_input=%s", user_input) - if self._infos.get(CONF_AC_MODE) == True: + if self._infos.get(CONF_AC_MODE) is True: schema = self.STEP_PRESENCE_WITH_AC_DATA_SCHEMA else: schema = self.STEP_PRESENCE_DATA_SCHEMA @@ -670,6 +717,10 @@ class VersatileThermostatOptionsFlowHandler( return await self.generic_step( "type", self.STEP_THERMOSTAT_SWITCH, user_input, self.async_step_tpi ) + elif self._infos[CONF_THERMOSTAT_TYPE] == CONF_THERMOSTAT_VALVE: + return await self.generic_step( + "type", self.STEP_THERMOSTAT_VALVE, user_input, self.async_step_tpi + ) else: return await self.generic_step( "type", @@ -704,7 +755,7 @@ class VersatileThermostatOptionsFlowHandler( elif self._infos[CONF_USE_PRESENCE_FEATURE]: next_step = self.async_step_presence - if self._infos.get(CONF_AC_MODE) == True: + if self._infos.get(CONF_AC_MODE) is True: schema = self.STEP_PRESETS_WITH_AC_DATA_SCHEMA else: schema = self.STEP_PRESETS_DATA_SCHEMA @@ -767,7 +818,7 @@ class VersatileThermostatOptionsFlowHandler( "Into OptionsFlowHandler.async_step_presence user_input=%s", user_input ) - if self._infos.get(CONF_AC_MODE) == True: + if self._infos.get(CONF_AC_MODE) is True: schema = self.STEP_PRESENCE_WITH_AC_DATA_SCHEMA else: schema = self.STEP_PRESENCE_DATA_SCHEMA diff --git a/custom_components/versatile_thermostat/const.py b/custom_components/versatile_thermostat/const.py index 4ef34e2..87900e5 100644 --- a/custom_components/versatile_thermostat/const.py +++ b/custom_components/versatile_thermostat/const.py @@ -11,16 +11,16 @@ from homeassistant.components.climate import ( ClimateEntityFeature, ) -PRESET_AC_SUFFIX = "_ac" -PRESET_ECO_AC = PRESET_ECO + PRESET_AC_SUFFIX -PRESET_COMFORT_AC = PRESET_COMFORT + PRESET_AC_SUFFIX -PRESET_BOOST_AC = PRESET_BOOST + PRESET_AC_SUFFIX - from homeassistant.exceptions import HomeAssistantError from .prop_algorithm import ( PROPORTIONAL_FUNCTION_TPI, ) +PRESET_AC_SUFFIX = "_ac" +PRESET_ECO_AC = PRESET_ECO + PRESET_AC_SUFFIX +PRESET_COMFORT_AC = PRESET_COMFORT + PRESET_AC_SUFFIX +PRESET_BOOST_AC = PRESET_BOOST + PRESET_AC_SUFFIX + DEVICE_MANUFACTURER = "JMCOLLIN" DEVICE_MODEL = "Versatile Thermostat" @@ -65,6 +65,7 @@ CONF_SECURITY_DEFAULT_ON_PERCENT = "security_default_on_percent" CONF_THERMOSTAT_TYPE = "thermostat_type" CONF_THERMOSTAT_SWITCH = "thermostat_over_switch" CONF_THERMOSTAT_CLIMATE = "thermostat_over_climate" +CONF_THERMOSTAT_VALVE = "thermostat_over_valve" CONF_CLIMATE = "climate_entity_id" CONF_CLIMATE_2 = "climate_entity2_id" CONF_CLIMATE_3 = "climate_entity3_id" @@ -77,6 +78,10 @@ CONF_AC_MODE = "ac_mode" CONF_WINDOW_AUTO_OPEN_THRESHOLD = "window_auto_open_threshold" CONF_WINDOW_AUTO_CLOSE_THRESHOLD = "window_auto_close_threshold" CONF_WINDOW_AUTO_MAX_DURATION = "window_auto_max_duration" +CONF_VALVE = "valve_entity_id" +CONF_VALVE_2 = "valve_entity2_id" +CONF_VALVE_3 = "valve_entity3_id" +CONF_VALVE_4 = "valve_entity4_id" CONF_PRESETS = { p: f"{p}_temp" @@ -174,6 +179,11 @@ ALL_CONF = ( CONF_USE_PRESENCE_FEATURE, CONF_USE_POWER_FEATURE, CONF_AC_MODE, + CONF_VALVE, + CONF_VALVE_2, + CONF_VALVE_3, + CONF_VALVE_4, + ] + CONF_PRESETS_VALUES + CONF_PRESETS_AWAY_VALUES @@ -185,7 +195,7 @@ CONF_FUNCTIONS = [ PROPORTIONAL_FUNCTION_TPI, ] -CONF_THERMOSTAT_TYPES = [CONF_THERMOSTAT_SWITCH, CONF_THERMOSTAT_CLIMATE] +CONF_THERMOSTAT_TYPES = [CONF_THERMOSTAT_SWITCH, CONF_THERMOSTAT_CLIMATE, CONF_THERMOSTAT_VALVE] SUPPORT_FLAGS = ClimateEntityFeature.TARGET_TEMPERATURE diff --git a/custom_components/versatile_thermostat/strings.json b/custom_components/versatile_thermostat/strings.json index 263e00c..0db2ed6 100644 --- a/custom_components/versatile_thermostat/strings.json +++ b/custom_components/versatile_thermostat/strings.json @@ -34,7 +34,11 @@ "climate_entity2_id": "2nd underlying climate", "climate_entity3_id": "3rd underlying climate", "climate_entity4_id": "4th underlying climate", - "ac_mode": "AC mode" + "ac_mode": "AC mode", + "valve_entity_id": "1rst valve number", + "valve_entity2_id": "2nd valve number", + "valve_entity3_id": "3rd valve number", + "valve_entity4_id": "4th valve number" }, "data_description": { "heater_entity_id": "Mandatory heater entity id", @@ -46,7 +50,11 @@ "climate_entity2_id": "2nd underlying climate entity id", "climate_entity3_id": "3rd underlying climate entity id", "climate_entity4_id": "4th underlying climate entity id", - "ac_mode": "Use the Air Conditioning (AC) mode" + "ac_mode": "Use the Air Conditioning (AC) mode", + "valve_entity_id": "1rst valve number entity id", + "valve_entity2_id": "2nd valve number entity id", + "valve_entity3_id": "3rd valve number entity id", + "valve_entity4_id": "4th valve number entity id" } }, "tpi": { @@ -178,16 +186,20 @@ "title": "Linked entities", "description": "Linked entities attributes", "data": { - "heater_entity_id": "Heater switch", - "heater_entity2_id": "2nd Heater switch", - "heater_entity3_id": "3rd Heater switch", - "heater_entity4_id": "4th Heater switch", + "heater_entity_id": "1rst heater switch", + "heater_entity2_id": "2nd heater switch", + "heater_entity3_id": "3rd heater switch", + "heater_entity4_id": "4th heater switch", "proportional_function": "Algorithm", - "climate_entity_id": "Underlying thermostat", + "climate_entity_id": "1rst underlying climate", "climate_entity2_id": "2nd underlying climate", "climate_entity3_id": "3rd underlying climate", "climate_entity4_id": "4th underlying climate", - "ac_mode": "AC mode" + "ac_mode": "AC mode", + "valve_entity_id": "1rst valve number", + "valve_entity2_id": "2nd valve number", + "valve_entity3_id": "3rd valve number", + "valve_entity4_id": "4th valve number" }, "data_description": { "heater_entity_id": "Mandatory heater entity id", @@ -199,7 +211,11 @@ "climate_entity2_id": "2nd underlying climate entity id", "climate_entity3_id": "3rd underlying climate entity id", "climate_entity4_id": "4th underlying climate entity id", - "ac_mode": "Use the Air Conditioning (AC) mode" + "ac_mode": "Use the Air Conditioning (AC) mode", + "valve_entity_id": "1rst valve number entity id", + "valve_entity2_id": "2nd valve number entity id", + "valve_entity3_id": "3rd valve number entity id", + "valve_entity4_id": "4th valve number entity id" } }, "tpi": { @@ -310,7 +326,8 @@ "thermostat_type": { "options": { "thermostat_over_switch": "Thermostat over a switch", - "thermostat_over_climate": "Thermostat over another thermostat" + "thermostat_over_climate": "Thermostat over a climate", + "thermostat_over_valve": "Thermostat over a valve" } } }, diff --git a/custom_components/versatile_thermostat/translations/en.json b/custom_components/versatile_thermostat/translations/en.json index 263e00c..93dae60 100644 --- a/custom_components/versatile_thermostat/translations/en.json +++ b/custom_components/versatile_thermostat/translations/en.json @@ -310,7 +310,8 @@ "thermostat_type": { "options": { "thermostat_over_switch": "Thermostat over a switch", - "thermostat_over_climate": "Thermostat over another thermostat" + "thermostat_over_climate": "Thermostat over another thermostat", + "thermostat_over_valve": "Thermostat over a valve" } } }, diff --git a/custom_components/versatile_thermostat/translations/fr.json b/custom_components/versatile_thermostat/translations/fr.json index 2334f2d..b2b23f7 100644 --- a/custom_components/versatile_thermostat/translations/fr.json +++ b/custom_components/versatile_thermostat/translations/fr.json @@ -34,7 +34,11 @@ "climate_entity2_id": "2ème thermostat sous-jacent", "climate_entity3_id": "3ème thermostat sous-jacent", "climate_entity4_id": "4ème thermostat sous-jacent", - "ac_mode": "AC mode ?" + "ac_mode": "AC mode ?", + "valve_entity_id": "1ère valve number", + "valve_entity2_id": "2ème valve number", + "valve_entity3_id": "3ème valve number", + "valve_entity4_id": "4ème valve number" }, "data_description": { "heater_entity_id": "Entity id du 1er radiateur obligatoire", @@ -46,7 +50,11 @@ "climate_entity2_id": "Entity id du 2ème thermostat sous-jacent", "climate_entity3_id": "Entity id du 3ème thermostat sous-jacent", "climate_entity4_id": "Entity id du 4ème thermostat sous-jacent", - "ac_mode": "Utilisation du mode Air Conditionné (AC)" + "ac_mode": "Utilisation du mode Air Conditionné (AC)", + "valve_entity_id": "Entity id de la 1ère valve", + "valve_entity2_id": "Entity id de la 2ème valve", + "valve_entity3_id": "Entity id de la 3ème valve", + "valve_entity4_id": "Entity id de la 4ème valve" } }, "tpi": { @@ -188,7 +196,11 @@ "climate_entity2_id": "2ème thermostat sous-jacent", "climate_entity3_id": "3ème thermostat sous-jacent", "climate_entity4_id": "4ème thermostat sous-jacent", - "ac_mode": "AC mode ?" + "ac_mode": "AC mode ?", + "valve_entity_id": "1ère valve number", + "valve_entity2_id": "2ème valve number", + "valve_entity3_id": "3ème valve number", + "valve_entity4_id": "4ème valve number" }, "data_description": { "heater_entity_id": "Entity id du 1er radiateur obligatoire", @@ -200,7 +212,11 @@ "climate_entity2_id": "Entity id du 2ème thermostat sous-jacent", "climate_entity3_id": "Entity id du 3ème thermostat sous-jacent", "climate_entity4_id": "Entity id du 4ème thermostat sous-jacent", - "ac_mode": "Utilisation du mode Air Conditionné (AC)" + "ac_mode": "Utilisation du mode Air Conditionné (AC)", + "valve_entity_id": "Entity id de la 1ère valve", + "valve_entity2_id": "Entity id de la 2ème valve", + "valve_entity3_id": "Entity id de la 3ème valve", + "valve_entity4_id": "Entity id de la 4ème valve" } }, "tpi": { @@ -311,7 +327,8 @@ "thermostat_type": { "options": { "thermostat_over_switch": "Thermostat sur un switch", - "thermostat_over_climate": "Thermostat sur un autre thermostat" + "thermostat_over_climate": "Thermostat sur un autre thermostat", + "thermostat_over_valve": "Thermostat sur une valve" } } }, diff --git a/custom_components/versatile_thermostat/translations/it.json b/custom_components/versatile_thermostat/translations/it.json index f8a19de..e7f5230 100644 --- a/custom_components/versatile_thermostat/translations/it.json +++ b/custom_components/versatile_thermostat/translations/it.json @@ -34,7 +34,11 @@ "climate_entity2_id": "Secundo termostato sottostante", "climate_entity3_id": "Terzo termostato sottostante", "climate_entity4_id": "Quarto termostato sottostante", - "ac_mode": "AC mode ?" + "ac_mode": "AC mode ?", + "valve_entity_id": "Primo valvola numero", + "valve_entity2_id": "Secondo valvola numero", + "valve_entity3_id": "Terzo valvola numero", + "valve_entity4_id": "Quarto valvola numero" }, "data_description": { "heater_entity_id": "Entity id obbligatoria del primo riscaldatore", @@ -46,7 +50,11 @@ "climate_entity2_id": "Entity id del secundo termostato sottostante", "climate_entity3_id": "Entity id del terzo termostato sottostante", "climate_entity4_id": "Entity id del quarto termostato sottostante", - "ac_mode": "Utilizzare la modalità AC (Air Conditioned) ?" + "ac_mode": "Utilizzare la modalità AC (Air Conditioned) ?", + "valve_entity_id": "Entity id del primo valvola numero", + "valve_entity2_id": "Entity id del secondo valvola numero", + "valve_entity3_id": "Entity id del terzo valvola numero", + "valve_entity4_id": "Entity id del quarto valvola numero" } }, "tpi": { @@ -169,18 +177,22 @@ }, "type": { "title": "Entità collegate", - "description": "Attributi delle entità collegate", + "description": "Parametri entità collegate", "data": { - "heater_entity_id": "Interruttore riscaldatore", - "heater_entity2_id": "Secondo interruttore riscaldatore", - "heater_entity3_id": "Terzo interruttore riscaldatore", - "heater_entity4_id": "Quarto interruttore riscaldatore", + "heater_entity_id": "Primo riscaldatore", + "heater_entity2_id": "Secondo riscaldatore", + "heater_entity3_id": "Terzo riscaldatore", + "heater_entity4_id": "Quarto riscaldatore", "proportional_function": "Algoritmo", "climate_entity_id": "Termostato sottostante", "climate_entity2_id": "Secundo termostato sottostante", "climate_entity3_id": "Terzo termostato sottostante", "climate_entity4_id": "Quarto termostato sottostante", - "ac_mode": "AC mode ?" + "ac_mode": "AC mode ?", + "valve_entity_id": "Primo valvola numero", + "valve_entity2_id": "Secondo valvola numero", + "valve_entity3_id": "Terzo valvola numero", + "valve_entity4_id": "Quarto valvola numero" }, "data_description": { "heater_entity_id": "Entity id obbligatoria del primo riscaldatore", @@ -192,7 +204,11 @@ "climate_entity2_id": "Entity id del secundo termostato sottostante", "climate_entity3_id": "Entity id del terzo termostato sottostante", "climate_entity4_id": "Entity id del quarto termostato sottostante", - "ac_mode": "Utilizzare la modalità AC (Air Conditioned) ?" + "ac_mode": "Utilizzare la modalità AC (Air Conditioned) ?", + "valve_entity_id": "Entity id del primo valvola numero", + "valve_entity2_id": "Entity id del secondo valvola numero", + "valve_entity3_id": "Entity id del terzo valvola numero", + "valve_entity4_id": "Entity id del quarto valvola numero" } }, "tpi": { @@ -296,7 +312,8 @@ "thermostat_type": { "options": { "thermostat_over_switch": "Termostato su un interruttore", - "thermostat_over_climate": "Termostato sopra un altro termostato" + "thermostat_over_climate": "Termostato sopra un altro termostato", + "thermostat_over_valve": "Thermostato su una valvola" } } },