Build a Raspberry Pi door / window sensor with Reed Relais

In addition to a surveillance camera and motion sensors, information about open windows and doors is also of interest to a self-built surveillance system. A check with infrared light barriers or other methods would certainly be possible, but in this case, that is much more complicated.

In this tutorial, it will be shown how to easily check the e.g. status of the window with a magnetic switch.


Required Hardware Parts

Luckily, not much is needed to attach the switch, and most parts are likely already present in most hobbyists crates. I have used these components:



The setup is as shown in the picture. As input pin I used GPIO 17 (board pin 11):

magnet contact breadboard


magnetic switches

The wired module allows the voltage to flow through the associated magnet.

It does not matter which of the two cables of the magnetic switch is connected to the base of the transistor. The free end should be attached to the window/door and the one with cable best to the fixed door/window frame.

If the two parts are too far apart, it is possible that only a very small amount of electricity will flow through the transistor, which is insufficient to switch. In this case, you can try making a Pi’s connection 5V instead of 3.3V, but then you should definitely set a resistance between the transistor emitter and GPIO.

Of course, you could build this circuit as a pull-up resistor and thus would have a HIGH signal only when the window is open.




The controls are very simple and can be used in this form in many projects. Instead of my subsequent Python code, similar code can also be used e.g. in C ++ (using WiringPi).

But now to the code:

sudo python

As long as the window and thus also the magnetic switch is closed, a 1 is displayed on the pin. As soon as the contact is interrupted, the transistor no longer switches and a zero is displayed on the GPIO. This will allow you to query if a window/door is opened or not.

If you want to wait for the state to change, you can use the following function:

In this case, a function called my_callback() must be present, which is then called. Here are the states GPIO.RISING and GPIO.FALLING instead of GPIO.BOTH possible.



Bild: Toby Golding/Flickr(CC BY 2.0)

5 Responses

  1. This constantly has a drain of electricity why not test just a pin on the PI to see if it is HI if so alarm eliminate the transistor and one resistor.


  2. One thing I haven’t seen on construction of a PI security system is the question of cable length that run from the PI to the sensors. I understand the concept of voltage drop but not sure about anything other voltage out. Is there a recommendation of max cable length and if so is there a solution such as a repeater or a way to interface multiple PI units as one interface? Was thinking of maybe using something like Cat6.

    • I haven’t actually measured the voltage drop on the long wires that I’m using, but I have wires that run well over 50 feet and still work perfectly well with Raspberry Pi’s GPIO pins. I have several door sensors, as well as a water sensor, which is just two wires that short out when contacting water. For the door sensors I’m actually reusing the existing wiring from an ancient security system that came with the house. And for the water sensors I’m using cheap speaker wire. No issues so far.

  3. Nice, thanks for sharing.
    I’m about to give this a go as a test, but ran into a fundamental question on the planning board :): how do you scale this up to handle like 50 sensors? Obviously the goal would be to be able to individually identify the particular magnet failing, and there’s only so many GPIO pins available.
    In theory, the best would be to join all the sensors and make them available via some bus, but that is beyond my understanding (today, lol)


Leave a Comment

Your email address will not be published.

Subscribe to Raspberry Pi Tutorials and don't miss any new Tutorial!