103 lines
3.6 KiB
Python
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={},
|
|
)
|