Skip to content

Commit

Permalink
Update config and options flow (#298)
Browse files Browse the repository at this point in the history
* Use suggested values for all schema
* Force token input to not be a password field
* Fix depreciation warning "Detected that custom integration sets option flow config_entry explicitly"
  • Loading branch information
mill1000 authored Jan 27, 2025
1 parent 01ea9d8 commit aaad7eb
Showing 1 changed file with 44 additions and 60 deletions.
104 changes: 44 additions & 60 deletions custom_components/midea_ac/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@
CountrySelectorConfig,
SelectSelector,
SelectSelectorConfig,
SelectSelectorMode)
SelectSelectorMode, TextSelector,
TextSelectorConfig,
TextSelectorType)
from msmart.const import DeviceType
from msmart.device import AirConditioner as AC
from msmart.discover import Discover
Expand Down Expand Up @@ -97,15 +99,16 @@ async def async_step_discover(
# Indicate a connection could not be made
return self.async_abort(reason="cannot_connect")

data_schema = vol.Schema({
vol.Optional(CONF_HOST, default=""): str,
vol.Optional(
CONF_COUNTRY_CODE, default=CONF_DEFAULT_CLOUD_COUNTRY
): CountrySelector(
CountrySelectorConfig(
countries=CONF_CLOUD_COUNTRY_CODES)
),
})
data_schema = self.add_suggested_values_to_schema(
vol.Schema({
vol.Optional(CONF_HOST, default=""): str,
vol.Optional(
CONF_COUNTRY_CODE, default=CONF_DEFAULT_CLOUD_COUNTRY
): CountrySelector(
CountrySelectorConfig(
countries=CONF_CLOUD_COUNTRY_CODES)
),
}), user_input)

return self.async_show_form(step_id="discover",
data_schema=data_schema, errors=errors)
Expand Down Expand Up @@ -194,18 +197,14 @@ async def async_step_manual(self, user_input) -> FlowResult:

user_input = user_input or {}

data_schema = vol.Schema({
vol.Required(CONF_ID,
default=user_input.get(CONF_ID)): cv.string,
vol.Required(CONF_HOST,
default=user_input.get(CONF_HOST)): cv.string,
vol.Required(CONF_PORT,
default=user_input.get(CONF_PORT, 6444)): cv.port,
vol.Optional(CONF_TOKEN,
description={"suggested_value": user_input.get(CONF_TOKEN, "")}): cv.string,
vol.Optional(CONF_KEY,
description={"suggested_value": user_input.get(CONF_KEY, "")}): cv.string
})
data_schema = self.add_suggested_values_to_schema(
vol.Schema({
vol.Required(CONF_ID): cv.string,
vol.Required(CONF_HOST): cv.string,
vol.Required(CONF_PORT, default=6444): cv.port,
vol.Optional(CONF_TOKEN): TextSelector(TextSelectorConfig(type=TextSelectorType.TEXT)),
vol.Optional(CONF_KEY): cv.string
}), user_input)

return self.async_show_form(step_id="manual",
data_schema=data_schema, errors=errors)
Expand Down Expand Up @@ -250,50 +249,35 @@ async def _create_entry_from_device(self, device) -> FlowResult:

@staticmethod
@callback
def async_get_options_flow(config_entry: ConfigEntry) -> OptionsFlow:
"""Return the options flow."""
return MideaOptionsFlow(config_entry)
def async_get_options_flow(config_entry: ConfigEntry) -> MideaOptionsFlow:
"""Create the options flow."""
return MideaOptionsFlow()


class MideaOptionsFlow(OptionsFlow):
"""Options flow from Midea Smart AC."""

def __init__(self, config_entry: ConfigEntry) -> None:
self.config_entry = config_entry

async def async_step_init(self, user_input=None) -> FlowResult:
"""Handle the first step of options flow."""
"""Handle the options flow."""
if user_input is not None:
# Confusingly, data argument in OptionsFlow is passed to async_setup_entry in the options member
return self.async_create_entry(title="", data=user_input)

options = self.config_entry.options

data_schema = vol.Schema({
vol.Optional(CONF_BEEP,
default=options.get(CONF_BEEP, True)): cv.boolean,
vol.Optional(CONF_TEMP_STEP,
default=options.get(CONF_TEMP_STEP, 1.0)): vol.All(vol.Coerce(float), vol.Range(min=0.5, max=5)),
vol.Optional(CONF_FAN_SPEED_STEP,
default=options.get(CONF_FAN_SPEED_STEP, 1)): vol.All(vol.Coerce(float), vol.Range(min=1, max=20)),
vol.Optional(CONF_USE_FAN_ONLY_WORKAROUND,
default=options.get(CONF_USE_FAN_ONLY_WORKAROUND, False)): cv.boolean,
vol.Optional(CONF_SHOW_ALL_PRESETS,
default=options.get(CONF_SHOW_ALL_PRESETS, False)): cv.boolean,
vol.Optional(CONF_ADDITIONAL_OPERATION_MODES,
description={"suggested_value": options.get(CONF_ADDITIONAL_OPERATION_MODES, None)}): cv.string,
vol.Optional(CONF_MAX_CONNECTION_LIFETIME,
description={"suggested_value": options.get(CONF_MAX_CONNECTION_LIFETIME, None)}): vol.All(vol.Coerce(int), vol.Range(min=30)),
vol.Optional(CONF_ENERGY_FORMAT,
default=options.get(
CONF_ENERGY_FORMAT, EnergyFormat.DEFAULT)
): SelectSelector(
SelectSelectorConfig(
options=[e.value for e in EnergyFormat],
translation_key="energy_format",
mode=SelectSelectorMode.DROPDOWN,
)
),
})
return self.async_create_entry(data=user_input)

data_schema = self.add_suggested_values_to_schema(
vol.Schema({
vol.Optional(CONF_BEEP): cv.boolean,
vol.Optional(CONF_TEMP_STEP): vol.All(vol.Coerce(float), vol.Range(min=0.5, max=5)),
vol.Optional(CONF_FAN_SPEED_STEP): vol.All(vol.Coerce(float), vol.Range(min=1, max=20)),
vol.Optional(CONF_USE_FAN_ONLY_WORKAROUND): cv.boolean,
vol.Optional(CONF_SHOW_ALL_PRESETS): cv.boolean,
vol.Optional(CONF_ADDITIONAL_OPERATION_MODES): cv.string,
vol.Optional(CONF_MAX_CONNECTION_LIFETIME): vol.All(vol.Coerce(int), vol.Range(min=30)),
vol.Optional(CONF_ENERGY_FORMAT): SelectSelector(
SelectSelectorConfig(
options=[e.value for e in EnergyFormat],
translation_key="energy_format",
mode=SelectSelectorMode.DROPDOWN,
)
),
}), self.config_entry.options)

return self.async_show_form(step_id="init", data_schema=data_schema)

0 comments on commit aaad7eb

Please sign in to comment.