PIR-Sensor - put your mirror to sleep if not used
MMM-PIR-Sensor will monitor a connected PIR-sensor and putt your mirror to sleep if no one uses it either by disabling HDMI output or by turning of a relay.
“An unhandled error occurred inside electron-rebuild. Unable to find electron-prebuilt’s version number, either install it or specify an explicit version”
Possible solution: Change your
If you are a developer and want to pause your module while no one uses it (if it is processor intense), you can listen to the
USER_PRESENCEbroadcast. It will return
falseas its payload.
For troubleshooting or HOWTO questions, please post in the Troubleshooting thread:
I was wondering if there is a way to toggle the power to the TV via HDMI CEC commands (sent by pi) and integrating a PIR sensor?
Example setup: The pi is always powered on. I walk into the room, the PIR senses me, and sends a power on signal to my TV via HDMI CEC command, and the mirror modules are displayed.
After a set duration, if no activity sensed by PIR sensor, a power off CEC command is sent to the TV by PI.
Has this been done before?
Any guidance would be much appreciated.
Please do not cross-post the same question across multiple categories. Answers will get lost in the various posts.
@sameershah23 Should be possible. There already is a function that turns of the HDMI output of the Pi you would just need to replace that part (or add a new mode) that sends a command to the monitor. Feel free to send a pull request!
@paviro I am fairly new to the programming world, but i was wondering what I need to add to the “//Detected Movement” & “//No movement” parts so that it sends the appropriate power toggle CEC signal to my TV?
Do I need to install the CEC library? How do I initialize this CEC library in your node_helper.js file?
After some googling, i found this library for CEC.
Will this library work for this application?
Any help would be greatly appreciated. :)
Assuming your monitor/TV supports proper HDMI CEC commands, you need to first install the necessary binaries on your rpi and test that yourself - that’s outside of MM².
Once you figured out that it works, then you need to write (or ask someone else to write) a module that interacts with the CEC binaries sending the proper commands. - that’s MM² related.
@sameershah23 maybe power off and on your hdmi signal and let your monitor/tv go to sleep mode when no signal.
The command will be:
/opt/vc/bin/tvservice --preferred && sudo chvt 6 && sudo chvt 7
You can easily execute commands in node.js
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 = 1to
(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.jsfile. 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"
"time_to_switch_off": 30to the
conf.jsonfile. Don’t forget to add the comma behind the previous entry.
- Optional but recommended to get a clean exit:
Insert the whole
forloop in a
Between line 53 and 54, add
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
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?