Add EntityFeature enum to Camera (#69072)
This commit is contained in:
parent
7f1b90a51c
commit
93571c2d01
3 changed files with 21 additions and 9 deletions
|
@ -8,6 +8,7 @@ from collections.abc import Awaitable, Callable, Iterable
|
||||||
from contextlib import suppress
|
from contextlib import suppress
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
from enum import IntEnum
|
||||||
from functools import partial
|
from functools import partial
|
||||||
import hashlib
|
import hashlib
|
||||||
import logging
|
import logging
|
||||||
|
@ -88,7 +89,16 @@ STATE_RECORDING: Final = "recording"
|
||||||
STATE_STREAMING: Final = "streaming"
|
STATE_STREAMING: Final = "streaming"
|
||||||
STATE_IDLE: Final = "idle"
|
STATE_IDLE: Final = "idle"
|
||||||
|
|
||||||
# Bitfield of features supported by the camera entity
|
|
||||||
|
class CameraEntityFeature(IntEnum):
|
||||||
|
"""Supported features of the camera entity."""
|
||||||
|
|
||||||
|
ON_OFF = 1
|
||||||
|
STREAM = 2
|
||||||
|
|
||||||
|
|
||||||
|
# These SUPPORT_* constants are deprecated as of Home Assistant 2022.5.
|
||||||
|
# Pleease use the CameraEntityFeature enum instead.
|
||||||
SUPPORT_ON_OFF: Final = 1
|
SUPPORT_ON_OFF: Final = 1
|
||||||
SUPPORT_STREAM: Final = 2
|
SUPPORT_STREAM: Final = 2
|
||||||
|
|
||||||
|
@ -499,7 +509,7 @@ class Camera(Entity):
|
||||||
"""
|
"""
|
||||||
if hasattr(self, "_attr_frontend_stream_type"):
|
if hasattr(self, "_attr_frontend_stream_type"):
|
||||||
return self._attr_frontend_stream_type
|
return self._attr_frontend_stream_type
|
||||||
if not self.supported_features & SUPPORT_STREAM:
|
if not self.supported_features & CameraEntityFeature.STREAM:
|
||||||
return None
|
return None
|
||||||
if self._rtsp_to_webrtc:
|
if self._rtsp_to_webrtc:
|
||||||
return STREAM_TYPE_WEB_RTC
|
return STREAM_TYPE_WEB_RTC
|
||||||
|
@ -535,7 +545,8 @@ class Camera(Entity):
|
||||||
async def stream_source(self) -> str | None:
|
async def stream_source(self) -> str | None:
|
||||||
"""Return the source of the stream.
|
"""Return the source of the stream.
|
||||||
|
|
||||||
This is used by cameras with SUPPORT_STREAM and STREAM_TYPE_HLS.
|
This is used by cameras with CameraEntityFeature.STREAM
|
||||||
|
and STREAM_TYPE_HLS.
|
||||||
"""
|
"""
|
||||||
# pylint: disable=no-self-use
|
# pylint: disable=no-self-use
|
||||||
return None
|
return None
|
||||||
|
@ -543,7 +554,8 @@ class Camera(Entity):
|
||||||
async def async_handle_web_rtc_offer(self, offer_sdp: str) -> str | None:
|
async def async_handle_web_rtc_offer(self, offer_sdp: str) -> str | None:
|
||||||
"""Handle the WebRTC offer and return an answer.
|
"""Handle the WebRTC offer and return an answer.
|
||||||
|
|
||||||
This is used by cameras with SUPPORT_STREAM and STREAM_TYPE_WEB_RTC.
|
This is used by cameras with CameraEntityFeature.STREAM
|
||||||
|
and STREAM_TYPE_WEB_RTC.
|
||||||
|
|
||||||
Integrations can override with a native WebRTC implementation.
|
Integrations can override with a native WebRTC implementation.
|
||||||
"""
|
"""
|
||||||
|
@ -682,7 +694,7 @@ class Camera(Entity):
|
||||||
|
|
||||||
async def _async_use_rtsp_to_webrtc(self) -> bool:
|
async def _async_use_rtsp_to_webrtc(self) -> bool:
|
||||||
"""Determine if a WebRTC provider can be used for the camera."""
|
"""Determine if a WebRTC provider can be used for the camera."""
|
||||||
if not self.supported_features & SUPPORT_STREAM:
|
if not self.supported_features & CameraEntityFeature.STREAM:
|
||||||
return False
|
return False
|
||||||
if DATA_RTSP_TO_WEB_RTC not in self.hass.data:
|
if DATA_RTSP_TO_WEB_RTC not in self.hass.data:
|
||||||
return False
|
return False
|
||||||
|
|
|
@ -3,7 +3,7 @@ from __future__ import annotations
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from homeassistant.components.camera import SUPPORT_ON_OFF, Camera
|
from homeassistant.components.camera import Camera, CameraEntityFeature
|
||||||
from homeassistant.config_entries import ConfigEntry
|
from homeassistant.config_entries import ConfigEntry
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||||
|
@ -39,7 +39,7 @@ class DemoCamera(Camera):
|
||||||
|
|
||||||
_attr_is_streaming = True
|
_attr_is_streaming = True
|
||||||
_attr_motion_detection_enabled = False
|
_attr_motion_detection_enabled = False
|
||||||
_attr_supported_features = SUPPORT_ON_OFF
|
_attr_supported_features = CameraEntityFeature.ON_OFF
|
||||||
|
|
||||||
def __init__(self, name, content_type):
|
def __init__(self, name, content_type):
|
||||||
"""Initialize demo camera component."""
|
"""Initialize demo camera component."""
|
||||||
|
|
|
@ -58,7 +58,7 @@ async def mock_stream_source_fixture():
|
||||||
return_value=STREAM_SOURCE,
|
return_value=STREAM_SOURCE,
|
||||||
) as mock_stream_source, patch(
|
) as mock_stream_source, patch(
|
||||||
"homeassistant.components.camera.Camera.supported_features",
|
"homeassistant.components.camera.Camera.supported_features",
|
||||||
return_value=camera.SUPPORT_STREAM,
|
return_value=camera.CameraEntityFeature.STREAM,
|
||||||
):
|
):
|
||||||
yield mock_stream_source
|
yield mock_stream_source
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@ async def mock_hls_stream_source_fixture():
|
||||||
return_value=HLS_STREAM_SOURCE,
|
return_value=HLS_STREAM_SOURCE,
|
||||||
) as mock_hls_stream_source, patch(
|
) as mock_hls_stream_source, patch(
|
||||||
"homeassistant.components.camera.Camera.supported_features",
|
"homeassistant.components.camera.Camera.supported_features",
|
||||||
return_value=camera.SUPPORT_STREAM,
|
return_value=camera.CameraEntityFeature.STREAM,
|
||||||
):
|
):
|
||||||
yield mock_hls_stream_source
|
yield mock_hls_stream_source
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue