core/homeassistant/components/wilight/config_flow.py

103 lines
3.6 KiB
Python

"""Config flow to configure WiLight."""
from urllib.parse import urlparse
import pywilight
from homeassistant.components import ssdp
from homeassistant.config_entries import ConfigFlow
from homeassistant.const import CONF_HOST
from homeassistant.data_entry_flow import FlowResult
from . import DOMAIN
CONF_SERIAL_NUMBER = "serial_number"
CONF_MODEL_NAME = "model_name"
WILIGHT_MANUFACTURER = "All Automacao Ltda"
# List the components supported by this integration.
ALLOWED_WILIGHT_COMPONENTS = ["cover", "fan", "light", "switch"]
class WiLightFlowHandler(ConfigFlow, domain=DOMAIN):
"""Handle a WiLight config flow."""
VERSION = 1
def __init__(self):
"""Initialize the WiLight flow."""
self._host = None
self._serial_number = None
self._title = None
self._model_name = None
self._wilight_components = []
self._components_text = ""
def _wilight_update(self, host, serial_number, model_name):
self._host = host
self._serial_number = serial_number
self._title = f"WL{serial_number}"
self._model_name = model_name
self._wilight_components = pywilight.get_components_from_model(model_name)
self._components_text = ", ".join(self._wilight_components)
return self._components_text != ""
def _get_entry(self):
data = {
CONF_HOST: self._host,
CONF_SERIAL_NUMBER: self._serial_number,
CONF_MODEL_NAME: self._model_name,
}
return self.async_create_entry(title=self._title, data=data)
async def async_step_ssdp(self, discovery_info: ssdp.SsdpServiceInfo) -> FlowResult:
"""Handle a discovered WiLight."""
# Filter out basic information
if (
not discovery_info.ssdp_location
or ssdp.ATTR_UPNP_MANUFACTURER not in discovery_info.upnp
or ssdp.ATTR_UPNP_SERIAL not in discovery_info.upnp
or ssdp.ATTR_UPNP_MODEL_NAME not in discovery_info.upnp
or ssdp.ATTR_UPNP_MODEL_NUMBER not in discovery_info.upnp
):
return self.async_abort(reason="not_wilight_device")
# Filter out non-WiLight devices
if discovery_info.upnp[ssdp.ATTR_UPNP_MANUFACTURER] != WILIGHT_MANUFACTURER:
return self.async_abort(reason="not_wilight_device")
host = urlparse(discovery_info.ssdp_location).hostname
serial_number = discovery_info.upnp[ssdp.ATTR_UPNP_SERIAL]
model_name = discovery_info.upnp[ssdp.ATTR_UPNP_MODEL_NAME]
if not self._wilight_update(host, serial_number, model_name):
return self.async_abort(reason="not_wilight_device")
# Check if all components of this WiLight are allowed in this version of the HA integration
component_ok = all(
wilight_component in ALLOWED_WILIGHT_COMPONENTS
for wilight_component in self._wilight_components
)
if not component_ok:
return self.async_abort(reason="not_supported_device")
await self.async_set_unique_id(self._serial_number)
self._abort_if_unique_id_configured(updates={CONF_HOST: self._host})
self.context["title_placeholders"] = {"name": self._title}
return await self.async_step_confirm()
async def async_step_confirm(self, user_input=None):
"""Handle user-confirmation of discovered WiLight."""
if user_input is not None:
return self._get_entry()
return self.async_show_form(
step_id="confirm",
description_placeholders={
"name": self._title,
"components": self._components_text,
},
errors={},
)