diff --git a/homeassistant/components/onvif/__init__.py b/homeassistant/components/onvif/__init__.py index 044a37edd72..8956f0ae2f9 100644 --- a/homeassistant/components/onvif/__init__.py +++ b/homeassistant/components/onvif/__init__.py @@ -2,13 +2,8 @@ from onvif.exceptions import ONVIFAuthError, ONVIFError, ONVIFTimeoutError from homeassistant.components.ffmpeg import CONF_EXTRA_ARGUMENTS -from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry +from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( - CONF_HOST, - CONF_NAME, - CONF_PASSWORD, - CONF_PORT, - CONF_USERNAME, EVENT_HOMEASSISTANT_STOP, HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION, @@ -16,51 +11,17 @@ from homeassistant.const import ( ) from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryNotReady -from homeassistant.helpers import config_per_platform -from homeassistant.helpers.typing import ConfigType from .const import ( CONF_RTSP_TRANSPORT, CONF_SNAPSHOT_AUTH, DEFAULT_ARGUMENTS, - DEFAULT_NAME, - DEFAULT_PASSWORD, - DEFAULT_PORT, - DEFAULT_USERNAME, DOMAIN, RTSP_TRANS_PROTOCOLS, ) from .device import ONVIFDevice -async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: - """Set up the ONVIF component.""" - # Import from yaml - configs = {} - for p_type, p_config in config_per_platform(config, "camera"): - if p_type != DOMAIN: - continue - - config = p_config.copy() - if config[CONF_HOST] not in configs: - configs[config[CONF_HOST]] = { - CONF_HOST: config[CONF_HOST], - CONF_NAME: config.get(CONF_NAME, DEFAULT_NAME), - CONF_PASSWORD: config.get(CONF_PASSWORD, DEFAULT_PASSWORD), - CONF_PORT: config.get(CONF_PORT, DEFAULT_PORT), - CONF_USERNAME: config.get(CONF_USERNAME, DEFAULT_USERNAME), - } - - for conf in configs.values(): - hass.async_create_task( - hass.config_entries.flow.async_init( - DOMAIN, context={"source": SOURCE_IMPORT}, data=conf - ) - ) - - return True - - async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up ONVIF from a config entry.""" if DOMAIN not in hass.data: diff --git a/homeassistant/components/onvif/config_flow.py b/homeassistant/components/onvif/config_flow.py index b4193f0def7..c4579702675 100644 --- a/homeassistant/components/onvif/config_flow.py +++ b/homeassistant/components/onvif/config_flow.py @@ -261,10 +261,6 @@ class OnvifFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): finally: await device.close() - async def async_step_import(self, user_input): - """Handle import.""" - return await self.async_step_configure(user_input) - class OnvifOptionsFlowHandler(config_entries.OptionsFlow): """Handle ONVIF options.""" diff --git a/homeassistant/components/onvif/const.py b/homeassistant/components/onvif/const.py index dc0688c4b30..3a2e802a5a0 100644 --- a/homeassistant/components/onvif/const.py +++ b/homeassistant/components/onvif/const.py @@ -5,10 +5,7 @@ LOGGER = logging.getLogger(__package__) DOMAIN = "onvif" -DEFAULT_NAME = "ONVIF Camera" -DEFAULT_PORT = 5000 -DEFAULT_USERNAME = "admin" -DEFAULT_PASSWORD = "888888" +DEFAULT_PORT = 80 DEFAULT_ARGUMENTS = "-pred 1" CONF_DEVICE_ID = "deviceid" diff --git a/tests/components/onvif/test_config_flow.py b/tests/components/onvif/test_config_flow.py index d4a90ce81c6..0760ead2ba1 100644 --- a/tests/components/onvif/test_config_flow.py +++ b/tests/components/onvif/test_config_flow.py @@ -1,9 +1,6 @@ """Test ONVIF config flow.""" from unittest.mock import MagicMock, patch -from onvif.exceptions import ONVIFError -from zeep.exceptions import Fault - from homeassistant import config_entries, data_entry_flow from homeassistant.components.onvif import config_flow @@ -13,7 +10,6 @@ from . import ( NAME, PASSWORD, PORT, - SERIAL_NUMBER, URN, USERNAME, setup_mock_device, @@ -107,8 +103,6 @@ async def test_flow_discovered_devices(hass): assert result["step_id"] == "configure" with patch( - "homeassistant.components.onvif.async_setup", return_value=True - ) as mock_setup, patch( "homeassistant.components.onvif.async_setup_entry", return_value=True ) as mock_setup_entry: result = await hass.config_entries.flow.async_configure( @@ -120,7 +114,6 @@ async def test_flow_discovered_devices(hass): ) await hass.async_block_till_done() - assert len(mock_setup.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1 assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY @@ -290,8 +283,6 @@ async def test_flow_manual_entry(hass): assert result["step_id"] == "configure" with patch( - "homeassistant.components.onvif.async_setup", return_value=True - ) as mock_setup, patch( "homeassistant.components.onvif.async_setup_entry", return_value=True ) as mock_setup_entry: result = await hass.config_entries.flow.async_configure( @@ -306,7 +297,6 @@ async def test_flow_manual_entry(hass): ) await hass.async_block_till_done() - assert len(mock_setup.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1 assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY @@ -320,189 +310,6 @@ async def test_flow_manual_entry(hass): } -async def test_flow_import_not_implemented(hass): - """Test that config flow uses Serial Number when no MAC available.""" - with patch( - "homeassistant.components.onvif.config_flow.get_device" - ) as mock_onvif_camera, patch( - "homeassistant.components.onvif.ONVIFDevice" - ) as mock_device, patch( - "homeassistant.components.onvif.async_setup", return_value=True - ) as mock_setup, patch( - "homeassistant.components.onvif.async_setup_entry", return_value=True - ) as mock_setup_entry: - setup_mock_onvif_camera(mock_onvif_camera, with_interfaces_not_implemented=True) - setup_mock_device(mock_device) - - result = await hass.config_entries.flow.async_init( - config_flow.DOMAIN, - context={"source": config_entries.SOURCE_IMPORT}, - data={ - config_flow.CONF_NAME: NAME, - config_flow.CONF_HOST: HOST, - config_flow.CONF_PORT: PORT, - config_flow.CONF_USERNAME: USERNAME, - config_flow.CONF_PASSWORD: PASSWORD, - }, - ) - - await hass.async_block_till_done() - assert len(mock_setup.mock_calls) == 1 - assert len(mock_setup_entry.mock_calls) == 1 - - assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY - assert result["title"] == f"{NAME} - {SERIAL_NUMBER}" - assert result["data"] == { - config_flow.CONF_NAME: NAME, - config_flow.CONF_HOST: HOST, - config_flow.CONF_PORT: PORT, - config_flow.CONF_USERNAME: USERNAME, - config_flow.CONF_PASSWORD: PASSWORD, - } - - -async def test_flow_import_no_mac(hass): - """Test that config flow uses Serial Number when no MAC available.""" - with patch( - "homeassistant.components.onvif.config_flow.get_device" - ) as mock_onvif_camera, patch( - "homeassistant.components.onvif.ONVIFDevice" - ) as mock_device, patch( - "homeassistant.components.onvif.async_setup", return_value=True - ) as mock_setup, patch( - "homeassistant.components.onvif.async_setup_entry", return_value=True - ) as mock_setup_entry: - setup_mock_onvif_camera(mock_onvif_camera, with_interfaces=False) - setup_mock_device(mock_device) - - result = await hass.config_entries.flow.async_init( - config_flow.DOMAIN, - context={"source": config_entries.SOURCE_IMPORT}, - data={ - config_flow.CONF_NAME: NAME, - config_flow.CONF_HOST: HOST, - config_flow.CONF_PORT: PORT, - config_flow.CONF_USERNAME: USERNAME, - config_flow.CONF_PASSWORD: PASSWORD, - }, - ) - - await hass.async_block_till_done() - assert len(mock_setup.mock_calls) == 1 - assert len(mock_setup_entry.mock_calls) == 1 - - assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY - assert result["title"] == f"{NAME} - {SERIAL_NUMBER}" - assert result["data"] == { - config_flow.CONF_NAME: NAME, - config_flow.CONF_HOST: HOST, - config_flow.CONF_PORT: PORT, - config_flow.CONF_USERNAME: USERNAME, - config_flow.CONF_PASSWORD: PASSWORD, - } - - -async def test_flow_import_no_mac_or_serial(hass): - """Test that config flow fails when no MAC or Serial Number available.""" - with patch( - "homeassistant.components.onvif.config_flow.get_device" - ) as mock_onvif_camera: - setup_mock_onvif_camera( - mock_onvif_camera, with_interfaces=False, with_serial=False - ) - - result = await hass.config_entries.flow.async_init( - config_flow.DOMAIN, - context={"source": config_entries.SOURCE_IMPORT}, - data={ - config_flow.CONF_NAME: NAME, - config_flow.CONF_HOST: HOST, - config_flow.CONF_PORT: PORT, - config_flow.CONF_USERNAME: USERNAME, - config_flow.CONF_PASSWORD: PASSWORD, - }, - ) - - assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT - assert result["reason"] == "no_mac" - - -async def test_flow_import_no_h264(hass): - """Test that config flow fails when no MAC available.""" - with patch( - "homeassistant.components.onvif.config_flow.get_device" - ) as mock_onvif_camera: - setup_mock_onvif_camera(mock_onvif_camera, with_h264=False) - - result = await hass.config_entries.flow.async_init( - config_flow.DOMAIN, - context={"source": config_entries.SOURCE_IMPORT}, - data={ - config_flow.CONF_NAME: NAME, - config_flow.CONF_HOST: HOST, - config_flow.CONF_PORT: PORT, - config_flow.CONF_USERNAME: USERNAME, - config_flow.CONF_PASSWORD: PASSWORD, - }, - ) - - assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT - assert result["reason"] == "no_h264" - - -async def test_flow_import_onvif_api_error(hass): - """Test that config flow fails when ONVIF API fails.""" - with patch( - "homeassistant.components.onvif.config_flow.get_device" - ) as mock_onvif_camera: - setup_mock_onvif_camera(mock_onvif_camera) - mock_onvif_camera.create_devicemgmt_service = MagicMock( - side_effect=ONVIFError("Could not get device mgmt service") - ) - - result = await hass.config_entries.flow.async_init( - config_flow.DOMAIN, - context={"source": config_entries.SOURCE_IMPORT}, - data={ - config_flow.CONF_NAME: NAME, - config_flow.CONF_HOST: HOST, - config_flow.CONF_PORT: PORT, - config_flow.CONF_USERNAME: USERNAME, - config_flow.CONF_PASSWORD: PASSWORD, - }, - ) - - assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT - assert result["reason"] == "onvif_error" - - -async def test_flow_import_onvif_auth_error(hass): - """Test that config flow fails when ONVIF API fails.""" - with patch( - "homeassistant.components.onvif.config_flow.get_device" - ) as mock_onvif_camera: - setup_mock_onvif_camera(mock_onvif_camera) - mock_onvif_camera.create_devicemgmt_service = MagicMock( - side_effect=Fault("Auth Error") - ) - - result = await hass.config_entries.flow.async_init( - config_flow.DOMAIN, - context={"source": config_entries.SOURCE_IMPORT}, - data={ - config_flow.CONF_NAME: NAME, - config_flow.CONF_HOST: HOST, - config_flow.CONF_PORT: PORT, - config_flow.CONF_USERNAME: USERNAME, - config_flow.CONF_PASSWORD: PASSWORD, - }, - ) - - assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "configure" - assert result["errors"]["base"] == "cannot_connect" - - async def test_option_flow(hass): """Test config flow options.""" entry, _, _ = await setup_onvif_integration(hass)