Raspberry Pi & Node.js diy Home Monitoring & Intruder Alert system
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.


Home Monitoring with Raspberry Pi and Node.js

Alt text


The project is designed as a end to end solution for a DIY Home Monitoring & Intruder Alert system. Besides offering a live video stream on any device (web responsive client), it also actively monitors for movement with the help of a PIR sensor.

If an Alarm is triggered, you get a SMS notification on your phone and the snapshots taken during the Alarm time span (customizable - default is 1 minute) are uploaded via FTP to your server.

Activation / Deactivation of the Alarm Mode can be done in 2 ways:

  1. from the Web Client user interface
  2. with a Button - for convenience reasons: it is faster than connecting from your phone / pc & toggling the Alert Mode checkbox
    • there is a 10 seconds customizable delay which allows you to move out of the PIR sensor range
    • a Led indicates the Alarm Mode enabled/disabled status

In order to avoid false positives from the PIR motion sensor, extra checks were added - a detection counter & detection interval. The Alarm gets triggered when the sensor detects movement 3 times in 5 seconds (both values configurable in code).


The project was developed using:

  • Raspberry Pi - raspbian, brick button & led, Pir sensor
  • Node.js - for the main application
  • Mjpg_streamer - to generate the video stream
  • Shell scripting - for easy application start (interactive & background)
  • Htms/Css/Javascript + Bootstrap - the web client

Project components


Alt text

this.Gpio = require('pi-gpio');
this.Hardware = { MotionSensor : 8, Led : 26, Button : 12 };
  • Raspberry Pi
    • I used Model B Revision 2 with Raspbian - any model should be Ok, just be careful with the Gpio configuration pin mappings, they can differ
    • Generic USB webcam (compatible with Raspberry Pi & Raspbian)
    • You can find a comprehensive list here http://elinux.org/RPi_USB_Webcams
    • I used a very old 2MP one which seems to work out of the box with the generic drivers
  • Led & Button
    Alt text
  • PIR motion sensor

Alt text

  • The one I used is available here https://www.sparkfun.com/products/13285
  • It normally connects to Analog Input (ex. on Arduino); however you can use it with Digital as well if you connect a 10K resistor between VCC & Signal
    Alt text
  • To make things easier you can purchase this sensor https://www.adafruit.com/products/189 and skip the soldering part (+ this one has configurable sensitivity built-in, so you might be able to skip the one implemented in the code)

Node application


  • express: ^4.12.3
  • ftp: ^0.3.10
  • http-auth: ^2.2.8
  • ini: ^1.3.4
  • pi-gpio: 0.0.7
  • socket.io: ^1.3.5
  • twilio: ^2.3.0

The dependencies you install with NPM:

npm install module --save

Generic Application.js

It is the basic application object, defined to be reusable in other projects Contains the basic server code, generic config file read/write operations, generic Init & Execute & Exit methods implementations

Home Monitoring ApplicationHM.js

  • config.ini file

    • default video quality & alert mode settings
    • Twilio sms Api Sid, Token, To number, From number
    • Ftp settings
  • Authentication (digest http authentication) - defaults are admin & password :)

  • Web Client application

    • Accessible from anywhere via port forwarding
    • Available also on mobile (responsive web client)
  • Monitoring - gets video from Mjpg_streamer server and sends it to the connected app clients

  • Mjpg_streamer was used as server, but if you prefer another tool like ffmpeg, you can easily replace it because of the loose integration via the start-webcam.sh script

Alarm mode

  • Monitoring - via PIR sensor
  • Alarm - Sms notification (implemented with the help of Twilio text messaging API - very cool service, offers great Trial account for development
  • Alarm - Snapshots upload to server via Ftp

Web Client - responsive

The client application was designed to be accessible on all platforms (pc / tablet / mobile).

Alt text

Video streaming quality settings

By default the 480p at 25fps is enabled (initial settings are loaded from the config.ini file)

My webcam is a low-end 5+ years old 2mp device, but for those of you with better webcams I also added 720p & 1080p

Video resolutions & fps can be configured from the /static/js/script.js file

	ui.quality480p.change(function(){ ConfigUpdateQuality("640x480",25); });
	ui.quality720p.change(function(){ ConfigUpdateQuality("1280x720",15); });
	ui.quality1080p.change(function(){ ConfigUpdateQuality("1920x1080",5); });	

Alert Mode

  • initial state is loaded from the config.ini file
  • You can enable/disable monitoring from checkbox button in the UI
  • The state of the Alert Mode is shown both in the UI (the checkbox) but also by the LED
  • The physical Button can be also used to toggle the Alert Mode
  • All state changes are sent to all connected clients
  • If an Alarm is triggered, the UI checkbox button background will be changed to Red Alt text

Connected Clients

The dropdown shows a list of all connected clients (connection timestamp & IP) that are currently viewing the video stream
Alt text

Shell Scripts


  • You can start the application in 2 modes:
    • Interactive (for dev / testing): ./start-app.sh
    • Background: ./start-app.sh -background
# application start in interactive or background mode
#arguments:  [-background]

cd /home/pi/Desktop/rpiWorkspace/Node/HomeMonitoring/

if [ "$1" = "-background" ]; then
	sudo nohup node ./App-home-monitoring.js &>log.txt &
	sudo node ./App-home-monitoring.js 


  • Used by the application to enable/disable video streaming when clients are connected or when an Alarm is triggered by the PIR sensor.
# webcam video stream
# arguments:  [resolution] [port] [fps]

pkill mjpg_streamer

sudo nohup ./mjpg-streamer/mjpg_streamer -i "./mjpg-streamer/input_uvc.so -y -r $1 -f $3 -q 75" -o "./mjpg-streamer/output_http.so -n -p $2" &

Application Execution Session example

Alt text


  • Port the application to Windows 10 Iot on Raspberry Pi 2
  • Support for uploading snapshots to cloud (OneDrive / Dropbox) when an Alarm is triggered