I did some testing this morning without an open gate script. I still don’t know what that is.
If I ring my doorbell I get the pop up on my phone as expected but I am not getting it on my wall mounted fire tablet that is running fully kiosk, even though both devices are registered in browser mod.
On my phone the pop up looks great with audio and video but when I press the green button to activate the two way communication I get a gray screen with a red error message telling me I have a configuration error.
What am I missing?
Thanks
I’m not sure spent about seven hours and is not working at all
Hello everyone, I have a problem, I added this doorbell via RTSP to go2rtc but it doesn’t appear in the entities, I don’t know why and I don’t know which one to add to blueprint because home assistant doesn’t find it, can someone help me, I don’t understand it, this is the first time something so complicated that I can’t do it
The registered stream in go2rtc will not show up as an entity in HA and it doesn’t need to.
If you read the guide, you have to select:
- in the first field the camera entity provided by the Reolink integration and
- in the second field just write the name of the stream defined in
go2rtc. In your case your stream name already matches the default value so no need to modify it:
The open gate script is a script that you need to create that will perform the actions to open the door (or whatever you want). This script will run when you press the blue button.
About the popup not showing in your wall tablet, that is definetely a problem with browser mod and fully kiosk. Browser mod will create a new ID often if the browser fingerprint changes.
So I am an idiot.
If you get the “Configuration Error” message or when clicking the ‘call’ button for 2-way talking or when just adding a card to the dashboard for testing and you get this “Custom element doesn’t exist: webrtc-camera”, MAKE SURE YOU ADDED THE WEBRTC INTEGRATION!
I didnt because I didnt know I needed to. 2 days… 2 DAYS I was working on this!. I happened across this issue on the webrtc github: Custom element doesn't exist: webrtc-camera · Issue #260 · AlexxIT/WebRTC · GitHub
Someone mentioned my same issues. Then I remembered that I had to add go2rtc to get that working so I added webrtc and BINGO!
For context, I am a full stack dev so I know my way around code. But I only installed HA 3 days ago. Still learning.
Now I just have to work out why there is so much delay between saying something and hearing it on the doorbell.
Hi all,
thanks @victorigualada a lot for sharing this project and the blueprint.
If anyone suffered from the issues described above, here’s the updated version of the blueprint (tags and “new” way o closing popups added) which eliminates all of them:
blueprint:
name: 2-way audio doorbell popupsv5
description: Trigger a popup and perform actions when a visitor rings the doorbell with 2-way audio
author: victorigualada
domain: automation
input:
doorbell_sensor:
name: Doorbell Sensor
description: The binary sensor triggered when the doorbell is pressed.
selector:
entity:
domain: binary_sensor
browser_ids:
name: Browser IDs
description: List of Browser Mod IDs for displaying the popup.
selector:
device:
multiple: true
filter:
- integration: browser_mod
camera_entity:
name: Camera Entity
description: The camera to display in the popup. This should be the normal stream produced by the camera.
selector:
entity:
domain: camera
go2rtc_url:
name: 2-way audio go2rtc stream
description: The stream exposed by go2rtc that includes 2-way audio. This MUST match the stream name configured in go2rtc
default: camera.2way_audio_doorbell
open_gate_script:
name: Open Gate Script
description: The script to open the gate.
default: null
selector:
entity:
domain: script
trigger:
- platform: state
entity_id: !input doorbell_sensor
from: "off"
to: "on"
action:
- service: browser_mod.popup
data:
tag: doorbell-popup
size: normal
browser_id: !input browser_ids
style: |-
ha-dialog {
--mdc-dialog-min-width: 600px !important;
}
.content {
width: auto !important;
}
content:
type: picture-elements
elements:
# Pick-up button
- type: icon
style:
left: 15%
bottom: 0
background-color: "#4CAF50"
color: white
padding: 14px
font-size: 18px
border: none
border-radius: 50px
display: inline-flex
align-items: center
cursor: pointer
z-index: 1
icon: mdi:phone
tap_action:
tag: anwser-popup
action: call-service
service: browser_mod.popup
service_data:
tag: doorbell-call
size: wide
dismissable: true
style: |-
ha-dialog {
--mdc-dialog-min-width: 600px !important;
}
.content {
width: auto !important;
}
browser_id: !input browser_ids
sequence:
- service: browser_mod.close_popup
- service: browser_mod.delay
data:
delay: 1
- service: browser_mod.popup
data:
content:
type: picture-elements
content:
type: picture-elements
card_mod:
style: |
#root { max-height: 436.65px }
elements:
- type: icon
icon: mdi:phone-off
tap_action:
action: call-service
service: browser_mod.close_popup
service_data:
tag: doorbell-call
style:
left: 85%
bottom: 0
width: 20px
background-color: "#f44336"
color: white
padding: 14px
font-size: 18px
border: none
border-radius: 50px
display: inline-flex
align-items: center
cursor: pointer
z-index: 1
- type: icon
icon: mdi:lock-open
tap_action:
action: call-service
service: script.turn_on
service_data:
entity_id: !input open_gate_script
style:
left: 15%
bottom: 0
background-color: "#2196F3"
color: white
padding: 14px
font-size: 18px
border: none
border-radius: 50px
display: inline-flex
align-items: center
cursor: pointer
z-index: 1
- type: custom:webrtc-camera
ui: true
url: !input go2rtc_url
media: video,audio,microphone
mode: webrtc
style:
position: absolute
top: 50%
left: 50%
width: 100%
height: 100%
card_mod:
style: |
.fullscreen {display: none}
.screenshot {display: none}
.pictureinpicture {display: none}
video {aspect-ratio: 16/9}
image: https://upload.wikimedia.org/wikipedia/commons/c/ca/1x1.png
# Hang-up button
- type: icon
style:
left: 85%
bottom: 0
width: 20px
background-color: "#f44336"
color: white
padding: 14px
font-size: 18px
border: none
border-radius: 50px
display: inline-flex
align-items: center
cursor: pointer
z-index: 1
icon: mdi:phone-off
tap_action:
action: call-service
service: browser_mod.close_popup
# Open door button
- type: icon
style:
left: 50%
bottom: 0
background-color: "#2196F3"
color: white
padding: 14px
font-size: 18px
border: none
border-radius: 50px
display: inline-flex
align-items: center
cursor: pointer
z-index: 1
icon: mdi:lock-open
tap_action:
action: call-service
service: script.turn_on
service_data:
entity_id: !input open_gate_script
# Camera stream
- type: custom:more-info-card
entity: !input camera_entity
style:
position: absolute
top: 50%
left: 50%
width: 100%
height: 100%
z-index: 0
card_mod:
style: |
:host { padding: 0}
.card-header { display: none;}
.card-content { padding: 0; margin-top: 0 }
image: https://upload.wikimedia.org/wikipedia/commons/c/ca/1x1.png
card_mod:
style: |
#root { height: 420px }
- wait_template: >-
{{ states('!input doorbell_sensor') == 'off' }}
timeout: "60"
continue_on_timeout: true
- service: browser_mod.close_popup
data:
sequence:
# ENSURE MORE-INFO IS CLOSED (modern >2.5.0 way)
- service: browser_mod.more_info
data:
close: true
# CLOSE MAIN POPUP
- service: browser_mod.close_popup
data:
tag: doorbell-popup
browser_id: !input browser_ids
mode: single
Hello everyone, I’m not sure if this topic has been covered here yet, but I’m having trouble executing this. Everything works fine—the image appears and I have two-way audio—but when I hang up using the red phone icon, the image disappears but the audio continues and won’t stop. I’ve already tried getting help from AI, but without success. Thanks to everyone!
Hey there,
Just starting this whole process too.
Isn’t go2rtc already bundled by default ??
I’ve come across this on other subjects but I wonder if this could work out of the box without installing the hacs go2rtc.
Regards
I have the preview :
When I click on answer button, no image displayed, but I hear the audio streaming :
Here is the go2rtc config, I have a reolink doorbell :
streams:
camera.2way_audio_doorbell:
- rtsp://admin:[email protected]:554/h264Preview_01_main
- ffmpeg:camera.2way_audio_doorbell#audio=opus#audio=copy
log:
format: text
level: "debug"
api:
listen: ":1984"
rtsp:
listen: ":8554"
webrtc:
listen: ":8555"
Any idea?
I had the same issue with the now famous configuration error, I fixed it by configuring properly the WebRTC integration which I happened to only install and forgot to finish configuring it (thank you @mychickenninja). Also if this is your case, remember to refresh your target browser where your mod browser is pointing to.
Also I wanted to point out that I’m running HA on a docker container (in a proxmox server) and I did not have networking issues. I installed go2rtc locally and seems to work well. By reading other comments it sounded like running HA on docker required additional configuration for this to work.
Thank you @victorigualada for making this and everyone for your precious inputs ![]()
The discussion right above is about the problem you’re describing. I picked up on the latest suggestion by @jaku2k, but changed it a little to close the first pop-up again when the second one is opened. This is my current version of the blueprint:
blueprint:
name: 2-way audio doorbell popupsv5
description: Trigger a popup and perform actions when a visitor rings the doorbell with 2-way audio
author: victorigualada
domain: automation
input:
doorbell_sensor:
name: Doorbell Sensor
description: The binary sensor triggered when the doorbell is pressed.
selector:
entity:
domain: binary_sensor
browser_ids:
name: Browser IDs
description: List of Browser Mod IDs for displaying the popup.
selector:
device:
multiple: true
filter:
- integration: browser_mod
camera_entity:
name: Camera Entity
description: The camera to display in the popup. This should be the normal stream produced by the camera.
selector:
entity:
domain: camera
go2rtc_url:
name: 2-way audio go2rtc stream
description: The stream exposed by go2rtc that includes 2-way audio. This MUST match the stream name configured in go2rtc
default: camera.2way_audio_doorbell
open_gate_script:
name: Open Gate Script
description: The script to open the gate.
default: null
selector:
entity:
domain: script
trigger:
- platform: state
entity_id: !input doorbell_sensor
from: "off"
to: "on"
action:
- service: browser_mod.popup
data:
tag: doorbell-popup
size: normal
browser_id: !input browser_ids
style: |-
ha-dialog {
--mdc-dialog-min-width: 600px !important;
}
.content {
width: auto !important;
}
content:
type: picture-elements
elements:
# Pick-up button
- type: icon
style:
left: 15%
bottom: 0
background-color: "#4CAF50"
color: white
padding: 14px
font-size: 18px
border: none
border-radius: 50px
display: inline-flex
align-items: center
cursor: pointer
z-index: 1
icon: mdi:phone
tap_action:
action: fire-dom-event
browser_mod:
service: browser_mod.sequence
data:
sequence:
# close FIRST popup on the browser that tapped
- service: browser_mod.close_popup
data:
tag: doorbell-popup
# tiny delay helps avoid dialog race conditions
- service: browser_mod.delay
data:
delay: 0.2
# open SECOND popup on the same browser
- service: browser_mod.popup
data:
tag: doorbell-call
size: wide
dismissable: true
style: |-
ha-dialog {
--mdc-dialog-min-width: 600px !important;
}
.content {
width: auto !important;
}
content:
type: picture-elements
card_mod:
style: |
#root { max-height: 436.65px }
elements:
- type: icon
icon: mdi:phone-off
tap_action:
action: call-service
service: browser_mod.close_popup
service_data:
tag: doorbell-call
style:
left: 85%
bottom: 0
width: 20px
background-color: "#f44336"
color: white
padding: 14px
font-size: 18px
border: none
border-radius: 50px
display: inline-flex
align-items: center
cursor: pointer
z-index: 1
- type: icon
icon: mdi:lock-open
tap_action:
action: call-service
service: script.turn_on
service_data:
entity_id: !input open_gate_script
style:
left: 15%
bottom: 0
background-color: "#2196F3"
color: white
padding: 14px
font-size: 18px
border: none
border-radius: 50px
display: inline-flex
align-items: center
cursor: pointer
z-index: 1
- type: custom:webrtc-camera
ui: true
url: !input go2rtc_url
media: video,audio,microphone
mode: webrtc
style:
position: absolute
top: 50%
left: 50%
width: 100%
height: 100%
card_mod:
style: |
.fullscreen {display: none}
.screenshot {display: none}
.pictureinpicture {display: none}
video {aspect-ratio: 16/9}
image: https://upload.wikimedia.org/wikipedia/commons/c/ca/1x1.png
# Hang-up button
- type: icon
style:
left: 85%
bottom: 0
width: 20px
background-color: "#f44336"
color: white
padding: 14px
font-size: 18px
border: none
border-radius: 50px
display: inline-flex
align-items: center
cursor: pointer
z-index: 1
icon: mdi:phone-off
tap_action:
action: call-service
service: browser_mod.close_popup
# Open door button
- type: icon
style:
left: 50%
bottom: 0
background-color: "#2196F3"
color: white
padding: 14px
font-size: 18px
border: none
border-radius: 50px
display: inline-flex
align-items: center
cursor: pointer
z-index: 1
icon: mdi:lock-open
tap_action:
action: call-service
service: script.turn_on
service_data:
entity_id: !input open_gate_script
# Camera stream
- type: custom:more-info-card
entity: !input camera_entity
style:
position: absolute
top: 50%
left: 50%
width: 100%
height: 100%
z-index: 0
card_mod:
style: |
:host { padding: 0}
.card-header { display: none;}
.card-content { padding: 0; margin-top: 0 }
image: https://upload.wikimedia.org/wikipedia/commons/c/ca/1x1.png
card_mod:
style: |
#root { height: 420px }
- wait_template: >-
{{ states('!input doorbell_sensor') == 'off' }}
timeout: "60"
continue_on_timeout: true
- service: browser_mod.close_popup
data:
sequence:
# ENSURE MORE-INFO IS CLOSED (modern >2.5.0 way)
- service: browser_mod.more_info
data:
close: true
# CLOSE MAIN POPUP
- service: browser_mod.close_popup
data:
tag: doorbell-popup
browser_id: !input browser_ids
mode: single
And thank you @victorigualada for this, this is really neat. The only issue I have now is the echo, but there’s really not much anyone can do about it.
Thanks @victorigualada for the great work !
I can access my reolink using your guide.
But did anyone manage to use this with wallpanel ?
My Ipad did not show the popup from brosermod.
Hi, first thank you @victorigualada for this really nice automation and sharing the blueprint. i made it working with attribute all: true within the second close_popup part.i have also added tags to the popups but thats only a nice to have in this case. i changed the blueprint a bit, because i want to switch on the screen and disable the screensaver in the beginning:
blueprint:
name: 2-way audio doorbell popups
description: Trigger a popup and perform actions when a visitor rings the doorbell
with 2-way audio
author: victorigualada
domain: automation
input:
doorbell_sensor:
name: Doorbell Sensor
description: The binary sensor triggered when the doorbell is pressed.
selector:
entity:
domain:
- binary_sensor
reorder: false
multiple: false
browser_ids:
name: Browser IDs
description: List of Browser Mod IDs for displaying the popup.
selector:
device:
multiple: true
filter:
- integration: browser_mod
camera_entity:
name: Camera Entity
description: The camera to display in the popup. This should be the normal stream
produced by the camera.
selector:
entity:
domain:
- camera
reorder: false
multiple: false
go2rtc_url:
name: 2-way audio go2rtc stream
description: The stream exposed by go2rtc that includes 2-way audio. This MUST
match the stream name configured in go2rtc
default: camera.2way_audio_doorbell
open_gate_script:
name: Open Gate Script
description: The script to open the gate.
default:
selector:
entity:
domain:
- script
reorder: false
multiple: false
tablet_screensaver_entity:
name: Wall Tablet Screensaver Entity
description: Tablet or Fully Kiosk Browser device that controls the screensaver.
selector:
entity:
domain:
- switch
tablet_scree_entity:
name: Wall Tablet Screen Entity
description: Tablet or Fully Kiosk Browser device that controls the display.
selector:
entity:
domain:
- switch
source_url: https://gist.github.com/victorigualada/469b6aa81e77296bbbae339c0a890160
trigger:
- platform: state
entity_id: !input doorbell_sensor
from: 'off'
to: 'on'
action:
###########################################################
# 1) Turn on tablet display + disable screensaver
###########################################################
- service: switch.turn_on
target:
entity_id: !input tablet_scree_entity
- service: switch.turn_off
target:
entity_id: !input tablet_screensaver_entity
- service: browser_mod.popup
data:
tag: doorbell-open
size: normal
browser_id: !input browser_ids
style: "ha-dialog {\n --mdc-dialog-min-width: 600px !important;\n}\n.content
{\n width: auto !important;\n}"
content:
type: picture-elements
elements:
- type: icon
style:
left: 15%
bottom: 0
background-color: '#4CAF50'
color: white
padding: 14px
font-size: 18px
border: none
border-radius: 50px
display: inline-flex
align-items: center
cursor: pointer
z-index: 1
icon: mdi:phone
tap_action:
action: call-service
service: browser_mod.popup
service_data:
tag: 2-way-talk
size: wide
dismissable: true
style: "ha-dialog {\n --mdc-dialog-min-width: 600px !important;\n}\n.content
{\n width: auto !important;\n}"
browser_id: !input browser_ids
content:
type: picture-elements
card_mod:
style: '#root { max-height: 436.65px }
'
elements:
- type: icon
icon: mdi:phone-off
tap_action:
action: call-service
service: browser_mod.close_popup
service_data:
all: true
style:
left: 85%
bottom: 0
width: 20px
background-color: '#f44336'
color: white
padding: 14px
font-size: 18px
border: none
border-radius: 50px
display: inline-flex
align-items: center
cursor: pointer
z-index: 1
- type: icon
icon: mdi:lock-open
tap_action:
action: call-service
service: script.turn_on
service_data:
entity_id: !input open_gate_script
style:
left: 15%
bottom: 0
background-color: '#2196F3'
color: white
padding: 14px
font-size: 18px
border: none
border-radius: 50px
display: inline-flex
align-items: center
cursor: pointer
z-index: 1
- type: custom:webrtc-camera
ui: true
url: !input go2rtc_url
media: video,audio,microphone
mode: webrtc
style:
position: absolute
top: 50%
left: 50%
width: 100%
height: 100%
card_mod:
style: '.fullscreen {display: none}
.screenshot {display: none}
.pictureinpicture {display: none}
video {aspect-ratio: 16/9}
'
image: https://upload.wikimedia.org/wikipedia/commons/c/ca/1x1.png
- type: icon
style:
left: 85%
bottom: 0
width: 20px
background-color: '#f44336'
color: white
padding: 14px
font-size: 18px
border: none
border-radius: 50px
display: inline-flex
align-items: center
cursor: pointer
z-index: 1
icon: mdi:phone-off
tap_action:
action: call-service
service: browser_mod.close_popup
- type: icon
style:
left: 50%
bottom: 0
background-color: '#2196F3'
color: white
padding: 14px
font-size: 18px
border: none
border-radius: 50px
display: inline-flex
align-items: center
cursor: pointer
z-index: 1
icon: mdi:lock-open
tap_action:
action: call-service
service: script.turn_on
service_data:
entity_id: !input open_gate_script
- type: custom:more-info-card
entity: !input camera_entity
style:
position: absolute
top: 50%
left: 50%
width: 100%
height: 100%
z-index: 0
card_mod:
style: ':host { padding: 0}
.card-header { display: none;}
.card-content { padding: 0; margin-top: 0 }
'
image: https://upload.wikimedia.org/wikipedia/commons/c/ca/1x1.png
card_mod:
style: '#root { height: 420px }
'
- wait_template: '{{ states(''!input doorbell_sensor'') == ''off'' }}'
timeout: '60'
continue_on_timeout: true
- service: browser_mod.close_popup
data:
browser_id: !input browser_ids
all: true
mode: single
I have a problem where the first popup window doesn’t display the reolink video feed from my doorbell. if I click on the green telephone icon to accept the call a second popup window appears which does have video on it and it does seem to pass audio back to the doorbell (although currently it doesn’t seem to work the other way round, but I think this may be a problem with web RTC)
I have tried adding a generic camera device manually (pointing to the Reolink rtsp address and the entity itself shows the video feed) but when selecting it as the primary feed for the first popup it still doesn’t work. It just says configuration error.
The Reolink integration shows the fluent and clear video feeds no problem.
The 2 popup windows appear to be using 2 different type of feeds, the first using the camera entity directly and the second using webrtc/go2rtc.
Any ideas would be much appreciated.
Thank you.
Can I use this “popup” with 2way audio in a android tablet using HA app? o de we need to use a browser? thanks
A note here for anyone looking to beta test Home Assistant 2026.3.0b0. Dialogs have changed so you will need Browser Mod 2.8.0-beta.2 (2.8.0 will be released in line with 2026.3.0). See [Info]: Popup styling changes for Browser Mod 2.8.0(-beta.2) · Issue #1163 · thomasloven/hass-browser_mod · GitHub for more info.
Noting that with Home Assistant 2026.3 and Browser Mod 2.8.0 that dialogs are no longer mdc so --mdc-dialog-min-width does nothing. You can use --popup-width which will work. Standard popup size is 580px so perhaps this can just be removed.
go2rtc:
webrtc:
candidates:
- 192.168.31.118:8555
- stun:8555
streams:
ogrod_main:
- ffmpeg:http://192.168.31.82/flv?port=1935&app=bcs&stream=channel0_main.bcs&user=USER&password=PASSWORD#video=copy#audio=copy#audio=opus
- rtsp://USER:[email protected]/Preview_01_main
ogrod_sub:
- ffmpeg:http://192.168.31.82/flv?port=1935&app=bcs&stream=channel0_ext.bcs&user=USER&password=PASSWORD#video=copy#audio=copy#audio=opus
- rtsp://USER:[email protected]/Preview_01_sub
domofon_main:
- ffmpeg:http://192.168.31.102/flv?port=1935&app=bcs&stream=channel0_main.bcs&user=USER&password=PASSWORD#video=copy#audio=copy#audio=opus
- rtsp://USER:[email protected]/Preview_01_main
domofon_sub:
- ffmpeg:http://192.168.31.102/flv?port=1935&app=bcs&stream=channel0_ext.bcs&user=USER&password=PASSWORD#video=copy#audio=copy#audio=opus
- rtsp://admin:[email protected]/Preview_01_sub
That works great for me, 2 way audio works fine, ogrod is reolink p320, domofon is reolink doorbell poe
What hardware are u using for microphone and speaker?! Can it be use also for HA voice commands?!



