| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- import logging
- import voluptuous as vol
- from homeassistant import config_entries, data_entry_flow
- from homeassistant.const import CONF_HOST, CONF_NAME
- from homeassistant.core import HomeAssistant, callback
- from . import DOMAIN, individual_config_schema, TuyaLocalDevice
- from .const import CONF_DEVICE_ID, CONF_LOCAL_KEY
- _LOGGER = logging.getLogger(__name__)
- class ConfigFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
- VERSION = 1
- CONNECTION_CLASS = config_entries.CONN_CLASS_LOCAL_POLL
- async def async_step_user(self, user_input=None):
- errors = {}
- if user_input is not None:
- await self.async_set_unique_id(user_input[CONF_DEVICE_ID])
- self._abort_if_unique_id_configured()
- connect_success = await async_test_connection(user_input, self.hass)
- if connect_success:
- title = user_input[CONF_NAME]
- del user_input[CONF_NAME]
- return self.async_create_entry(title=title, data=user_input)
- else:
- errors["base"] = "connection"
- return self.async_show_form(
- step_id="user",
- data_schema=vol.Schema(individual_config_schema(user_input or {})),
- errors=errors,
- )
- async def async_step_import(self, user_input):
- title = user_input[CONF_NAME]
- del user_input[CONF_NAME]
- user_input[config_entries.SOURCE_IMPORT] = True
- current_entries = self.hass.config_entries.async_entries(DOMAIN)
- existing_entry = next(
- (
- entry
- for entry in current_entries
- if entry.data[CONF_DEVICE_ID] == user_input[CONF_DEVICE_ID]
- ),
- None,
- )
- if existing_entry is not None:
- self.hass.config_entries.async_update_entry(
- existing_entry, title=title, options=user_input
- )
- return self.async_abort(reason="imported")
- else:
- await self.async_set_unique_id(user_input[CONF_DEVICE_ID])
- return self.async_create_entry(title=title, data=user_input)
- @staticmethod
- @callback
- def async_get_options_flow(config_entry):
- return OptionsFlowHandler(config_entry)
- class OptionsFlowHandler(config_entries.OptionsFlow):
- def __init__(self, config_entry):
- """Initialize options flow."""
- self.config_entry = config_entry
- async def async_step_init(self, user_input=None):
- if self.config_entry.data.get(config_entries.SOURCE_IMPORT, False):
- return await self.async_step_imported(user_input)
- else:
- return await self.async_step_user(user_input)
- async def async_step_user(self, user_input=None):
- """Manage the options."""
- errors = {}
- config = {**self.config_entry.data, **self.config_entry.options}
- if user_input is not None:
- config = {**config, **user_input}
- connect_success = await async_test_connection(config, self.hass)
- if connect_success:
- return self.async_create_entry(title="", data=user_input)
- else:
- errors["base"] = "connection"
- return self.async_show_form(
- step_id="user",
- data_schema=vol.Schema(
- individual_config_schema(defaults=config, options_only=True)
- ),
- errors=errors,
- )
- async def async_step_imported(self, user_input=None):
- return {**self.async_abort(reason="imported"), "data": {}}
- async def async_test_connection(config: dict, hass: HomeAssistant):
- device = TuyaLocalDevice(
- "Test", config[CONF_DEVICE_ID], config[CONF_HOST], config[CONF_LOCAL_KEY], hass
- )
- await device.async_refresh()
- return device.get_property("1") is not None or device.get_property("3") is not None
|