Home

Awesome

WebRTC Camera

hacs_badge

Home Assistant custom component for real-time viewing of almost any camera stream using WebRTC and other technologies.

Starting with version 3 the streaming server has been changed from RTSPtoWebRTC to go2rtc.


<!-- TOC --> <!-- TOC -->

go2rtc

This component uses the go2rtc application as a streaming server:

Read more in the go2rtc docs!

You can install go2rtc in several ways:

  1. Basic users - this component will automatically download and run the latest version of go2rtc, you don't need to do anything yourself.
  2. Advanced users - install the go2rtc or Frigate 12+ add-on.
  3. Hakers - install go2rtc as binary or Docker on any server in LAN.

You can change the go2rtc settings by adding the go2rtc.yaml file to your Hass configuration folder.

Important. go2rtc runs its own web interface on port 1984 without a password. There you can see a list of active camera streams. Anyone on your LAN can access them without a password. You can disable this in the go2rtc config.

PS. There is also another nice card with go2rtc support - Frigate Lovelace Card.

Installation

Method 1. HACS > Integrations > Plus > WebRTC > Install

Method 2. Manually copy webrtc folder from latest release to /config/custom_components folder.

<details> <summary>Additional steps if you are using the UI in YAML mode: add card to resources</summary>

The custom_card will be automatically registered with the Home Assistant UI, except when you are managing the UI in YAML mode. If you are managing the UI in YAML mode then add this to your UI resources for the custom:webrtc-camera card to work:

url: /webrtc/webrtc-camera.js
type: module
</details>

Configuration

Settings > Devices & Services > Add Integration > WebRTC

If the integration is not in the list, you need to clear the browser cache.

Component doesn't create devices and entities. It creates only two services and lovelace custom card.

Custom card

As a url you can use:

As a entity you can use almost any camera from Hass.

As a poster you can use:

Minimal

type: 'custom:webrtc-camera'
url: 'rtsp://rtsp:12345678@192.168.1.123:554/av_stream/ch0'

or

type: 'custom:webrtc-camera'
url: 'camera1'  # stream name from go2rtc.yaml

or

type: 'custom:webrtc-camera'
entity: camera.generic_stream  # change to your camera entity_id

or

type: 'custom:webrtc-camera'
streams:
  - url: go2rtc_stream_hd
    name: HD      # name is optional
    mode: webrtc  # mode is optional
    media: video  # media is optional
  - url: go2rtc_stream_sd
    name: SD
    mode: mse
    media: audio

PS. You can change the active stream by clicking on the mode label. Or by clicking on the stream name with enabled ui: true.

Full

All settings are optional! Only required setting - url or entity or streams.

type: 'custom:webrtc-camera'

url: 'rtsp://rtsp:12345678@192.168.1.123:554/av_stream/ch0'
entity: camera.generic_stream
mode: webrtc,webrtc/tcp,mse,hls,mjpeg  # stream technology, default all of them
media: video,audio  # select only video or audio track, default both

server: http://192.168.1.123:1984/     # custom go2rtc server address, default empty

ui: true  # custom video controls, default false

digital_ptz:  # digital zoom and pan via mouse/touch, defaults:
  mouse_drag_pan: true 
  mouse_wheel_zoom: true
  mouse_double_click_zoom: true
  touch_drag_pan: true 
  touch_pinch_zoom: true  
  touch_tap_drag_zoom: true 
  persist: true  # zoom factor and viewport position survive page reloads

# digital_ptz: false  # to disable all mouse/touch digital zoom and pan

title: My super camera  # optional card title
poster: https://home-assistant.io/images/cast/splash.png  # still image when stream is loading
muted: true  # initial mute toggle state, default is false (unmuted)

intersection: 0.75  # auto stop stream when less than 75% of video element is in the screen, 50% by default
background: true  # run stream when not displayed (ex. for quick video loading), default false

shortcuts:  # custom shortcuts, default none
- name: Record
  icon: mdi:record-circle-outline
  service: switch.toggle
  service_data:
    entity_id: switch.camera_record

Pan, tilt, zoom controls: PTZ config examples.

Paused by default

type: custom:webrtc-camera
poster: dahua1-snap  # stream name from go2rtc.yaml (http-snapshot)
streams:
  - url: ''          # empty url, so only poster will be shown
  - url: dahua1      # stream name from go2rtc.yaml (rtsp-stream)

Video aspect ratio issue

style: "video {aspect-ratio: 16/9; object-fit: fill;}"

Video rotation

  1. On client (free CPU):
    style: 'video {transform: rotate(90deg); aspect-ratio: 1}'
    
  2. On server - FFmpeg transcoding (high CPU cost)

Hide mode label

style: '.mode {display: none}'

Hide fullscreen button

style: '.fullscreen {display: none}'

Hide screenshot button

style: '.screenshot {display: none}'

Hide PIP button

style: '.pictureinpicture {display: none}'

Shortcuts position

style: ".shortcuts {left: unset; top: 25px; right: 5px; display: flex; flex-direction: column}"

PTZ position

style: ".ptz {right: unset; left: 10px}"

Mode label position

style: '.header {bottom: 6px} .mode {position: absolute; bottom: 0px}'

Header line position

style: '.header {top: unset; bottom: 6px}'

Templates

New in v3.6.0.

shortcuts:
  - name: Barn Light
    icon: ${ states['light.yeelight_lamp'].state === 'on' ? 'mdi:outdoor-lamp':'mdi:lamp' }
    service: light.toggle
    service_data:
      entity_id: light.yeelight_lamp
ptz:
  service: notify.persistent_notification
  data_left:
    message: Left for ${ this.streamName } clicked
  data_right:
    message: Rigth for ${ this.streamID } clicked

