[DIY] Smart Mirror

Bewegungsmelder

Die Verwendung eines Bewegungsmelders würde ich in jedem Fall empfehlen, denn ansonsten steigt die Stromrechnung doch schon um einiges, wenn das Display seine 40 W oder mehr im Dauerbetrieb zieht. Dabei gibt es zwei Möglichkeiten, einmal wird dauerhaft, beispielsweise jede Sekunde, der Status des Bewegungsmelders abgefragt und entsprechend reagiert, das hat allerdings eine erhöhte CPU Last zur Folge. Variante zwei ist nur zu reagieren, wenn sich der Status des Bewegungsmelders ändert, beispielsweise wenn jemand zum Spiegel geht und registriert wird.

Wir haben uns für die zweite Version entschieden, zeigen euch hier aber beide Varianten. Generell wird es so gehandhabt, dass einfach das HDMI Signal abgeschaltet wird und so der Monitor automatisch in den Standby wechselt, der Bewegungsmelder schaltet das Signal wieder ein und der Spiegel hat wieder eine Anzeige. In unserem Skript läuft quasi ein Timer, welcher bei Bewegungserkennung zurückgesetzt wird, falls die Bewegung ausbleibt, wird der Bildschirm abgeschaltet.

Egal welche Variante ihr bevorzugt, über Putty und die IP eures Spiegels verbindet ihr euch zunächst. Der Login ist „pi“ und das Passwort „glancr!2017“. Mit dem darüberstehenden Befehl ladet ihr eure bevorzugte Version runter:

Beispiel Variante 1: ständige Abfrage

sudo curl -o /usr/local/sbin/pir https://somegit.dev/anonfunc/hwp_goodies/raw/branch/master/smartmirror_poll.py

import RPi.GPIO as GPIO
import time
import os

#Board Mode: Angabe der Pin-Nummer
GPIO.setmode(GPIO.BOARD)

#GPIO Pin definieren fuer den Dateneingang vom Sensor
PIR_GPIO = 16
GPIO.setup(PIR_GPIO,GPIO.IN)

read=0
wait=0

try:
 #PIR auslesen
 while GPIO.input(PIR_GPIO)==1:
   read=0

 #Abbruch ctrl+c
 while True :
   #PIR Status abfragen
   read = GPIO.input(PIR_GPIO)

   if read==1 and wait==0:
     os.system("vcgencmd display_power 1")
     wait=1

   elif read==0 and wait==1:
     wait=0

 time.sleep(0.01)

except KeyboardInterrupt:
 GPIO.cleanup()

Variante 2: Reaktion auf Änderung (von uns verwendetes Skript)

sudo curl -o /usr/local/sbin/pir https://somegit.dev/anonfunc/hwp_goodies/src/branch/master/smartmirror_ir.py

#!/usr/bin/env python

import RPi.GPIO as GPIO
import os
import time
import sys

# PIR pin
PIR_GPIO = 16
# Display timeout in seconds
TIMEOUT = 60

# DONT EDIT BELOW THIS LINE
# UNLESS YOU KNOW WHAT YOU ARE DOING

GPIO.setmode(GPIO.BOARD)
GPIO.setup(PIR_GPIO, GPIO.IN)
timer = 0
display = False

def set_display(enable):
    global display
    display = enable
    os.system("vcgencmd display_power " + str(int(enable)))

def check_timeout():
    if timer >= TIMEOUT and display:
        set_display(False)
    elif not display and timer < TIMEOUT:
        set_display(True)

def motion(pin):
    global timer
    timer = 0

if __name__ == "__main__":
    try:
        GPIO.add_event_detect(PIR_GPIO, GPIO.RISING, callback=motion)
        while True:
            time.sleep(1)
            if timer < TIMEOUT:
                timer += 1
            check_timeout()
    except KeyboardInterrupt:
        GPIO.cleanup()
        sys.exit(0)

Damit das Skript auch ausgeführt wird, müssen wir eine Service Datei einpflegen:

sudo curl -o /etc/systemd/system/pir.service https://git.harting.dev/anonfunc/hwp_goodies/raw/branch/master/pir.service

Inhalt:

[Unit]
Description=Display timeout PIR daemon
Wants=local-fs.target

[Service]
ExecStart=/usr/local/sbin/pir
Restart=always
KillSignal=SIGINT

[Install]
WantedBy=multi-user.target

und ändert noch die Rechte entsprechend:

sudo chmod u+x /usr/local/sbin/pir

Damit das Ganze auch aktiviert wird führen wir folgenden Befehl aus:

sudo systemctl enable pir.service

Mit sudo reboot, neustarten und Fertig. Der Bildschirm wird automatisch alle 1 min ausgeschaltet, eine Bewegung schaltet ihn wieder ein bzw. setzt den Timer zurück, sodass er gar nicht erst ausgeschaltet wird, falls man sich direkt davor befindet. Mit den Drehreglern direkt am Bewegungsmelder kann noch die Sensitivität eingestellt werden, hier müsst ihr einfach etwas rumprobieren. Je nach belieben kann natürlich auch der Timer noch verlängert werden, dazu einfach die Zahl hinter Timeout erhöhen.

Habt ihr Fragen, Anregungen oder Verbesserungen, bitte ab in die Kommentare damit.

Inhaltsverzeichnis:

  1. Hardware
  2. Software
  3. Zusammenbau
  4. Bewegungsmelder