Motivation
I used Nest doorbell camera for a long time. It was easy to use but it has several problems that are hard to get around
- Streaming or Playback is much slower than it could be,
- Cost. $80 per year for the Nest Aware but it only has event based recording.
The root cause is that Nest will record to the cloud. When connecting to the camera even on the same network, there is several seconds of delays, and viewing playback will have more delays.
After moving, I’ve decided to DIY a system. It aims to solve the following problems
- Local live streaming is instant
- Local playback is fast
- Save event based videos for 30 days and save full videos for 7 days.
The search started with no subscription doorbell camera, and here are what will be needed
- Network Video Recording service (software)
- Camera that supports NVR.
- Support public video streaming protocols (RTSP/ONVIF)
- Could be weird to the doorbell transformer
After some searching, seems Reolink doorbell camera is a one viable option. And Shinobi could be for setting up a NVR.
Reolink Doorbell Camera
When it comes to doorbell camera, there are wired and battery powered ones. Those wired ones are normally powered by the 24V transformer. Reolink doorbell cameras like some other Reolink cameras supports a third option, where it could be installed with POE (Power over Ethernet). The doorbell camera setup is pretty straightforward.
Interestingly, those traditional mechanical Chimes are powered by a push button switch and the way it rings by short circuiting actually means those doorbell camera couldn’t get power. So normally to keep the mechanical Chime ringing, a separate device is normally needed in the Chime or inside the doorbell. Probably it’s a capacity to hold enough charges during the short circuit.
Shinobi
Shinobi setup is a bit tricky as it requires MySQL, and getting MySQL permissions right is a big challenge. I got a IntelNUC with Archlinux, and I highly recommend going through the Docker way.
Here are a few things you will need to take care when using the official script https://gitlab.com/Shinobi-Systems/Shinobi-Installer/raw/master/shinobi-docker.sh.
- It clones into
/home/ShinobiDocker
and it normally requires root. But running docker as root in the host is way risker than running docker as root in the container. You could just create this folder and set proper permission. Moreover, it mounts host folder for MySQL container. Running as root will bring more trouble in the long run. - Don’t forget about the MySQL password. The MySQL init file actually missed the password either on purpose or by mistake, but the entry file assumes a password as
1234
. This will bring a lot of errors in the Shinobi container- Where the users are created without password https://gitlab.com/Shinobi-Systems/ShinobiDocker/-/blob/master/mysql-init/user.sql?ref_type=heads
- Where Shinobi services assume a password https://gitlab.com/Shinobi-Systems/ShinobiDocker/-/blob/master/entrypoint.sh?ref_type=heads
After successfully run Shinbo, you’ll need to go to a portal with http://host_address:8080/super
to create the account with default logins
Adding Reolink in Shinobi
In Reolink, you’ll need to do a bit tweak to start the RTSP and ONVIF service. It’s in Device Info → Network Information → Advanced
A ffprobe test will be the easiest for testing it out if it’s working.
ffprobe rtsp://${reolink_user_name}:${reolink_password}@${reolink_doorbell_camera_ip}:554
ffprobe version n7.0.1 Copyright (c) 2007-2024 the FFmpeg developers
built with gcc 14.1.1 (GCC) 20240522
configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-amf --enable-avisynth --enable-cuda-llvm --enable-lto --enable-fontconfig --enable-frei0r --enable-gmp --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libdav1d --enable-libdrm --enable-libdvdnav --enable-libdvdread --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libharfbuzz --enable-libiec61883 --enable-libjack --enable-libjxl --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libplacebo --enable-libpulse --enable-librav1e --enable-librsvg --enable-librubberband --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpl --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-libzimg --enable-mbedtls --enable-nvdec --enable-nvenc --enable-opencl --enable-opengl --enable-shared --enable-vapoursynth --enable-version3 --enable-vulkan
libavutil 59. 8.100 / 59. 8.100
libavcodec 61. 3.100 / 61. 3.100
libavformat 61. 1.100 / 61. 1.100
libavdevice 61. 1.100 / 61. 1.100
libavfilter 10. 1.100 / 10. 1.100
libswscale 8. 1.100 / 8. 1.100
libswresample 5. 1.100 / 5. 1.100
libpostproc 58. 1.100 / 58. 1.100
Input #0, rtsp, from 'rtsp://shinobi:helloworld123@192.168.0.37:554':
Metadata:
title : Session streamed by "preview"
Duration: N/A, start: 0.000250, bitrate: N/A
Stream #0:0: Video: h264 (High), yuv420p(progressive), 2560x1920, 20 fps, 40 tbr, 90k tbn
Stream #0:1: Audio: aac (LC), 16000 Hz, mono, fltp
After getting the correct RTSP link, adding the monitor in Shinobi is easy. As a test, streaming from camera is very fast and almost real-time.
Next Steps
- Setup (event based) recording
- Optimize video processing & storage
- Setup event notifications