MagicMirror² v2.5.0 is available! For more information about this release, check out this topic.

PIR-Sensor - put your mirror to sleep if not used


  • Admin

    Description:

    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.

    Download:

    FAQ

    “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 package.json file in ~/MagicMirror/modules/MMM-PIR-Sensor like this.

    Developer note

    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_PRESENCE broadcast. It will return true or false as its payload.

    Changelog


    Initial release


  • Moderator

    For troubleshooting or HOWTO questions, please post in the Troubleshooting thread:
    https://forum.magicmirror.builders/topic/208/pir-sensor-put-your-mirror-to-sleep-if-not-used/1



  • 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.


  • Moderator

    Please do not cross-post the same question across multiple categories. Answers will get lost in the various posts.


  • Admin

    @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.

    https://github.com/Pulse-Eight/libcec/issues/84

    Will this library work for this application?

    Any help would be greatly appreciated. 🙂


  • Moderator

    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:
    OFF:
    /opt/vc/bin/tvservice --off
    ON:
    /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 = 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 the conf.json file. Don’t forget to add the comma behind the previous entry.
    • Optional but recommended to get a clean exit:
      Insert the whole for loop in a try 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.



  • 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