2 Way audio Intercom for Reolink doorbell made easy

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:

  1. in the first field the camera entity provided by the Reolink integration and
  2. 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
2 Likes

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 :slight_smile:

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.

1 Like
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

2 Likes

What hardware are u using for microphone and speaker?! Can it be use also for HA voice commands?!