Tuesday, February 26, 2013

My door sends me emails - Simple and cheap Raspberry Pi burglar alarm

The thing I like most about the Raspberry Pi are the GPIO pins. They allow you to break the limits of software and access hardware. I've always been a software guy but also wanted to control some kind of hardware from the software.

So for my first software<->hardware project I wanted to build a primitive burglar alarm that notifies me whenever the door is opened.

So you'll need these things:
  • Raspberry Pi
  • A reed relay (magnet switch)
  • Some old IDE cable
  • 1 x 10kΩ resistor
If you already have a Raspberry Pi, this project will cost you about 10€

Step 1: The circuit

Here's the diagram:

This is a very simple circuit that even I could build :D

This is what my first self-soldered circuit looks like:
note that I used the IDE cable to connect the GPIO pins to the board. This info graphic helped me a lot!

Raspberry connected to the circuit via IDE cable
Note: You see more than one resistor in the picture above
because this was my first version which had two. I managed
to make the circuit even simpler thanks to George Toderici

It's not pretty but it does its job!

Step 2: The reed switch

The reed switch is the main part of this project because it switches electricity only when a magnet is close to the head. So if the door closes the switch will lose the connection and the raspberry will notice a change from 1 to 0

For testing purposes I just fixed the reed switch and the magnets under it on the door with tape as you can see in the picture below.
The two wires of the switch are of course connected to the circuit (the cables on the left in the picture above)

Reed switch with a magnet under it hold in place
professionally by some tape

Step 3: The software

We're just a few lines of code away from completing this project!
For coding I use nodeJS because I like how it works and as a web developer I'm comfortable with JavaScript. Also the package manager (npm) is a real plus for node!

In this example I let the raspberry inform me via email when the door status changes but you can do all kinds of stuff with that like play a sound, post it on twitter (probably not the best idea)

You'll need two packages from npm. Install them with these commands:

  • (if you don't have nodejs installed and are using raspian) apt-get install nodejs npm
  • npm install emailjs
  • npm install rpi-gpio

This is the code:
You'll have to change the following things:

  • If you're using a different pin than I in my circuit diagram, change the doorpin value
  • Change your email credentials (user, password, host if you're not using gmail)
  • Change the "from:" and "to:" addresses in the readInput function

var gpio = require('rpi-gpio');
var email   = require("emailjs/email");
var doorpin = 7; //the GPIO port you connected to the cicruit
var server  = email.server.connect({
                user:    "your.username",
                password:"YourPassword",
                host:    "smtp.gmail.com",
                ssl: true});
var laststate = 1;

gpio.setup(doorpin, gpio.DIR_IN,readInput);

function readInput()
{
    gpio.read(doorpin, function(err, value){
        if(laststate!=value)
        {
                console.log(translateStatus(value));
                server.send({ //sending email
                   text:    translateStatus(value),
                   from:    "Door <youremail@gmail.com>",
                   to:      "somebody <youremail@gmail.com>",
                   subject: translateStatus(value)
                }, function(err, message) { console.log(err || message); });
        }
        laststate = value;
    });

  setTimeout(readInput,1000); //recheck door every second
}

function translateStatus(s){
  if(s==0) return 'The door is now open! '+getTime();
  else return 'The door is now closed! '+getTime();
}

function getTime(){
        var h = new Date().getHours();
        var m = new Date().getMinutes();
        var s = new Date().getSeconds();
        if(h <10) h = '0'+h;
        if(m <10) m = '0'+m;
        if(s <10) s = '0'+s;
        return h+':'+m+':'+s;
}

To run the code you'll have to save it in something like dooralert.js and then run it via the following command:
nodejs dooralert.js
If everything works and you open, then close your door you should get a mail like this:

Where to go from here

The next thing I want to do with this is connect a webcam to the raspberry via USB and then take a picture every time the door is opened. This will not be so difficult but I'll need to figure out where to put the cam :D

Thursday, February 21, 2013

Fibonacci crash - Don't let students code on a virtual Remote Desktop Server

Some  time ago I set up a virtual Server 2008 R2 on the physical Server 2008 R2 so I can test the Remote Desktop Services.

RDS would make my life as a sysadmin a lot easier because I wouldn't need the deployment server anymore and just install and maintain software on one machine but since some things like watching videos isn't as smooth and easy I didn't change the current system configuration but let the virtual RDS running. I gave the virtual Server just 4 cores of the Server and a dynamic amount of RAM (at least 2GB though).

I wanted to code in nodeJS with my students today via RDS and everything went great!

Well.. until I told them to solve the Project Euler Problem #2 which is about finding the sum of all even numbered fibonacci numbers below 4 million. Most of them just coded it straight forward like this

var lastfibo=1;
var sum=0;
for(var i=2;i<10000;i++)
{
   var fibo = i+lastfibo;
   if(fibo%2==0)
     sum+=fibo;
   lastfibo = fibo;
}

This of course led to massive CPU consumption so the RDP was pretty much dead.
Whats interesting is that this also affected the host system which is also the domain controller so nothing responded, nobody could save anything and because of roaming profiles many local applications died with the server.

When I realized that this was probably not such a good idea a teacher came in asking us if our computers also froze.

Because of my brilliant idea to work with my students on the testserver I set up the whole schoolnetwork was down and the main server didn't respond at all so I had to pull the plug.

Lesson learned: don't let students code on a virtual machine that is hosted on the domain controller :)