Two-way audio

New in v3.4.0.

You should add microphone to media param. You can use two streams: one with mic, second without:

type: 'custom:webrtc-camera'
streams:
  - url: go2rtc_stream
  - url: go2rtc_stream
    mode: webrtc
    media: video,audio,microphone

PS. For Hass Mobile App ensure that you can use microphone with the built-in Assist.

Snapshots to Telegram

read more

Cast or share stream

Component support streaming to Google Cast Chromecast devices (including Android TV and Google Smart Screen). Read more in wiki.

Also component support creating a temporary or permanent link to a stream without sharing access to you Home Assistant. Read more in wiki.

Stream to camera

New in v3.1.0.

go2rtc support play audio files (ex. music or TTS) and live streams (ex. radio) on cameras with two way audio support. You need to:

  1. Check if your camera has supported two way audio source
  2. Setup camera stream in go2rtc.yaml config
  3. Check audio codec, that your camera supports
  4. Create virtual Media Players for your cameras in configuration.yaml:
media_player:
  - platform: webrtc
    name: Dahua Camera
    stream: dahua
    audio: pcmu/48000
  - platform: webrtc
    name: Tapo Camera
    stream: tapo
    audio: pcma

FAQ

Q. Exernal access with WebRTC doesn't work
A. Read more and don't create new issues.

Q. Audio doesn't work
A. Check what audio codec your camera outputs. And what technology do you use to watch videos. Different technologies support different codecs.

Debug

Add to your configuration.yaml:

logger:
  default: warning
  logs:
    custom_components.webrtc: debug

Known work cameras

BrandModelsComment
ActiveCamAC-D2121IR3
ActiveCamAC-D7121IR1Wsupport sound
AndroidIP Webcam Prosupport sound, rtsp://192.168.1.123:8080/h264_ulaw.sdp
C-tronicsCTIPC-690Csupport sound, main : rtsp://username:password@192.168.1.xx:554/11 or onvif://username:password@192.168.1.xx:8080?subtype=MainStreamProfileToken
DahuaDH-IPC-HDPW1431FP-AS-0280B, VTO2211G-Psupport sound
DahuaVTO2202F-P-S2read more
EZVIZC3Srtsp://admin:pass@192.168.1.123:554/h264/ch01/main/av_stream and /h264/ch01/sub/av_stream
EZVIZC3W, C3WN, C6CN, C6Trtsp://admin:pass@192.168.1.123:554/h264_stream
EZVIZC8Crtsp://admin:pass@192.168.1.123:554/channel80
FoscamC1rtsp://user:pass@192.168.1.123:554/videoMain
FoscamC2M, R2Mrtsp://user:pass@192.168.1.123:88/videoMain
GW SecurityGW5088IPrtsp://192.168.1.123:554/mpeg4cif?username=admin&password=123456
GW SecurityGW5078IPrtsp://192.168.1.123:554/stream0?username=admin&password=123456
GW SecurityGW5071IPNot working yet, something similar to rtsp://admin:123456@192.168.0.207:554/live/main or rtsp://192.168.0.207:554/live/main?username=admin&password=123456
HikvisionDS-2CD2T47G1-L, DS-2CD1321-I, DS-2CD2143G0-ISrtsp://user:pass@192.168.1.123:554/ISAPI/Streaming/Channels/102
HikvisionIPC-HDW3849H-AS-PV, IPC-EW5531-ASwired to nvr DHI-NVR2108HS-8P-I using custom component
ImouIPC-F42-B2E3 (Bullet 2C 4MP)rtsp://admin:password@192.168.1.123:554/cam/realmonitor?channel=1&subtype=0
QNAPQUSBCam2rtsp://username:password@192.168.1.123:554/channel1 docs
Raspberry PiPiCamread more
ReolinkRLC-410, RLC-410W, RLC-510WA, E1 Pro, E1 Zoom, 4505MPRLC-510WA support sound, E1 Zoom support sound, PTZ and zoom
ReolinkE1rtsp://admin:password@192.168.1.123:554/h264Preview_01_main
SonoffGK-200MP2-Bsupport sound and PTZ, rtsp://rtsp:12345678@192.168.1.123:554/av_stream/ch0 and /av_stream/ch1
SriHomeSH035rtsp://192.168.xxx.xxx:8554/profile0 and /profile1 and /profile2
Topvicortsp://192.168.1.123:8554/stream0 or rtsp://192.168.1.123:554/ch0_0.264
TP-LinkTapo C100/C200/C210/C220/C310rtsp://user:pass@192.168.1.123:554/stream1 and /stream2
TVT/SecutechNVR-0808B2-8Prtsp://user:pass@192.168.1.123:554/chID=1&streamType=main and chID=2&streamType=main
TVT/SecutechIPC5-DF28SNrtsp://user:pass@192.168.1.123:554/profile1 and /profile2
UnifiG4 Dome, G4 doorbell, G3 Bullet, G3 FlexCopy the rtsps link from the camera's settings in Unifi Protect, but change the link to rstp:// (it defaults to rstps://), change the port to 7447, and remove any query params
WyzeCam v2/v3, Cam Pan v1/v2support sound
XiaomiDafangwith hack, rtsp://192.168.1.123:8554/unicast <br> Video: H264, size: 1920x1080, bitrate: 1000, format: VBR, frame rate: 10 <br> Audio: PCMU, rate in: 8000, rate out: 44100
YaleSV-4CFDVR-2rtsp://admin:password@192.168.1.123/cam/realmonitor?channel=1&subtype=0
YiHi3518e Chipsetwith hack
YiMStar Infinity Chipsetwith hack