Home Camera
A Cameras panel for every user and camera cards, with a privacy badge per camera, HD / SD and PTZ.
An integration with a Cameras sidebar panel open to every user, not only administrators, and the Lovelace cards behind it. List the cameras and it finds their privacy switch, SD stream and PTZ buttons by itself; hidden cameras leave the grid, and a live dot shows which ones are filming.
Highlights
- Cameras panel in the sidebar for every user, a video wall edge to edge
- Settings tab for administrators, with camera discovery and a copy of an existing camera card
- Privacy badge per camera: live dot or lock
- HD / SD switch, setting each Tapo camera's own stream quality
- Pan and tilt controls, round pad in full screen
- Motion badge while a motion, occupancy or person sensor of the camera is on
- Low latency streams, WebRTC alone when the camera offers it, with its sound
- Mini card with a snapshot per camera, opening the full card
- Cameras without a live stream (HomeKit, a Tapo in privacy mode…) shown as stills refreshed every second, Safari included
- Streams paused while the card is off-screen
Works with
Cards
type: custom:home-camera-cardInstall
- 1Open the repository in the Marketplace with the Add to Marketplace button above, or add
github.com/juju35/ha-cameraas a custom repository (category Integration). - 2Download it from the Marketplace.
- 3Restart Home Assistant and add the integration from Settings → Devices & services.
Gallery 9
Documentation
From the README Features
Features
Cameras panel#
- Cameras in the sidebar for every user — family members without administrator rights included: a video wall edge to edge, with no card around it — a thin status bar (cameras live and hidden, privacy badges, HD / SD) over as many columns as the screen takes — and everything the card does (live streams, privacy badges, HD / SD, PTZ, fullscreen)
- Settings tab, for administrators only: the cameras and their options with the card's own visual editor, and the sidebar title (left empty: Cameras in the server's language)
- Camera discovery: a new entry starts with every camera of Home Assistant, and Settings lists the ones not shown yet, to Add one by one or Add all, each with the privacy switch, pan and tilt buttons and motion sensors found on its device; a Tapo camera's two entities (
*_hd_stream,*_sd_stream) count as one camera, whose SD stream the HD / SD switch picks - Copy from a dashboard: takes the first camera card found on your dashboards, to move a cameras dashboard to the panel in one click
- Saved settings reach every open panel at once, on every device; the tab is in the address (
/cameras/settings)
Cards#
- Header with the number of cameras live and hidden, and an HD / SD switch
- One badge per camera: a red live dot while it films, a green lock while it is hidden; tap to toggle its privacy switch (or its smart plug); greyed out, and ignoring taps, while that switch is unavailable (camera offline)
- Each image carries its name with a live dot; when every camera is hidden, a panel says how to bring one back
- Motion badge: a pulsing amber sensor icon on the image's name (and on the mini card's snapshot) while a motion, occupancy or person sensor of the camera's device is on
- A single camera: its name is the title, a round Disable / Enable icon button sits on the right and the HD / SD badge under the title
- Hidden cameras are removed from the grid: a camera is hidden when its privacy switch is on or its power switch is off
- HD / SD switch: from an
input_selectshared by every dashboard, or from the card itself (remembered by the browser); with Tapo Cameras, it sets each camera's own Stream quality select, and the player picks the new stream up - Live grid with low latency: a camera that offers WebRTC (go2rtc) plays it alone, one RTSP session per camera; Home Assistant's own player (HLS or MJPEG) for the others — no other card to install
- Tap a camera to put it fullscreen, with a round pan & tilt pad at the bottom right; tap again or press Escape to come back (on iPhone, the card covers the screen itself)
- Details button on every tile for Home Assistant's camera dialog; sound button on streams that carry sound, for one camera at a time (the grid starts muted)
- PTZ: a button on the tile shows a round pad of four arrows in the corner of the image, light enough to see through; hold an arrow to keep moving, or use the arrow keys; arrows whose button is unavailable are greyed out
- Spinner until each camera's first frame; privacy badges spin until their switch answers
- Mouse: tile buttons show on hover; touch: always shown, with larger targets
- Hiding or showing a camera, or switching HD / SD, never reloads the streams of the other cameras
- Streams stop while the page is hidden (other tab, phone locked) or the card is scrolled off screen, and resume when it comes back
- Mini card (
home-camera-mini-card): a snapshot of each camera with its name and status, refreshed every 10 seconds instead of a live stream; its detail button (top right) or a tap on a snapshot shows the full card, a click outside folds it back - Automatic discovery on the camera's device:
switch.*_privacy(or*_privacy_mode),button.*_move_left/right/up/down, the motion, occupancy and personbinary_sensors, and either the*_sd_streamcamera next to a*_hd_streamone or aselect.*_stream_quality(see Supported integrations) - Visual editor in the dashboard UI (no YAML needed)
- English, French, German, Spanish, Serbian (Cyrillic and Latin), Italian, Dutch, European Portuguese, Polish, Romanian, Danish, Swedish, Bulgarian, Russian, Ukrainian, Hungarian, Slovak, Czech, Slovenian, Latvian and Greek, follows the Home Assistant language
- Light and dark theme compatible
- Served by the integration and added to the dashboard resources by itself (loaded on every page when the resources are in YAML mode); each language other than English is a small file fetched when needed
Supported integrations
Supported integrations
Any camera entity works. These integrations also bring their controls without any configuration:
| Integration | Camera entities | Privacy | HD / SD | PTZ | Motion |
|---|---|---|---|---|---|
Tapo Cameras (tapo_cameras) |
one per camera | privacy_mode switch |
stream_quality select (hd / sd) of each camera |
move_* buttons |
detection binary_sensors |
Tapo: Cameras Control (tapo_control) |
*_hd_stream and *_sd_stream |
switch.*_privacy |
the *_sd_stream camera |
button.*_move_* |
detection binary_sensors |
Tapo Cameras names its entities in your language (button.living_room_left, button.salon_gauche…): the card finds them by their translation key on the camera's device, whatever their entity ids. With Tapo Cameras, the HD / SD switch changes the stream of the camera itself, so every viewer gets the new quality; with a shared quality_entity, the switch sets it too.
Prerequisites
Prerequisites
- Home Assistant 2024.12 or later with
cameraentities (on older Home Assistant versions, the Cameras list of the visual editor falls back to a YAML editor — the card itself works the same) - Optional: an
input_selectwith the optionsHDandSDto share the quality between dashboards and devices
Configuration
Configuration
Cameras panel#
Open Cameras in the sidebar, then its Settings tab (administrators): the panel already shows every camera found when the integration was added; Cameras found lists the ones added to Home Assistant since (Add, Add all), the Cameras list edits them all — or Copy from a dashboard — then Save. The panel takes the same options as the card below; every user then sees the cameras in the panel.
Visual editor#
Add the card from the dashboard (Add card → Home Camera Card) and add the cameras in the Cameras list. Options left at their default are not written to the YAML.
Minimal#
type: custom:home-camera-card
cameras:
- camera.living_room_hd_stream
- camera.bedroom_hd_stream
With a Tapo integration (Supported integrations), each camera brings its HD / SD streams, its privacy switch and its PTZ buttons on its own.
Full options#
type: custom:home-camera-card
title: Cameras
icon: mdi:cctv
quality_entity: input_select.camera_quality
hd_option: HD
sd_option: SD
columns: 2
aspect_ratio: "16:9"
cameras:
- camera: camera.living_room_hd_stream
name: Living room
short_name: Living
- camera: camera.bedroom_parents_hd_stream
name: Parents' bedroom
short_name: Parents
sd: camera.bedroom_parents_sd_stream
privacy: switch.bedroom_parents_privacy
ptz: button.bedroom_parents_move
motion: binary_sensor.bedroom_parents_motion
- camera: camera.terrace
name: Terrace
power: switch.terrace_camera_plug
ptz: false
Mini card#
type: custom:home-camera-mini-card
cameras:
- camera.living_room_hd_stream
- camera.bedroom_hd_stream
The mini card takes the same options as the full card, plus zoom. Its compact view shows the title with its status and a snapshot of each camera (the SD stream's when there is one; a hidden camera's snapshot is never fetched), refreshed every 10 seconds while the card is on screen in a visible page. The detail button at the top right, or a tap on a snapshot, switches it to the full card (live streams, privacy badges, HD / SD); a click outside the card brings the compact view back.
Options reference#
| Option | Required | Default | Description |
|---|---|---|---|
cameras |
✅ | — | List of cameras, see below; a bare entity id is a camera with every option found automatically |
title |
❌ | Cameras |
Card title; with a single camera, its name |
show_title |
❌ | true |
Show the title in the header (e.g. false under a section heading of your own) |
icon |
❌ | mdi:cctv |
Icon next to the title |
quality_entity |
❌ | — | input_select (or select) holding the quality; without it the card keeps its own choice in the browser |
hd_option |
❌ | HD |
Option of quality_entity meaning HD |
sd_option |
❌ | SD |
Option of quality_entity meaning SD |
layout |
❌ | — | wall: the video wall of the Cameras panel — no card around the grid, a status bar instead of the header, as many columns as fit (unless columns is set) |
columns |
❌ | 2 |
Columns of the grid |
aspect_ratio |
❌ | 16:9 |
Shape of the tiles (16:9, 4:3, 1:1…); the image fills the tile |
show_summary |
❌ | true |
Summary line under the title |
show_badges |
❌ | true |
Privacy badges under the header |
show_motion |
❌ | true |
Motion badge on the images while a camera's motion sensor is on |
zoom |
❌ | true |
Mini card only: its detail button to the full card; with false, a tap on a snapshot opens the camera's dialog |
language |
❌ | Auto | Force language: en, fr, de, es, sr, sr-Latn, it, nl, pt, pl, ro, da, sv, bg, ru, uk, hu, sk, cs, sl, lv or el (auto-detects from HA settings) |
Camera options
| Option | Description |
|---|---|
camera |
Camera entity, shown in HD |
name |
Name on the grid; defaults to the entity name |
short_name |
Name on the privacy badge; defaults to name |
sd |
Camera entity shown in SD; defaults to the *_sd_stream next to a *_hd_stream camera, else the HD one |
privacy |
Switch hiding the camera when on; defaults to the switch.*_privacy of the camera's device, false for none |
power |
Switch (smart plug) hiding the camera when off |
ptz |
PTZ buttons: a prefix (button.x_move → button.x_move_left, _right, _up, _down), an object {left, right, up, down}, or false; defaults to the button.*_move_* of the camera's device |
motion |
Motion sensor(s) behind the camera's motion badge: an entity id, a list, or false for none; defaults to the binary_sensors of the camera's device whose device class is motion, occupancy or presence, or whose id contains motion, occupancy or person |
How it works
How it works
The card draws its own header, badges and tiles. A camera that offers WebRTC (go2rtc) plays it with Home Assistant's ha-web-rtc-player alone: Home Assistant's ha-camera-stream starts HLS and WebRTC side by side, two RTSP sessions per camera, which cameras that allow few of them (Tapo…) answer by dropping one, and the image lags. The other cameras, the ones without a live stream and a WebRTC session that brings no video use ha-camera-stream, the player of the built-in camera cards and dialog (HLS or MJPEG). go2rtc and the camera's own settings apply as everywhere else in Home Assistant. Tiles are kept between updates and only added or removed when a camera is shown or hidden, so the other streams keep playing. When the quality is SD, every camera that has an SD stream uses it.
Discovery looks at the entities of the camera's device in the entity registry. Anything set in the configuration wins over what is found.
Changelog
All 45 versions 4.5.0Nov 12, 2026Latest
Features
show_titleoption (also in the visual editor) hides the card header's title (HD / SD and the summary stay;show_summaryalready hides the summary), for a card placed under a section heading of its own (asked in juju35/ha-vehicle-card#72).
4.4.3Nov 12, 2026
Fixes
- Marketplace updates that failed with "The installed content has no home_camera.zip" (#69): they come from the card still installed as a Dashboard entry from before 4.0, which the Marketplace now tries to update with the integration's zip. Home Camera now raises a repair in Settings → Repairs while that old entry is there, saying to remove it from the Marketplace and keep the Integration one; the repair goes at the next start once it is removed.
4.4.2Nov 12, 2026
Fixes
- Cameras without a live stream (HomeKit cameras, a Tapo in privacy mode…) show in Safari: Home Assistant's player gave them an MJPEG image that Safari left broken, with the spinner turning forever. The card now shows their still, refreshed about every second (the next one asked once the previous one has loaded), in every browser; it stops while the page is hidden or the card off screen.
4.4.1Nov 11, 2026
Improvements
- WebRTC tiles show the camera's last still at once, while the session starts (connection to the camera, then its first keyframe), instead of a black frame.
4.4.0Nov 11, 2026
Improvements
- Lower latency and steadier streams: a camera that offers WebRTC (go2rtc) plays it alone, one RTSP session per camera, instead of Home Assistant's player starting HLS next to it. Cameras that allow few sessions (Tapo…) dropped one, go2rtc kept reconnecting and the player could fall back to HLS, seconds behind. Home Assistant's player stays for the other cameras, for privacy mode (its still) and when a WebRTC session brings no video.
4.3.3Nov 11, 2026
Fixes
- Sound button on cameras whose audio only WebRTC plays (G.711, such as Tapo C2xx cameras), now for good: it shows as soon as Home Assistant says the camera can play WebRTC, whichever player is shown first, instead of waiting for the WebRTC player to be the one shown. Turning the sound on starts a new session, in which the player picks WebRTC with its sound.