Introduction: Smart Doorbell for HomeAssistant

So, I wanted a doorbell with the following features:

  • Video from the door
  • Two way audio
  • Two buttons
  • Integration with wall mounted tablet showing HomeAssistant UI

Some options came along like Doorbird (expensive and they do not have two-way audio calling using HTML5) and Ring doorbell (but I don't like a subscription, cloud based doorbell)

As a developer and tinkerer, I already finished some projects but this was by far one of the most difficult ones to complete. I had a lot of trouble getting the two-way audio working to a point where you can understand each other. This mainly because there is quite a lot of echo, ... . The idea comes from DoorPi, but with the SIP protocol, I had too much echo which made resulted in not understanding one-another.

Since my doorbell is completely protected from the elements, we are able to make the front in lasercut wood.

Supplies

  • Raspberry Pi 3 B or 3B+ (do not go for a Banana Pi with PoE build in as it does not support the standard Raspberry Pi CSI camera interface) = € 33,67
  • Micro SD card = € 2,69
  • Raspberry Pi fisheye camera = € 14,14
  • PoE adapter = € 4,94
  • RaspiAudio Mic + = € 24,69
  • Access to 3D printer (and laser cutter)
  • Buttons for the Doorbell
  • A lot of time!

This adds up to a total of € 80,13.

Out of scope, the indoor station:

Step 1: Setup Raspberry Pi

I highly recommend you to use ethernet instead of Wifi. My audio quality improved a lot due to it. We will also be using UV4L since it supports webrtc and thus has echo-cancellation built-in. The Doorpi uses linphone, a SIP client and I was unable to get the echo cancellation working.

  • Download Raspbian Stretch Lite and install it on the Micro SD card. Make sure you:
    • enable ssh by creating an empty ssh file in the boot partition
  • Run the following commands:
sudo apt-get update
sudo apt-get upgrade 

Camera

Enable the camera via raspi-config and make sure that the GPU has at least 192 MB of ram.

RaspiAudio

Follow the installation guide of RaspiAudio found at https://www.raspiaudio.com/raspiaudio-aiy

UV4L

Follow the installation guide of UV4L found at https://www.linux-projects.org/uv4l/installation/.

Adjust the /etc/uv4l/uv4l-raspicam.conf file and make sure you adjust the following settings:

The most notable settings is probaby --enable-webrtc-video=no: this is because we will always stream the video from uv4l using h264 encoded mjpeg.

Using the following files located in /usr/share/uv4l/demos/doorpi/, you can already test the two-way audio and video.

  • index.html (rename it from index.html5, needed to rename due to instructables upload requirements)
  • main.js
  • signalling.js

Browse to https://[ip-of-raspberrypi]:8888 and test if you can get the 2-way audio working.

pi-mqtt-gpio

The easiest way I found to get the doorbell-buttons working, is to attach them to the raspberry pi and use pi-mqtt-gpio to integrate it with HomeAssistant.

My configuration file is as follows:

mqtt:<br>  host: x.x.x.x
  port: 1883
  user: [username]
  password: [password]
  topic_prefix: "doorbell"

gpio_modules:
  - name: raspberrypi<br>    module: raspberrypi<br>    cleanup: yes

digital_inputs:<br>  - name: button_1<br>    module: raspberrypi<br>    pin: 17<br>    on_payload: "Off"<br>    off_payload: "On"<br>    pullup: yes<br>    pulldown: no<br>  - name: button_2<br>    module: raspberrypi<br>    pin: 27<br>    on_payload: "Off"<br>    off_payload: "On"<br>    pullup: yes<br>    pulldown: no

Do note that as there more ground pins available as 3.3V pins, I choose to use pullup GPIO pins and thus inverted my MQTT messages.

uv4l-raspicam.conf

driver = raspicam
auto-video_nr = yes
frame-buffers = 4
encoding = h264
width = 1024
height = 768
framerate = 10
rotation = 270 #depending on your hardware setup
server-option = --port=9090
server-option = --bind-host-address=0.0.0.0
server-option = --use-ssl=yes
server-option = --ssl-private-key-file=/etc/uv4l/selfsign.key
server-option = --ssl-certificate-file=/etc/uv4l/selfsign.crt
server-option = --enable-webrtc-video=no
server-option = --enable-webrtc-audio=yes
server-option = --webrtc-vad=yes
server-option = --webrtc-echo-cancellation=yes
server-option = --webrtc-max-playout-delay=34
server-option = --enable-www-server=yes
server-option = --www-root-path=/usr/share/uv4l/demos/doorpi/
server-option = --www-index-file=index.html
server-option = --www-port=8888
server-option = --www-bind-host-address=0.0.0.0
server-option = --www-use-ssl=yes
server-option = --www-ssl-private-key-file=/etc/uv4l/selfsign.key
server-option = --www-ssl-certificate-file=/etc/uv4l/selfsign.crt
server-option = --www-webrtc-signaling-path=/webrtc
view rawgistfile1.txt hosted with ❤ by GitHub

Step 2: Doorbell Box

  • doorbell-back v1.stl: 3D printed box for raspberry pi and PoE adapter
  • doorbell-front v1.svg: Laser cut face plate
  • doorbell-micro v1.stl: 3D printed box containing mirophone wrapped with sound insulation, glued to face plate

Screw the raspberry pi in the attached screw holders and put the PoE adapter on the top right. Put the camera and the microphone in place (make sure to detach the microphone and make sure the hole of the microphone is well aligned with a hole in the face plate).

Step 3: HomeAssistant Integration

The following files allow for HomeAssistant integration:

  • doorpi.yaml: package containing everything related to the doorbell including listening to MQTT messages and automations to play the chime when the doorbell is pushed
  • www/doorpi/doorpi-card.js: lovelace doorpi card which needs the signalling.js and doorpi-camera-view.js

IMPORTANT: Do note that you must be running HomeAssistant with https/ssl as otherwise chrome will not allow you to access the audio devices.

Step 4: Happy Doorbell-calling!

That's it, you should now be able to call someone via the doorbell and HomeAssistant will automatically switch to the doorbell card. There you can decide to accept or ignore the doorbell.