diff --git a/homeassistant/components/unifiprotect/camera.py b/homeassistant/components/unifiprotect/camera.py index 3149647a4ed..f6109e897cf 100644 --- a/homeassistant/components/unifiprotect/camera.py +++ b/homeassistant/components/unifiprotect/camera.py @@ -40,7 +40,9 @@ def get_camera_channels( is_default = True for channel in camera.channels: - if channel.is_rtsp_enabled: + if channel.is_package: + yield camera, channel, True + elif channel.is_rtsp_enabled: yield camera, channel, is_default is_default = False @@ -60,6 +62,8 @@ async def async_setup_entry( entities = [] for camera, channel, is_default in get_camera_channels(data.api): + # do not enable streaming for package camera + # 2 FPS causes a lot of buferring entities.append( ProtectCamera( data, @@ -67,11 +71,11 @@ async def async_setup_entry( channel, is_default, True, - disable_stream, + disable_stream or channel.is_package, ) ) - if channel.is_rtsp_enabled: + if channel.is_rtsp_enabled and not channel.is_package: entities.append( ProtectCamera( data, diff --git a/homeassistant/components/unifiprotect/manifest.json b/homeassistant/components/unifiprotect/manifest.json index 9bb9c8cc297..d60697969bf 100644 --- a/homeassistant/components/unifiprotect/manifest.json +++ b/homeassistant/components/unifiprotect/manifest.json @@ -4,7 +4,7 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/unifiprotect", "requirements": [ - "pyunifiprotect==1.6.1" + "pyunifiprotect==1.6.2" ], "dependencies": [ "http" diff --git a/homeassistant/components/unifiprotect/select.py b/homeassistant/components/unifiprotect/select.py index bd9ec7cddd5..95e4b3152d8 100644 --- a/homeassistant/components/unifiprotect/select.py +++ b/homeassistant/components/unifiprotect/select.py @@ -48,7 +48,7 @@ INFRARED_MODES = [ CHIME_TYPES = [ {"id": ChimeType.NONE.value, "name": "None"}, - {"id": ChimeType.MECHINCAL.value, "name": "Mechanical"}, + {"id": ChimeType.MECHANICAL.value, "name": "Mechanical"}, {"id": ChimeType.DIGITAL.value, "name": "Digital"}, ] diff --git a/requirements_all.txt b/requirements_all.txt index bbc52aa0fc0..25871c9bebc 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2015,7 +2015,7 @@ pytrafikverket==0.1.6.2 pyudev==0.22.0 # homeassistant.components.unifiprotect -pyunifiprotect==1.6.1 +pyunifiprotect==1.6.2 # homeassistant.components.uptimerobot pyuptimerobot==21.11.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 349aff71c6e..6cc6d6061cb 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1240,7 +1240,7 @@ pytrafikverket==0.1.6.2 pyudev==0.22.0 # homeassistant.components.unifiprotect -pyunifiprotect==1.6.1 +pyunifiprotect==1.6.2 # homeassistant.components.uptimerobot pyuptimerobot==21.11.0 diff --git a/tests/components/unifiprotect/test_camera.py b/tests/components/unifiprotect/test_camera.py index dfec45dc211..2c150155bf1 100644 --- a/tests/components/unifiprotect/test_camera.py +++ b/tests/components/unifiprotect/test_camera.py @@ -259,16 +259,37 @@ async def test_basic_setup( camera_no_channels.channels[1].is_rtsp_enabled = False camera_no_channels.channels[2].is_rtsp_enabled = False + camera_package = mock_camera.copy(deep=True) + camera_package._api = mock_entry.api + camera_package.channels[0]._api = mock_entry.api + camera_package.channels[1]._api = mock_entry.api + camera_package.channels[2]._api = mock_entry.api + camera_package.name = "Test Camera 5" + camera_package.id = "test_package" + camera_package.channels[0].is_rtsp_enabled = True + camera_package.channels[0].name = "High" + camera_package.channels[0].rtsp_alias = "test_high_alias" + camera_package.channels[1].is_rtsp_enabled = False + camera_package.channels[2].is_rtsp_enabled = False + package_channel = camera_package.channels[0].copy(deep=True) + package_channel.is_rtsp_enabled = False + package_channel.name = "Package Camera" + package_channel.id = 3 + package_channel.fps = 2 + package_channel.rtsp_alias = "test_package_alias" + camera_package.channels.append(package_channel) + mock_entry.api.bootstrap.cameras = { camera_high_only.id: camera_high_only, camera_medium_only.id: camera_medium_only, camera_all_channels.id: camera_all_channels, camera_no_channels.id: camera_no_channels, + camera_package.id: camera_package, } await hass.config_entries.async_setup(mock_entry.entry.entry_id) await hass.async_block_till_done() - assert_entity_counts(hass, Platform.CAMERA, 11, 4) + assert_entity_counts(hass, Platform.CAMERA, 14, 6) # test camera 1 entity_id = validate_default_camera_entity(hass, camera_high_only, 0) @@ -316,6 +337,19 @@ async def test_basic_setup( hass, camera_no_channels, 0, entity_id, features=0 ) + # test camera 5 + entity_id = validate_default_camera_entity(hass, camera_package, 0) + await validate_rtsps_camera_state(hass, camera_package, 0, entity_id) + + entity_id = validate_rtsp_camera_entity(hass, camera_package, 0) + await enable_entity(hass, mock_entry.entry.entry_id, entity_id) + await validate_rtsp_camera_state(hass, camera_package, 0, entity_id) + + entity_id = validate_default_camera_entity(hass, camera_package, 3) + await validate_no_stream_camera_state( + hass, camera_package, 3, entity_id, features=0 + ) + async def test_missing_channels( hass: HomeAssistant, mock_entry: MockEntityFixture, mock_camera: ProtectCamera