mirror of
https://github.com/home-assistant/core.git
synced 2025-05-01 12:47:53 +00:00
Add ZiGate device on automatic integration USB and ZEROCONF (#68577)
Co-authored-by: J. Nick Koston <nick@koston.org>
This commit is contained in:
parent
9a5e0281db
commit
1d63c2069e
@ -164,9 +164,15 @@ class ZhaFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
"""Handle zeroconf discovery."""
|
"""Handle zeroconf discovery."""
|
||||||
# Hostname is format: livingroom.local.
|
# Hostname is format: livingroom.local.
|
||||||
local_name = discovery_info.hostname[:-1]
|
local_name = discovery_info.hostname[:-1]
|
||||||
|
radio_type = discovery_info.properties.get("radio_type") or local_name
|
||||||
node_name = local_name[: -len(".local")]
|
node_name = local_name[: -len(".local")]
|
||||||
host = discovery_info.host
|
host = discovery_info.host
|
||||||
device_path = f"socket://{host}:6638"
|
if local_name.startswith("tube") or "efr32" in local_name:
|
||||||
|
# This is hard coded to work with legacy devices
|
||||||
|
port = 6638
|
||||||
|
else:
|
||||||
|
port = discovery_info.port
|
||||||
|
device_path = f"socket://{host}:{port}"
|
||||||
|
|
||||||
if current_entry := await self.async_set_unique_id(node_name):
|
if current_entry := await self.async_set_unique_id(node_name):
|
||||||
self._abort_if_unique_id_configured(
|
self._abort_if_unique_id_configured(
|
||||||
@ -187,9 +193,12 @@ class ZhaFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
}
|
}
|
||||||
|
|
||||||
self._device_path = device_path
|
self._device_path = device_path
|
||||||
self._radio_type = (
|
if "efr32" in radio_type:
|
||||||
RadioType.ezsp.name if "efr32" in local_name else RadioType.znp.name
|
self._radio_type = RadioType.ezsp.name
|
||||||
)
|
elif "zigate" in radio_type:
|
||||||
|
self._radio_type = RadioType.zigate.name
|
||||||
|
else:
|
||||||
|
self._radio_type = RadioType.znp.name
|
||||||
|
|
||||||
return await self.async_step_port_config()
|
return await self.async_step_port_config()
|
||||||
|
|
||||||
|
@ -57,6 +57,18 @@
|
|||||||
"description": "*zigbee*",
|
"description": "*zigbee*",
|
||||||
"known_devices": ["Nortek HUSBZB-1"]
|
"known_devices": ["Nortek HUSBZB-1"]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"vid": "0403",
|
||||||
|
"pid": "6015",
|
||||||
|
"description": "*zigate*",
|
||||||
|
"known_devices": ["ZiGate+"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vid": "10C4",
|
||||||
|
"pid": "EA60",
|
||||||
|
"description": "*zigate*",
|
||||||
|
"known_devices": ["ZiGate"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"vid": "10C4",
|
"vid": "10C4",
|
||||||
"pid": "8B34",
|
"pid": "8B34",
|
||||||
@ -69,6 +81,10 @@
|
|||||||
{
|
{
|
||||||
"type": "_esphomelib._tcp.local.",
|
"type": "_esphomelib._tcp.local.",
|
||||||
"name": "tube*"
|
"name": "tube*"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "_zigate-zigbee-gateway._tcp.local.",
|
||||||
|
"name": "*zigate*"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"after_dependencies": ["usb", "zeroconf"],
|
"after_dependencies": ["usb", "zeroconf"],
|
||||||
|
@ -77,6 +77,18 @@ USB = [
|
|||||||
"pid": "8A2A",
|
"pid": "8A2A",
|
||||||
"description": "*zigbee*"
|
"description": "*zigbee*"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"domain": "zha",
|
||||||
|
"vid": "0403",
|
||||||
|
"pid": "6015",
|
||||||
|
"description": "*zigate*"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"domain": "zha",
|
||||||
|
"vid": "10C4",
|
||||||
|
"pid": "EA60",
|
||||||
|
"description": "*zigate*"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"domain": "zha",
|
"domain": "zha",
|
||||||
"vid": "10C4",
|
"vid": "10C4",
|
||||||
|
@ -381,6 +381,12 @@ ZEROCONF = {
|
|||||||
"domain": "kodi"
|
"domain": "kodi"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"_zigate-zigbee-gateway._tcp.local.": [
|
||||||
|
{
|
||||||
|
"domain": "zha",
|
||||||
|
"name": "*zigate*"
|
||||||
|
}
|
||||||
|
],
|
||||||
"_zwave-js-server._tcp.local.": [
|
"_zwave-js-server._tcp.local.": [
|
||||||
{
|
{
|
||||||
"domain": "zwave_js"
|
"domain": "zwave_js"
|
||||||
|
@ -52,8 +52,8 @@ async def test_discovery(detect_mock, hass):
|
|||||||
service_info = zeroconf.ZeroconfServiceInfo(
|
service_info = zeroconf.ZeroconfServiceInfo(
|
||||||
host="192.168.1.200",
|
host="192.168.1.200",
|
||||||
addresses=["192.168.1.200"],
|
addresses=["192.168.1.200"],
|
||||||
hostname="_tube_zb_gw._tcp.local.",
|
hostname="tube._tube_zb_gw._tcp.local.",
|
||||||
name="mock_name",
|
name="tube",
|
||||||
port=6053,
|
port=6053,
|
||||||
properties={"name": "tube_123456"},
|
properties={"name": "tube_123456"},
|
||||||
type="mock_type",
|
type="mock_type",
|
||||||
@ -77,6 +77,68 @@ async def test_discovery(detect_mock, hass):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@patch("homeassistant.components.zha.async_setup_entry", AsyncMock(return_value=True))
|
||||||
|
@patch("zigpy_zigate.zigbee.application.ControllerApplication.probe")
|
||||||
|
async def test_zigate_via_zeroconf(probe_mock, hass):
|
||||||
|
"""Test zeroconf flow -- zigate radio detected."""
|
||||||
|
service_info = zeroconf.ZeroconfServiceInfo(
|
||||||
|
host="192.168.1.200",
|
||||||
|
addresses=["192.168.1.200"],
|
||||||
|
hostname="_zigate-zigbee-gateway._tcp.local.",
|
||||||
|
name="any",
|
||||||
|
port=1234,
|
||||||
|
properties={"radio_type": "zigate"},
|
||||||
|
type="mock_type",
|
||||||
|
)
|
||||||
|
flow = await hass.config_entries.flow.async_init(
|
||||||
|
"zha", context={"source": SOURCE_ZEROCONF}, data=service_info
|
||||||
|
)
|
||||||
|
result = await hass.config_entries.flow.async_configure(
|
||||||
|
flow["flow_id"], user_input={}
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result["type"] == RESULT_TYPE_CREATE_ENTRY
|
||||||
|
assert result["title"] == "socket://192.168.1.200:1234"
|
||||||
|
assert result["data"] == {
|
||||||
|
CONF_DEVICE: {
|
||||||
|
CONF_DEVICE_PATH: "socket://192.168.1.200:1234",
|
||||||
|
},
|
||||||
|
CONF_RADIO_TYPE: "zigate",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@patch("homeassistant.components.zha.async_setup_entry", AsyncMock(return_value=True))
|
||||||
|
@patch("bellows.zigbee.application.ControllerApplication.probe", return_value=True)
|
||||||
|
async def test_efr32_via_zeroconf(probe_mock, hass):
|
||||||
|
"""Test zeroconf flow -- efr32 radio detected."""
|
||||||
|
service_info = zeroconf.ZeroconfServiceInfo(
|
||||||
|
host="192.168.1.200",
|
||||||
|
addresses=["192.168.1.200"],
|
||||||
|
hostname="efr32._esphomelib._tcp.local.",
|
||||||
|
name="efr32",
|
||||||
|
port=1234,
|
||||||
|
properties={},
|
||||||
|
type="mock_type",
|
||||||
|
)
|
||||||
|
flow = await hass.config_entries.flow.async_init(
|
||||||
|
"zha", context={"source": SOURCE_ZEROCONF}, data=service_info
|
||||||
|
)
|
||||||
|
result = await hass.config_entries.flow.async_configure(
|
||||||
|
flow["flow_id"], user_input={"baudrate": 115200}
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result["type"] == RESULT_TYPE_CREATE_ENTRY
|
||||||
|
assert result["title"] == "socket://192.168.1.200:6638"
|
||||||
|
assert result["data"] == {
|
||||||
|
CONF_DEVICE: {
|
||||||
|
CONF_DEVICE_PATH: "socket://192.168.1.200:6638",
|
||||||
|
CONF_BAUDRATE: 115200,
|
||||||
|
CONF_FLOWCONTROL: "software",
|
||||||
|
},
|
||||||
|
CONF_RADIO_TYPE: "ezsp",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@patch("homeassistant.components.zha.async_setup_entry", AsyncMock(return_value=True))
|
@patch("homeassistant.components.zha.async_setup_entry", AsyncMock(return_value=True))
|
||||||
@patch("zigpy_znp.zigbee.application.ControllerApplication.probe", return_value=True)
|
@patch("zigpy_znp.zigbee.application.ControllerApplication.probe", return_value=True)
|
||||||
async def test_discovery_via_zeroconf_ip_change(detect_mock, hass):
|
async def test_discovery_via_zeroconf_ip_change(detect_mock, hass):
|
||||||
@ -183,6 +245,43 @@ async def test_discovery_via_usb(detect_mock, hass):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@patch("zigpy_zigate.zigbee.application.ControllerApplication.probe")
|
||||||
|
async def test_zigate_discovery_via_usb(detect_mock, hass):
|
||||||
|
"""Test zigate usb flow -- radio detected."""
|
||||||
|
discovery_info = usb.UsbServiceInfo(
|
||||||
|
device="/dev/ttyZIGBEE",
|
||||||
|
pid="0403",
|
||||||
|
vid="6015",
|
||||||
|
serial_number="1234",
|
||||||
|
description="zigate radio",
|
||||||
|
manufacturer="test",
|
||||||
|
)
|
||||||
|
result = await hass.config_entries.flow.async_init(
|
||||||
|
"zha", context={"source": SOURCE_USB}, data=discovery_info
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
assert result["type"] == RESULT_TYPE_FORM
|
||||||
|
assert result["step_id"] == "confirm"
|
||||||
|
|
||||||
|
with patch("homeassistant.components.zha.async_setup_entry"):
|
||||||
|
result2 = await hass.config_entries.flow.async_configure(
|
||||||
|
result["flow_id"], user_input={}
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
assert result2["type"] == RESULT_TYPE_CREATE_ENTRY
|
||||||
|
assert (
|
||||||
|
"zigate radio - /dev/ttyZIGBEE, s/n: 1234 - test - 6015:0403"
|
||||||
|
in result2["title"]
|
||||||
|
)
|
||||||
|
assert result2["data"] == {
|
||||||
|
"device": {
|
||||||
|
"path": "/dev/ttyZIGBEE",
|
||||||
|
},
|
||||||
|
CONF_RADIO_TYPE: "zigate",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@patch("zigpy_znp.zigbee.application.ControllerApplication.probe", return_value=False)
|
@patch("zigpy_znp.zigbee.application.ControllerApplication.probe", return_value=False)
|
||||||
async def test_discovery_via_usb_no_radio(detect_mock, hass):
|
async def test_discovery_via_usb_no_radio(detect_mock, hass):
|
||||||
"""Test usb flow -- no radio detected."""
|
"""Test usb flow -- no radio detected."""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user