An Android doorbell application built for Home Assistant. Integrates with built-in go2rtc from the Frigate or AlexxIT/WebRTC integrations for 2-way audio and video streaming.

Features

  • WebRTC Video & Audio: Low latency streaming using WebRTC.
  • 🎙️ 2-Way Audio Intercom: Supports talking back through your camera using Android's native acoustic echo cancellation.
  • 🔐 Biometric Door Lock Integration: Unlock your front door from the video stream using Android Fingerprint, Face Unlock, or PIN.
  • 💬 Quick Replies: Trigger pre-recorded Home Assistant select entity messages.

Requirements

This app directly hooks into Frigate or AlexxIT/WebRTC for 2-way audio support.

  1. Home Assistant
  2. Frigate Integration OR AlexxIT/WebRTC Integration

App Setup

When you first launch the app, you will be prompted for:

  1. Home Assistant URL: The local or remote URL to your Home Assistant instance that is accessible from the device (e.g., https://192.168.1.100:8123). Note: WebRTC strictly requires a secure HTTPS connection to function. Standard HTTP URLs will fail to establish a video/audio stream.
  2. Long-Lived Access Token: Generate this in your Home Assistant user profile.
  3. go2rtc Stream Name: The exact name of the camera stream as configured in go2rtc config (e.g., front_door_camera).

Optional Integrations

  • Connect in 2-way mode instantly: Optionally enable this toggle to skip the initial receive-only mode and hook directly into 2-way audio when the stream opens. (Note: This feature is mutually exclusive with Quick Replies).
  • Quick Reply Entity ID: Provide the ID of a select entity (e.g., select.doorbell_quick_reply) to enable instant pre-recorded messages. Entering an entity here will automatically disable the instant 2-way mode above to prevent audio conflicts.
  • Door Lock Entity ID: Provide the ID of a lock entity (e.g., lock.front_door) to add a biometric-protected unlock button to the camera feed.

Development

This project leverages the following major external libraries:

To build the project, open it in Android Studio and run a standard Gradle build.

Personal Setup Notes

For my personal setup, I am using this app with Home Assistant, Frigate, a Reolink Wi-Fi doorbell, and a SwitchBot lock.

The Reolink doorbell has issues dropping the call if you use WebRTC 2-way audio on the exact same stream that Frigate is using to record and detect. To prevent the doorbell from locking up and refusing to ring when all systems try to use the same stream, I set up a separate, dedicated go2rtc stream in Frigate specifically to use with this app.

Here is the config for the 2-way stream in the Frigate go2rtc section:

    doorbell_camera_2way:
      - rtsp://admin:[email protected]:554/Preview_01_sub
      - ffmpeg:doorbell_camera_2way#audio=opus#audio=copy

(This Frigate documentation page is very helpful in setting up 2-way communications).

I use a SwitchBot lock integrated through Home Assistant, which works flawlessly with the lock button in the app.

The auto-reply feature of the Reolink doorbell is quite finicky and actually refuses to work if a 2-way audio stream is actively going on. Because of this limitation, if the quick reply option is set up, this app connects in a receive-only streaming mode first. It only switches over to 2-way audio when you explicitly hit the Call button, allowing the quick reply functionality to work uninterrupted while viewing the live feed.

Fast Actionable Notifications

To get immediate notifications with an image when the doorbell is pressed, I use a custom automation that relies on the Reolink camera's built-in snapshot HTTP API rather than the default Home Assistant camera snapshot functionality. This is significantly faster!

Prerequisites:

  1. Enable Reolink HTTP Server: Make sure the HTTP/HTTPS web server is enabled in your Reolink doorbell's network settings so the snapshot API works.
  2. Downloader Integration: You must add the downloader integration to your Home Assistant configuration.yaml.
  3. Download Directory: Configure the downloader download directory to start with www (e.g., www/doorbell) so that Home Assistant can serve the image to the notification. (Files in www are accessible via /local/ in Home Assistant).

Blueprint Import:

You can easily add this automation using the blueprint below:

Open your Home Assistant instance and show the blueprint import dialog with a specific blueprint pre-filled.

Manual Automation Code:

If you prefer to set it up manually, here is the automation YAML. Note: Due to Home Assistant limitations, you must manually edit the entity_id under triggers at the very top to match your doorbell sensor. For everything else, simply update the values in the variables: block at the very bottom!

alias: Doorbell visitor notification
description: ""
triggers:
  - entity_id: binary_sensor.doorbell_visitor
    from: "off"
    to: "on"
    trigger: state
actions:
  - action: downloader.download_file
    data:
      url:  "{{camera_snapshot_url}}"
      filename: "{{ snapshot_file_name }}"
      overwrite: true
  - wait_for_trigger:
      - trigger: event
        event_type: downloader_download_completed
    timeout: "{{ wait_timeout }}"
    continue_on_timeout: false
  - data:
      title: "{{notification_title}}"
      message: "{{ as_timestamp(now()) | timestamp_custom('%d:%m %H:%M', true) }}"
      data:
        ttl: "{{ notification_ttl }}"
        priority: "{{ notification_priority }}"
        channel: "{{notification_channel}}"
        image: "/local/{{ downloader_path }}/{{ snapshot_file_name }}"
        notification_icon: mdi:doorbell-video
        clickAction: app://com.novasoftware.hadoorbell
    action: "{{ notify_service }}"
mode: single
variables:
  camera_snapshot_url: http://192.168.1.10/cgi-bin/api.cgi?cmd=Snap&channel=0&user=admin&password=your_password_here
  notify_service: notify.mobile_devices
  notification_channel: alarm_stream
  notification_title: There is somebody at the door!
  notification_ttl: 0
  notification_priority: high
  snapshot_file_name: snapshot_doorbell.jpg
  downloader_path: doorbell
  wait_timeout: "00:10:00"

Screenshots