mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 05:07:41 +00:00
Motion Blinds dhcp discovery (#68809)
Co-authored-by: J. Nick Koston <nick@koston.org>
This commit is contained in:
parent
8eb2e131e5
commit
98ca9754d7
@ -5,9 +5,11 @@ from motionblinds import AsyncMotionMulticast, MotionDiscovery
|
|||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant import config_entries
|
from homeassistant import config_entries
|
||||||
from homeassistant.components import network
|
from homeassistant.components import dhcp, network
|
||||||
from homeassistant.const import CONF_API_KEY, CONF_HOST
|
from homeassistant.const import CONF_API_KEY, CONF_HOST
|
||||||
from homeassistant.core import callback
|
from homeassistant.core import callback
|
||||||
|
from homeassistant.data_entry_flow import FlowResult
|
||||||
|
from homeassistant.helpers.device_registry import format_mac
|
||||||
|
|
||||||
from .const import (
|
from .const import (
|
||||||
CONF_INTERFACE,
|
CONF_INTERFACE,
|
||||||
@ -72,6 +74,21 @@ class MotionBlindsFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
"""Get the options flow."""
|
"""Get the options flow."""
|
||||||
return OptionsFlowHandler(config_entry)
|
return OptionsFlowHandler(config_entry)
|
||||||
|
|
||||||
|
async def async_step_dhcp(self, discovery_info: dhcp.DhcpServiceInfo) -> FlowResult:
|
||||||
|
"""Handle discovery via dhcp."""
|
||||||
|
mac_address = format_mac(discovery_info.macaddress).replace(":", "")
|
||||||
|
await self.async_set_unique_id(mac_address)
|
||||||
|
self._abort_if_unique_id_configured(updates={CONF_HOST: discovery_info.ip})
|
||||||
|
|
||||||
|
short_mac = mac_address[-6:].upper()
|
||||||
|
self.context["title_placeholders"] = {
|
||||||
|
"short_mac": short_mac,
|
||||||
|
"ip_address": discovery_info.ip,
|
||||||
|
}
|
||||||
|
|
||||||
|
self._host = discovery_info.ip
|
||||||
|
return await self.async_step_connect()
|
||||||
|
|
||||||
async def async_step_user(self, user_input=None):
|
async def async_step_user(self, user_input=None):
|
||||||
"""Handle a flow initialized by the user."""
|
"""Handle a flow initialized by the user."""
|
||||||
errors = {}
|
errors = {}
|
||||||
@ -137,7 +154,7 @@ class MotionBlindsFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
|
|
||||||
mac_address = motion_gateway.mac
|
mac_address = motion_gateway.mac
|
||||||
|
|
||||||
await self.async_set_unique_id(mac_address)
|
await self.async_set_unique_id(mac_address, raise_on_progress=False)
|
||||||
self._abort_if_unique_id_configured(
|
self._abort_if_unique_id_configured(
|
||||||
updates={
|
updates={
|
||||||
CONF_HOST: self._host,
|
CONF_HOST: self._host,
|
||||||
|
@ -5,6 +5,12 @@
|
|||||||
"documentation": "https://www.home-assistant.io/integrations/motion_blinds",
|
"documentation": "https://www.home-assistant.io/integrations/motion_blinds",
|
||||||
"requirements": ["motionblinds==0.6.2"],
|
"requirements": ["motionblinds==0.6.2"],
|
||||||
"dependencies": ["network"],
|
"dependencies": ["network"],
|
||||||
|
"dhcp": [
|
||||||
|
{"registered_devices": true},
|
||||||
|
{
|
||||||
|
"hostname": "motion_*"
|
||||||
|
}
|
||||||
|
],
|
||||||
"codeowners": ["@starkillerOG"],
|
"codeowners": ["@starkillerOG"],
|
||||||
"iot_class": "local_push",
|
"iot_class": "local_push",
|
||||||
"loggers": ["motionblinds"]
|
"loggers": ["motionblinds"]
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"config": {
|
"config": {
|
||||||
|
"flow_title": "{short_mac} ({ip_address})",
|
||||||
"step": {
|
"step": {
|
||||||
"user": {
|
"user": {
|
||||||
"description": "Connect to your Motion Gateway, if the IP address is not set, auto-discovery is used",
|
"description": "Connect to your Motion Gateway, if the IP address is not set, auto-discovery is used",
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
"discovery_error": "Failed to discover a Motion Gateway",
|
"discovery_error": "Failed to discover a Motion Gateway",
|
||||||
"invalid_interface": "Invalid network interface"
|
"invalid_interface": "Invalid network interface"
|
||||||
},
|
},
|
||||||
"flow_title": "Motion Blinds",
|
"flow_title": "{short_mac} ({ip_address})",
|
||||||
"step": {
|
"step": {
|
||||||
"connect": {
|
"connect": {
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -55,6 +55,8 @@ DHCP: list[dict[str, str | bool]] = [
|
|||||||
{'domain': 'lyric', 'hostname': 'lyric-*', 'macaddress': '48A2E6*'},
|
{'domain': 'lyric', 'hostname': 'lyric-*', 'macaddress': '48A2E6*'},
|
||||||
{'domain': 'lyric', 'hostname': 'lyric-*', 'macaddress': 'B82CA0*'},
|
{'domain': 'lyric', 'hostname': 'lyric-*', 'macaddress': 'B82CA0*'},
|
||||||
{'domain': 'lyric', 'hostname': 'lyric-*', 'macaddress': '00D02D*'},
|
{'domain': 'lyric', 'hostname': 'lyric-*', 'macaddress': '00D02D*'},
|
||||||
|
{'domain': 'motion_blinds', 'registered_devices': True},
|
||||||
|
{'domain': 'motion_blinds', 'hostname': 'motion_*'},
|
||||||
{'domain': 'myq', 'macaddress': '645299*'},
|
{'domain': 'myq', 'macaddress': '645299*'},
|
||||||
{'domain': 'nest', 'macaddress': '18B430*'},
|
{'domain': 'nest', 'macaddress': '18B430*'},
|
||||||
{'domain': 'nest', 'macaddress': '641666*'},
|
{'domain': 'nest', 'macaddress': '641666*'},
|
||||||
|
@ -5,6 +5,7 @@ from unittest.mock import Mock, patch
|
|||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from homeassistant import config_entries, data_entry_flow
|
from homeassistant import config_entries, data_entry_flow
|
||||||
|
from homeassistant.components import dhcp
|
||||||
from homeassistant.components.motion_blinds import const
|
from homeassistant.components.motion_blinds import const
|
||||||
from homeassistant.components.motion_blinds.config_flow import DEFAULT_GATEWAY_NAME
|
from homeassistant.components.motion_blinds.config_flow import DEFAULT_GATEWAY_NAME
|
||||||
from homeassistant.const import CONF_API_KEY, CONF_HOST
|
from homeassistant.const import CONF_API_KEY, CONF_HOST
|
||||||
@ -337,6 +338,36 @@ async def test_config_flow_invalid_interface(hass):
|
|||||||
assert result["errors"] == {const.CONF_INTERFACE: "invalid_interface"}
|
assert result["errors"] == {const.CONF_INTERFACE: "invalid_interface"}
|
||||||
|
|
||||||
|
|
||||||
|
async def test_dhcp_flow(hass):
|
||||||
|
"""Successful flow from DHCP discovery."""
|
||||||
|
dhcp_data = dhcp.DhcpServiceInfo(
|
||||||
|
ip=TEST_HOST,
|
||||||
|
hostname="MOTION_abcdef",
|
||||||
|
macaddress=TEST_MAC,
|
||||||
|
)
|
||||||
|
|
||||||
|
result = await hass.config_entries.flow.async_init(
|
||||||
|
const.DOMAIN, context={"source": config_entries.SOURCE_DHCP}, data=dhcp_data
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result["type"] == "form"
|
||||||
|
assert result["step_id"] == "connect"
|
||||||
|
assert result["errors"] == {}
|
||||||
|
|
||||||
|
result = await hass.config_entries.flow.async_configure(
|
||||||
|
result["flow_id"],
|
||||||
|
{CONF_API_KEY: TEST_API_KEY},
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result["type"] == "create_entry"
|
||||||
|
assert result["title"] == DEFAULT_GATEWAY_NAME
|
||||||
|
assert result["data"] == {
|
||||||
|
CONF_HOST: TEST_HOST,
|
||||||
|
CONF_API_KEY: TEST_API_KEY,
|
||||||
|
const.CONF_INTERFACE: TEST_HOST_HA,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
async def test_options_flow(hass):
|
async def test_options_flow(hass):
|
||||||
"""Test specifying non default settings using options flow."""
|
"""Test specifying non default settings using options flow."""
|
||||||
config_entry = MockConfigEntry(
|
config_entry = MockConfigEntry(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user