A Home Assistant custom Lovelace card with two-way audio and video for the Ring Intercom Video device (2024/2025 model with built-in camera).
This is the frontend card. It needs the companion backend custom integration to work — see Dependencies below.
- 📹 Live video stream from the intercom (native WebRTC, no transcoding)
- 🎤 Two-way audio with push-to-talk button
- 🔓 Open door button (uses Ring's native
lock.unlockor any custom service) - 📵 Hang up button (clean session teardown, releases mic and camera)
- 🛠 Visual editor with entity pickers — no YAML needed
- 🌍 Multi-language UI with auto-detection: Spanish, English, Catalan
- 🔌 Pure browser-side WebRTC, no
go2rtc, no extra add-ons, no transcoding server - 🌐 Works on desktop and mobile browsers (with HTTPS)
This card is only the user interface. For it to actually work, you also need:
👉 ring-intercom-video custom integration.
This integration is what creates the camera.* entity for your Ring Intercom Video and handles the WebRTC signaling between Home Assistant and Ring's servers. Without it the card has nothing to connect to.
Install the backend integration first, verify it created a camera.* entity for your intercom, and only then install this card.
Browsers require a secure context to access the microphone (getUserMedia). If you access HA over plain HTTP (http://192.168.x.x:8123), the microphone will not work and you'll get one-way audio at best.
You need any of:
- 🏠 Nabu Casa Home Assistant Cloud (HTTPS automatic)
- 🔐 A reverse proxy with Let's Encrypt (nginx, Caddy, Traefik, Nginx Proxy Manager...)
- 🔒 Native HA HTTPS with a valid certificate
- 🏡 Home Assistant 2024.4 or newer
- 📦 A Ring Intercom Handset Video device (the 2024/2025 model with camera) paired in your Ring account
- 🌍 A modern browser (Chrome, Firefox, Safari, Edge — all current versions)
Step by step:
If you don't have HACS, install it first following the official HACS docs. Then come back here.
Before this card, you need ring-intercom-video installed:
- In HACS → Integrations → click ⋮ (top right) → Custom repositories
- Add:
- Repository:
https://github.com/cmos486/ring-intercom-video - Type:
Integration
- Repository:
- Install Ring Intercom Video Camera
- Restart Home Assistant
- Verify: a
camera.*entity has appeared for your intercom (look in Settings → Devices & Services → Ring)
If this step doesn't produce a camera entity, fix that first — the card will not work without it.
- In HACS → Frontend → click ⋮ (top right) → Custom repositories
- Add:
- Repository:
https://github.com/cmos486/ring-intercom-video-card - Type:
Lovelace
- Repository:
- Find Ring Intercom Video Card in the list and click Download
- HACS will register the JavaScript resource automatically
- Hard refresh your browser:
Ctrl+Shift+R(Windows/Linux) orCmd+Shift+R(macOS) - ✅ Done
To confirm it loaded, open the browser console (F12) — you should see a blue banner like:
RING-INTERCOM-VIDEO-CARD v1.1.0
If you prefer not to use HACS:
- Download
ring-intercom-video-card.jsfrom the latest release - Copy it to
/config/www/ring-intercom-video-card.json your HA instance - Go to Settings → Dashboards → ⋮ → Resources and add:
- URL:
/local/ring-intercom-video-card.js - Resource type:
JavaScript Module
- URL:
- Hard refresh your browser
- Open the dashboard where you want the card
- Click ✏️ Edit dashboard (pencil icon, top right)
- Click ➕ Add Card
- Search for Ring Intercom Video Card in the picker
- The visual editor will open:
- 📹 Camera entity: pick the
camera.*created by the backend integration - 🔓 Lock entity (optional): pick the
lock.*provided by the Ring integration to enable the "Open door" button - 🌍 Language (optional): override the auto-detected language (defaults to your HA language)
- ⚙️ Advanced (toggle): instead of a simple lock, you can call any service when "Open door" is pressed
- 📹 Camera entity: pick the
- Click Save
The visual editor covers the typical cases, but here's the full schema for reference:
| Option | Type | Required | Description |
|---|---|---|---|
entity |
string | ✅ Yes | Camera entity from the backend integration (camera.*) |
lock_entity |
string | ❌ No | Lock entity used for the "Open door" button. Calls lock.unlock. |
open_door_action |
object | ❌ No | Advanced: custom service call for "Open door". Overrides lock_entity if set. |
open_door_action.service |
string | — | Service to call (e.g. script.turn_on, automation.trigger) |
open_door_action.entity_id |
string | — | Entity passed as entity_id to the service |
open_door_action.data |
object | — | Additional service data |
language |
string | ❌ No | Force UI language: es, en, ca. If omitted, follows Home Assistant's language. |
type: custom:ring-intercom-video-card
entity: camera.entrada_principal_video_camera
lock_entity: lock.entrada_principal_video_locktype: custom:ring-intercom-video-card
entity: camera.entrada_principal_video_camera
open_door_action:
service: script.turn_on
entity_id: script.abrir_puertatype: custom:ring-intercom-video-card
entity: camera.entrada_principal_video_camera
lock_entity: lock.entrada_principal_video_lock
language: caIf neither lock_entity nor open_door_action is configured, the Open door button is automatically hidden. Useful if you only want video + audio.
type: custom:ring-intercom-video-card
entity: camera.entrada_principal_video_cameraThe card UI is available in:
| Code | Language |
|---|---|
🇪🇸 es |
Español |
🇬🇧 en |
English |
🇪🇸 ca |
Català |
Auto-detection: by default, the card reads hass.locale.language (or hass.language) and picks the matching translation. If your HA is set to Spanish, the card shows Spanish. If it's set to Italian (not supported yet), it falls back to English.
Manual override: set the language option in the card config to force a specific language regardless of HA.
Want another language? PRs welcome — add a new block to the TRANSLATIONS constant in ring-intercom-video-card.js.
When someone rings the intercom or you just want to check the door:
- 🛎️ Intercom rings (or you decide to peek)
- 👆 Click 📞 Pick up / Descolgar / Despenjar
- 🎤 Browser asks for microphone permission → Allow (first time only)
- ⏳ Wait a second or two — you'll see
PC state: connectedin the overlay - 📺 Live video appears, the green push-to-talk button activates
- 🗣️ Hold the green button to speak through the intercom
- 🔓 Click 🔓 Open door / Abrir puerta / Obrir porta to unlock the door
- 📵 Click 📵 Hang up / Colgar / Penjar when you're done
- The microphone is muted by default — you have to hold the button to send audio. Release it as soon as you stop talking to avoid echo.
- The audio from the door is always heard while connected — you don't need to press anything to hear them.
- If you forget to hang up, the indoor intercom handset may stay "occupied" and not work normally. Always hang up when you finish.
- The card uses native browser WebRTC — latency is typically under 300ms.
A common use case: when someone rings the intercom, automatically show the card as a popup on your wall panel / tablet without the user having to navigate to a specific dashboard.
This is achieved with the browser_mod custom integration.
- 📱 Browser Mod installed via HACS
- 🌐 The target device (tablet, wall panel...) needs to be registered as a browser in Browser Mod with a known
browser_id(e.g.wallpanel) - 🛎️ A trigger entity from your intercom — typically
event.<your_intercom>_timbre_de_la_puertaor similarbinary_sensor.*_dingfrom the Ring integration
HACS → Integrations → search Browser Mod → Download → Restart HA → Settings → Devices & services → Add integration → Browser Mod.
On the target device (e.g. wall panel tablet):
- Open HA in the app or browser
- Navigate to menu → Browser Mod (or directly to
/browser-mod) - Enter a recognizable name in Browser ID (e.g.
wallpanel) - Activate ☑️ Register, ☑️ Camera, ☑️ Microphone
- Save
Use this automation as a starting point. Replace entity IDs with your own:
alias: popup_intercom_llamada_wallpanel
description: >
Shows the intercom card as a popup on the wall panel when the doorbell rings.
Auto-closes after 60s of inactivity.
mode: restart
trigger:
- platform: state
entity_id: event.entrada_principal_video_timbre_de_la_puerta
action:
- service: browser_mod.popup
data:
browser_id:
- wallpanel
title: Llamada en el portero
content:
type: custom:ring-intercom-video-card
entity: camera.entrada_principal_video_camera
lock_entity: lock.entrada_principal_video_lock
dismissable: true
autoclose: false
timeout: 60000
style: "--popup-min-width: 480px; --popup-max-width: 520px;"If your tablet's screen is off when the doorbell rings, you'll want to wake it up first. The HA Companion app supports a command for this:
alias: activar_pantalla_wallpanel_por_timbre
description: Wake up wallpanel screen when doorbell rings
trigger:
- platform: state
entity_id: event.entrada_principal_video_timbre_de_la_puerta
action:
- service: notify.mobile_app_wallpanel
data:
message: command_screen_onNote:
notify.mobile_app_wallpanelis created automatically when you install the HA Companion app on the tablet and name itwallpanel.
The style: field accepts CSS variables specific to Browser Mod:
style: |
--popup-min-width: 480px;
--popup-max-width: 520px;
--popup-border-radius: 16px;If you don't want the popup to appear at night:
condition:
- condition: time
after: "06:00:00"
before: "23:00:00"Combine the popup with a notify.* to your phone:
action:
- choose:
- conditions:
- condition: state
entity_id: person.you
state: home
sequence:
- service: browser_mod.popup
data:
browser_id:
- wallpanel
# ... (popup config above)
- conditions:
- condition: state
entity_id: person.you
state: not_home
sequence:
- service: notify.mobile_app_your_phone
data:
title: "🛎️ Doorbell"
message: "Someone is at the door"For the curious:
Browser <──signaling via HA──> Ring Cloud <──media P2P──> Ring Intercom
│ │
└──────── audio + video over WebRTC (peer-to-peer) ──────────────┘
- The card builds an
RTCPeerConnectionwith two transceivers:audio: sendrecvandvideo: recvonly - It calls Home Assistant's standard
camera/webrtc/offerWebSocket API - The backend integration (ring-intercom-video) forwards the SDP offer to Ring's signaling servers
- ICE candidates are exchanged via
camera/webrtc/candidate - Once negotiated, media flows peer-to-peer (Ring may use TURN relays depending on NAT)
- No transcoding, no extra services, no
go2rtc
This is the same WebRTC machinery the official HA Ring integration already uses for doorbell cameras — this card just adds the missing UI and the microphone track on top.
The browser is rejecting the microphone request:
- 🔒 You're accessing HA over plain HTTP. Switch to HTTPS (Nabu Casa, Let's Encrypt, etc.)
- 🚫 You denied permission previously. Click the lock/info icon in the address bar and reset site permissions
- 🎙️ No microphone available on your device
- Check that the green button actually turns red while held
- Open DevTools (F12) → Console — you should see
[ring-intercom-video-card] Mic: ONwhen pressing - Make sure you're on HTTPS — some browsers silently mute mic on insecure contexts
Usually a network/NAT issue:
- Check that your client can reach Ring's WebRTC endpoints
- Look at ICE candidate errors in DevTools console
- Try from a different network (e.g. mobile data) to isolate
- Verify ring-intercom-video is installed and Ring discovered the device
- Restart Home Assistant after installing the backend
- Check Settings → Devices & Services → Ring — your intercom should be listed
You're caching an old copy:
- Hard refresh:
Ctrl+Shift+R(Win/Linux) orCmd+Shift+R(macOS) - Clear the Lovelace resource cache by toggling its URL with a
?v=Xquery param - In HACS, re-download the card if needed
- If using
lock_entity: make surelock.unlockworks manually on that entity (Developer Tools → Services) - If using
open_door_action: check the service exists and works standalone - Look at HA logs around the time you pressed the button
- Verify
sensor.<browser_id>_browser_idstate is the expected name (notunavailable) - If you changed the HA URL (e.g. HTTP → HTTPS), Browser Mod loses the registration. Re-register on the device after changing URLs
- Make sure the target browser is active and visible (
sensor.<browser_id>_browser_visibilityshould bevisiblefor the popup to render). If the screen is off, sendcommand_screen_onfirst
- If the language code is unsupported, the card falls back to English. Supported:
es,en,ca. PRs welcome to add more - You can force a language by setting
language: es(oren,ca) in the card config
Pull requests and issues welcome! When reporting a bug please include:
- 🏡 Home Assistant version
- 🌐 Browser and version
- 🖥️ Console logs from the card (search for
[ring-intercom-video-card]) - 🎟️ A description of what you expected vs. what happened
To add a new language, edit ring-intercom-video-card.js and add a new key to the TRANSLATIONS constant. All keys must match the existing ones — see en for the canonical reference.
- 📦 Built on top of python-ring-doorbell and the HA Ring integration
- 🤝 Companion to ring-intercom-video by the same author
- 🪟 Auto-popup feature uses browser_mod by @thomasloven
Copyright © 2026 Kilian Ubeda Cano