{HowTo} turn on/off your monitor (Time based, PIR/Button, App)



  • Hey sorry, i thought u disabled the MMM-PIR for sure.

    U cannot use both (Module and the script) at the same time.

    Thats because i said u should disable the autostart in the rc.local to see if the MMM-PIR is active.

    So please disable the module and just use the script. Then the pkill command will work as u want 🙂



  • everything is working after disabling module 🙂

    just one remark there is needed to add also to crontab to turn off monitor at f.e. 21:02 because if there will be movement in last seconds before pir.py will be killed monitor will stay on 🙂



  • @Module-Developers im trying to do something a bit different maybe you can help.
    I’d like to use PIR but I also want that on one particular day of the week PIR shouldn’t work and it should stay on no matter what.
    Is that possible?



  • Read the last few posts 😉

    For example u want to use the pir from Sunday 22pm over the whole week until next Sunday 6am.
    So on every Sunday from 6am to 22pm the monitor should stay on.

    So you just need two cronjobs. On Sunday, 6am u need to kill the pir.py and on Sunday, 22pm you need to start it again 🙂

    Try it like this:

    1. nano killpir.sh

    2. Write this into file and save with CTRL+X and Yes

    #!/bin/bash
    sudo pkill $(ps aux | grep python pir.py | awk '{ print $2 }')
    vcgencmd display_power 1
    
    1. chmod +x killpir.sh

    2. sudo nano /etc/crontab

    3. Write this into file and save with CTRL+X and Yes:

    0 22 * * 7 /usr/bin/sh /home/pi/killpir.sh
    0 6 * * 7 /usr/bin/python /home/pi/pir.py
    

    So for example your crontab looks like this:

    # /etc/crontab: system-wide crontab
    # Unlike any other crontab you don't have to run the `crontab'
    # command to install the new version when you edit this file
    # and files in /etc/cron.d. These files also have username fields,
    # that none of the other crontabs do.
    
    SHELL=/bin/sh
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    
    # m h dom mon dow user  command
    17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
    25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
    47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
    52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
    0 22    * * 7   root    /usr/bin/sh /home/pi/killpir.sh
    0 6     * * 7   root    /usr/bin/python /home/pi/pir.py
    #
    

  • Project Sponsor Module Developer

    @cruunnerr

    You’re the king of cronjobs!



  • @cruunnerr

    I tried your script but unfortunately it doesn’t seems to work yet. Like @blebbens , my MM is on the floor and activated a little bit too easy.

    Any other suggestion?

    Regards,



  • Well, for my solution it is totally necessary to NOT use the PIR-Module. You must use just my external script solution!
    Tests i made working fine… 🙂

    Anyhow… You could try to use clear nail polish.

    I used it to cover certain regions and it works 🙂
    Just paint several layers of the polish over the area u want to cover.

    Or play with the sensitivity
    Bild Text



  • @cruunnerr

    I actually use option 2.2 - external script and already set both sensitivity and time delay to minimal (all the way to left).

    would you mind to send me your pir.py?

    Regards,



  • Sure, my pir.py is the same as shown on point 2.2 but with other GPIO used

    #!/usr/bin/env python
    
    import sys
    import time
    import RPi.GPIO as io
    import subprocess
    import pigpio
    
    io.setmode(io.BCM)
    SHUTOFF_DELAY = 119 # seconds
    PIR_PIN = 25       # 22 on the board
    LED_PIN = 16
    
    def main():
        io.setup(PIR_PIN, io.IN)
        io.setup(LED_PIN, io.OUT)
        turned_off = False
        last_motion_time = time.time()
    
        while True:
            if io.input(PIR_PIN):
                last_motion_time = time.time()
                io.output(LED_PIN, io.LOW)
                print ".",
                sys.stdout.flush()
                if turned_off:
                    turned_off = False
                    turn_on()
            else:
                if not turned_off and time.time() > (last_motion_time + 
                                                     SHUTOFF_DELAY):
                    turned_off = True
                    turn_off()
                if not turned_off and time.time() > (last_motion_time + 1):
                    io.output(LED_PIN, io.HIGH)
            time.sleep(.1)
    
    def turn_on():
            subprocess.call("sh /home/pi/lights_on.sh", shell=True)
    
    def turn_off():
            subprocess.call("sh /home/pi/lights_off.sh", shell=True)
    
    if __name__ == '__main__':
        try:
            main()
        except KeyboardInterrupt:
            io.cleanup()
    

    Because i use some LED Stripes which turn on when the pir detects movement my “monitor_on.sh” is called “lights_on.sh”

    lights_on.sh:

    vcgencmd display_power 1
    
    pigs p 17 1
    pigs p 22 1
    pigs p 24 1
    
    sleep 0.06s
    
    pigs p 17 2
    pigs p 22 2
    pigs p 24 2
    
    sleep 0.06s
    
    pigs p 17 3
    pigs p 22 3
    pigs p 24 3
    
    sleep 0.06s
    
    pigs p 17 4
    pigs p 22 4
    pigs p 24 4
    
    sleep 0.06s
    
    pigs p 17 5
    pigs p 22 5
    pigs p 24 5
    
    sleep 0.06s
    
    pigs p 17 6
    pigs p 22 6
    pigs p 24 5
    
    sleep 0.06s
    
    pigs p 17 7
    pigs p 22 7
    pigs p 24 6
    
    sleep 0.06s
    
    pigs p 17 8
    pigs p 22 8
    pigs p 24 7
    
    sleep 0.06s
    
    pigs p 17 9
    pigs p 22 9
    pigs p 24 8
    
    sleep 0.06s
    
    pigs p 17 10
    pigs p 22 10
    pigs p 24 9
    
    sleep 0.06s
    
    pigs p 17 11
    pigs p 22 11
    pigs p 24 10
    
    sleep 0.06s
    
    pigs p 17 12
    pigs p 22 12
    pigs p 24 11
    

    lights_off.sh:

    pigs p 17 12
    pigs p 22 12
    pigs p 24 11
    
    sleep 0.06s
    
    pigs p 17 11
    pigs p 22 11
    pigs p 24 10
    
    sleep 0.06s
    
    pigs p 17 10
    pigs p 22 10
    pigs p 24 9
    
    sleep 0.06s
    
    pigs p 17 9
    pigs p 22 9
    pigs p 24 8
    
    sleep 0.06s
    
    pigs p 17 8
    pigs p 22 8
    pigs p 24 7
    
    sleep 0.06s
    
    pigs p 17 7
    pigs p 22 7
    pigs p 24 6
    
    sleep 0.06s
    
    pigs p 17 6
    pigs p 22 6
    pigs p 24 5
    
    sleep 0.06s
    
    pigs p 17 5
    pigs p 22 5
    pigs p 24 5
    
    sleep 0.06s
    
    pigs p 17 4
    pigs p 22 4
    pigs p 24 4
    
    sleep 0.06s
    
    pigs p 17 4
    pigs p 22 4
    pigs p 24 4
    
    sleep 0.06s
    
    pigs p 17 3
    pigs p 22 3
    pigs p 24 3
    
    sleep 0.06s
    
    pigs p 17 2
    pigs p 22 2
    pigs p 24 2
    
    vcgencmd display_power 0
    
    sleep 0.06s
    
    pigs p 17 1
    pigs p 22 1
    pigs p 24 1
    
    sleep 0.06s
    
    pigs p 17 0
    pigs p 22 0
    pigs p 24 0
    

    But what exactly doesn’t work with my script? Maybe i can help 🙂



  • Thanks @cruunnerr.

    In my case, no LED involved hence should be simpler 🙂

    I run PIR.PY externally (via PM2) to call monitor on/off shell script and everything seems to work fine i.e.: turn screen blank and back on does work. No error reported. Its just the adding your script does not seems to make any difference, the turn on still instant.

    Here is my PIR.py file

    #!/usr/bin/env python
    
    import sys
    import time
    import RPi.GPIO as io
    import subprocess
     
    io.setmode(io.BCM)
    SHUTOFF_DELAY = 15  # seconds delay to turn off
    PIR_PIN = 17        # Pin 11 on the board
    TURNON_DELAY = 10   # seconds delay to turn on
     
    def main():
        io.setup(PIR_PIN, io.IN)
        turned_off = False
        last_motion_time = time.time()
     
        while True:
            if io.input(PIR_PIN):
                last_motion_time = time.time()
                sys.stdout.flush()
                if turned_off and time.time() > TURNON_DELAY:
                    turned_off = False
                    turn_on()
            else:
                if not turned_off and time.time() > (last_motion_time + SHUTOFF_DELAY):
                    turned_off = True
                    turn_off()
            time.sleep(.1)
     
    def turn_on():
        subprocess.call("sh monitor_on.sh", shell=True)
     
    def turn_off():
        subprocess.call("sh monitor_off.sh", shell=True)
     
    if __name__ == '__main__':
        try:
            main()
        except KeyboardInterrupt:
            io.cleanup()
    

    Here is the monitor_off.sh

    #! /bin/bash
    export DISPLAY=:0
    xset dpms force off
    
    

    And Monitor_on.sh

    export DISPLAY=:0
    xset dpms force on