Read the statement by Michael Teeuw here.
-
Using motion detection to switch your mirror on and off is very appealing. PIRs are a good option and Paviro’s module does a wonderful job. However, for an aesthetic point of view, I would like to mount the motion sensor behind the mirror, i.e. in such a way you can’t see the sensor. Since glass absorbs the light the PIR is sensitive to, PIRs (or at least the ones I tested, played with sensitivities as well) are not the best option. I played around a bit and found an alternative solution based on the Picamera, OpenCV and Paviro’s MMM-PIR module.
Downsides include having to run a python program next to the Magic Mirror. On a RPi3 it this is not a problem and is in my view therefore a rather minor drawback. If you run your MM on a RPi2, this may be an issue. Getting this to work also requires a non-trivial installation of OpenCV. However, thanks to the fantastic people over at PyImageSearch, detailed instructions are available. Upsides of this solution are: motion detection using a camera from behind the glass and the possibility to upload a photo taken by the camera each time it detects motion to your dropbox account.
Steps to follow:
- Disable the red LED on the Picamera by adding
disable_camera_led = 1
to\boot\config.txt
(you don’t want to see red LED of the camera when looking at your mirror) - Install a full version of OpenCV on the RPi. Detailed instructions can be found here
- Follow the two part tutorial on writing a python based code for motion detection: Part I and Part II
- Modify the python program found on the second page to generate a 3.3 V signal on a specified pin when the camera detects motion. This pin (pin 4 below) is then connected by a wire to the pin you specified in the MMM-PIR section of the MM
config.js
file. My modifications to the python code are:
On line 14 of the python code, add:
import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) OPENCV_pin = 4 # specify whatever pin you want to generate the 3.3 V at when motion is detected. GPIO.setup(OPENCV_pin, GPIO.OUT)
On line 26 add:
UnoccupiedCounter = 0 NumUnoccFramesSwitchOff = conf["fps"] * conf["time_to_switch_off"]
On line 108 insert:
UnoccupiedCounter = 0 if GPIO.input(OPENCV_pin) == 0 # check if openCV pin is high or low. If low, turn high GPIO.output(OPENCV_pin,1) print "Switched Mirror ON"
On line 137 insert:
UnoccupiedCounter = UnoccupiedCounter + 1 if UnoccupiedCounter = numUnoccFramesSwitchOff and GPIO.input(OPENCV_pin)==1: GPIO.output(OPENCV_pin, 0) print "Switched Mirror OFF"
- Add
"time_to_switch_off": 30
to theconf.json
file. Don’t forget to add the comma behind the previous entry. - Optional but recommended to get a clean exit:
Insert the wholefor
loop in atry
statement.
Between line 53 and 54, add
try:
Don’t forget to indent all the code that comes next. Add the very bottom, add:
except KeyboardInterrupt: print "Stopped camera surveillance" # exit the program when you press CNRL +C except: print "Other error or exception occurred!" # catch all other errors finally: GPIO.cleanup() # this ensures a clean exit.
I hope the above is of use to some of you.
- Disable the red LED on the Picamera by adding
-
HI @IngmarSwart,
great hack!! Did you use the original Camera behind the glass? Noir or without the IR Filter?
I’m using a PI2, can you specify why this should be an issue?
Best regards
Dirk -
Hi @DirkS,
I use a standard first generation RPi camera board. In other words, this solution works perfectly fine with IR filter on the camera.
The reason I think there might be issues with the RPi2: you should realize that this solution requires the RPi to analyze 10 images per second (give or take a few, you can specify the frame rate) using OpenCV routines. This causes a significant bump in processor load (approximately 33% on the RPi3 on top of everything else, if I’m not mistaken). I simply don’t know if the processor of the RPi2 is fast enough to do the image analysis, run the MM and the operating system simultaneously. The only way to know for sure is to test. I can’t help you with that as I don’t own a RPi2. Should the RPi2 struggle, perhaps you can get away with analyzing fewer frames (5 or maybe even 2). I encourage you to try and report back!
Best wishes,
Ingmar -
Hello,
my module is not working, I have the pir sensor connected to Pin 7 and when you start the screen stays white and nothing happens when I take the pir of the config it goes again. -
@samydp Maybe you can find the answer here :After rebooting, run MM with pm2 and shows “White Screen”, I checked the pm2 error log shows something like “Expected 49, got 48” as before,
Run “npm rebuild --runtime=electron --target=1.3.4 --disturl=https://atom.io/download/atom-shell --abi=49” in the MMM-PIR-Sensor folder,
Run “pm2 restart mm” and it works.” -
it is not’ve tried as it stands anyway thanks for your help
-
@IngmarSwart Thats a really nice solution. Did you use the virtual environment from the tutorials? If you did so, how did you wrap them together? Is it even possible? Thanks
-
Since IngmarSwart didn’t connect since few months, maybe someone can just explain me the reason why a PIR sensor is still needed in his config? i don’t get the role of the PIR since there is already a cam to detect the move…? if anyone… thx guys!
-
@Defibrillat0r: Thanks. Yes, I use the virtual environment. That being said, I don’t think it is stricktly necessary. In our configuration, the RPi is dedicated to running the MM, so the likelyhood that you need different versions of packages is very small. If you do use the virtual environment, you just have to make sure all the packages listed at the top of the python file are installed for the virtual environment you are working on. Other than that, no special tricks are needed.
@bibi: In my solution a PIR sensor is not needed. You only use @paviro’s module to interface the python code with the MM.
-
@IngmarSwart ohh ok now it’s clear! thx alot for your reply.
your hack is working perfectly so far?