developers.home-assistant/docs/core/entity/camera.md

8.1 KiB

title sidebar_label
Camera entity Camera

A camera entity can display images, and optionally a video stream. Derive a platform entity from homeassistant.components.camera.Camera.

Properties

:::tip Properties should always only return information from memory and not do I/O (like network requests). Implement update() or async_update() to fetch data. :::

Name Type Default Description
brand str | None None The brand (manufacturer) of the camera.
frame_interval float 0.5 The interval between frames of the stream.
frontend_stream_type StreamType | None None Used with CameraEntityFeature.STREAM to tell the frontend which type of stream to use (StreamType.HLS or StreamType.WEB_RTC)
is_on bool True Indication of whether the camera is on.
is_recording bool False Indication of whether the camera is recording. Used to determine state.
is_streaming bool False Indication of whether the camera is streaming. Used to determine state.
model str | None None The model of the camera.
motion_detection_enabled bool False Indication of whether the camera has motion detection enabled.
use_stream_for_stills bool False Determines whether or not to use the Stream integration to generate still images

States

The state is defined by setting the properties above. The resulting state uses the CameraState enum to return one of the below members.

Value Description
RECORDING The camera is currently recording.
STREAMING The camera is currently streaming.
IDLE The camera is currently idle.

Supported features

Supported features are defined by using values in the CameraEntityFeature enum and are combined using the bitwise or (|) operator.

Value Description
ON_OFF The device supports turn_on and turn_off
STREAM The device supports streaming

Methods

Camera image

When the width and height are passed, scaling should be done on a best-effort basis. The UI will fall back to scaling at the display layer if scaling cannot be done by the camera.

  • Return the smallest image that meets the minimum width and minimum height.

  • When scaling the image, aspect ratio must be preserved. If the aspect ratio is not the same as the requsted height or width, it is expected that the width and/or height of the returned image will be larger than requested.

  • Pass on the width and height if the underlying camera is capable of scaling the image.

  • If the integration cannot scale the image and returns a jpeg image, it will automatically be scaled by the camera integration when requested.

class MyCamera(Camera):
    # Implement one of these methods.

    def camera_image(
        self, width: int | None = None, height: int | None = None
    ) -> bytes | None:
        """Return bytes of camera image."""
        raise NotImplementedError()

    async def async_camera_image(
        self, width: int | None = None, height: int | None = None
    ) -> bytes | None:
        """Return bytes of camera image."""

Stream source

The stream source should return a url that is usable by ffmpeg (e.g. an RTSP url). Requires CameraEntityFeature.STREAM.

A camera entity with a stream source by default uses StreamType.HLS to tell the frontend to use an HLS feed with the stream component. This stream source will also be used with stream for recording.

class MyCamera(Camera):

    async def stream_source(self) -> str | None:
        """Return the source of the stream."""

A common way for a camera entity to render a camera still image is to pass the stream source to async_get_image in the ffmpeg component.

WebRTC streams

WebRTC enabled cameras can be used by facilitating a direct connection with the home assistant frontend. This usage requires CameraEntityFeature.STREAM with frontend_stream_type set to StreamType.WEB_RTC.

The integration must implement the two following methods to support native WebRTC:

  • async_handle_async_webrtc_offer: To initialize a WebRTC stream. Any messages/errors coming in async should be forwared to the frontend with the send_message callback.
  • async_on_webrtc_candidate: The frontend will call it with any candidate coming in after the offer is sent. The following method can optionally be implemented:
  • close_webrtc_session (Optional): The frontend will call it when the stream is closed. Can be used to clean up things.

WebRTC streams do not use the stream component and do not support recording.

class MyCamera(Camera):

    async def async_handle_async_webrtc_offer(
        self, offer_sdp: str, session_id: str, send_message: WebRTCSendMessage
    ) -> None:
        """Handle the async WebRTC offer.

        Async means that it could take some time to process the offer and responses/message
        will be sent with the send_message callback.
        This method is used by cameras with CameraEntityFeature.STREAM and StreamType.WEB_RTC.
        An integration overriding this method must also implement async_on_webrtc_candidate.

        Integrations can override with a native WebRTC implementation.
        """

    async def async_on_webrtc_candidate(self, session_id: str, candidate: RTCIceCandidate) -> None:
        """Handle a WebRTC candidate."""

    @callback
    def close_webrtc_session(self, session_id: str) -> None:
        """Close a WebRTC session."""

WebRTC Providers

An integration may provide a WebRTC stream from an existing camera's stream source using the libraries in homeassistant.components.camera.webrtc. An integration may implement CameraWebRTCProvider and register it with async_register_webrtc_provider.

Turn on

class MyCamera(Camera):
    # Implement one of these methods.

    def turn_on(self) -> None:
        """Turn on camera."""

    async def async_turn_on(self) -> None:
        """Turn on camera."""

Turn off

class MyCamera(Camera):
    # Implement one of these methods.

    def turn_off(self) -> None:
        """Turn off camera."""

    async def async_turn_off(self) -> None:
        """Turn off camera."""

Enable motion detection

class MyCamera(Camera):
    # Implement one of these methods.

    def enable_motion_detection(self) -> None:
        """Enable motion detection in the camera."""

    async def async_enable_motion_detection(self) -> None:
        """Enable motion detection in the camera."""

Disable motion detection

class MyCamera(Camera):
    # Implement one of these methods.

    def disable_motion_detection(self) -> None:
        """Disable motion detection in camera."""

    async def async_disable_motion_detection(self) -> None:
        """Disable motion detection in camera."""