MagicMirror - Part 2 - Bewegungsmelder

Da ich die meiste Zeit entweder nicht zuhause bin, schlafe oder nicht im Flur stehe, ist es unnötig, das der MagicMirror die gesamte Zeit läuft. Der Dell U2412M, der hinter dem Spiegel sein Job machen soll, ist ja auch schon in die Jahre gekommen und läuft nicht nur mit Luft und Liebe. Daher fand ich es wichtig, dass sich der Spiegel abschaltet, wenn er nicht benötigt wird, aber sich automatisch wieder einschaltet, wenn es angebracht ist. Nach kurzen, dummen Ideen mit einem Bewegungsmelder oder einer Zeitschaltuhr, bemerkte ich, dass der Pi sollte sich aber auch nicht komplett ausschalten soll. Den wenn er erst booten muss, bin ich schon wieder weg vom Spiegel, bevor die MagicMirror-Software gestartet ist. Also muss eine Softwarelösung her, welche über Sensoren von einem Arduino und oder RaspberryPies laufen. Und ja solche Sensoren, welche auch in Bewegungsmeldern sind, heißen PIR-Sensor und arbeiten auf Infrarotbasis. Ich habe mir die AZDelivery HC-SR501 im 3er-Pack bei Amazon bestellt, welche nur kapp über 5 € gekostet haben.
Warum drei? Haben ist besser als brauchen.
Zum Testen des Sensors habe ich folgendes Skript von Tutorials-raspberrypi.de genutzt:

test.py
import RPi.GPIO as GPIO
import time

SENSOR_PIN = 23

GPIO.setmode(GPIO.BCM)
GPIO.setup(SENSOR_PIN, GPIO.IN)

def mein_callback(channel):
    # Hier kann alternativ eine Anwendung/Befehl etc. gestartet werden.
    print('Es gab eine Bewegung!')

try:
    GPIO.add_event_detect(SENSOR_PIN , GPIO.RISING, callback=mein_callback)
    while True:
        time.sleep(100)
except KeyboardInterrupt:
    print "Beende..."
GPIO.cleanup()

Im Link oben sieht man auch den Verdrahtungsplan, den ich aber auch in einer eMail von AZtech bei der Bestellung bekommen habe.

Nachdem ich, dank des einfachen Skripts, meinen Sensor testen konnte, fing ich an meine Skripte vorzubereiten.

Als erstes brauchte ich ein Skript, das den HDMI Port abschaltet damit, damit der Monitor in den Standby geht. Dies ist ein Einzeiler und das Wort Skript nicht wert:

monitor_off.sh
#! /bin/bash
/opt/vc/bin/tvservice -o

Zum Glück geht der Dell Monitor innerhalb von 2-3 Sekunden in den Standby und wartet nicht erst Minuten bis ein neues Eingangssignal vorhanden ist.

Und natürlich auch ein Skript um den Monitor schnell wieder aufzuwecken:

monitor_on.sh
#! /bin/bash
/opt/vc/bin/tvservice -p
fbset -depth 8
fbset -depth 16
sudo /bin/chvt 6 && sudo /bin/chvt 7

Die beiden Skripte funktionieren über SSH einwandfrei, sodass wir nun ein Skript schreiben können, dass von Sensor gesteuert wird.

pir_loop.py
#!/usr/bin/env python

import sys
import time
import RPi.GPIO as io
import subprocess

io.setmode(io.BCM)
SHUTOFF_DELAY = 10  # seconds
PIR_PIN = 17        # Pin 11 on the board

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:
                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 /home/pi/Pir-Sensor/monitor_on.sh", shell=True)

def turn_off():
    subprocess.call("sh /home/pi/Pir-Sensor/monitor_off.sh", shell=True)

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        io.cleanup()

In dem Skript läuft eine Schleife das den Status von GPIO 17 (PIN 11 auf dem Board) abfragt und prüft, ob der Monitor ausgeschaltet werden darf. Es verwendet dabei die variable SHUTOFF_DELAY, welche im Beispiel auf 10 Sekunden zum Testen gesetzt ist. Wenn der Monitor aus ist, aktiviert das Skript diesen, wenn der PIR-Sensor den PIN wieder aktiv schaltet.

Das Skript pir_loop.py wird von cron bei einem Neustart sofort wieder gestartet.

Hier ein kleines Video vom Testaufbau:

MagicMirror Artikel Reihe:
MagicMirror - Part 1 - Installation
MagicMirror - Part 2 - Bewegungsmelder
MagicMirror - Part 3 - Strip down