Raspberry Pi Projekt Lichtschranke
Da die Motion Detection unserer etwas älteren IP Kamera gerade bei Nebel, Scheinwerferlicht und Vögeln häufig zu Fehlauslösungen führte, haben wir die Alarmfunktion mit einer Lichtschranke erheblich verbessern können!
Dies ist ganz einfach und auch relativ günstig möglich. Benötigt wird ein Raspberry Pi mit Spannungsversorgung und Zugang zum lokalen Netzwerk.
Raspberry Pi Projekt Lichtschranke
Dazu habe ich diese tolle Lichtschranke für etwa 35 EUR mit folgenden Funktionen gefunden:
- Doppelstrahl Infrarot Lichtschranke
- 100m Outdoor Reichweite, Indoor sogar 300m
- mit Digital Fuzzy als künstliche Intelligenz
- funktioniert perfekt bei Tag & Nacht, auch bei Schneesturm usw.
- bis zu 180°+/-90° Horizontale Ausrichtbarkeit und +/-10° Vertikale
- Betriebstemperaturen von -25°C…95°C
Pyhton-Code der Lichtschranke
Mit folgendem Python-Code, habe ich die Lichtschranke in unserem Netzwerk so integriert, dass bei Unterbrechung
- eine Mitteilung in ein lokales Logfile geschrieben wird
- die angeschlossene LED rot aufleuchtet
- ich eine Email erhalte
- zudem eine Nachricht im lokalen Netzwerk erhalte, die über das MQTT Protokoll versandt wird (funktioniert auch ohne Internet!)
- bei einer längeren Unterbrechnung (Zeit ist einstellbar) erhalte ich einmalig die Info, dass die Lichtschranke nun dauerhaft unterbrochen ist
#!/usr/bin/env python # coding: utf8 from __future__ import absolute_import, division, print_function import RPi.GPIO as GPIO import smtplib import time import paho.mqtt.client as mqtt BtnPin = 13 Gpin = 12 Rpin = 11 TimeOut_Alert_sec = 90 TimeOut_Disconnected_sec = 600 lastdetect = 0 Counter = 0 fromaddr = 'Raspberry Pi Alarmsystem' toaddrs = 'xxx@googlemail.com' username = 'xxx@googlemail.com' password = 'xxx' msg1_part1 = """From: Raspberry Pi Alarmsystem To: xxx@googlemail.com Subject: """ msg1_part2 = """Zone17: Lichtschranke1 """ msg2_part1 = """From: Raspberry Pi Alarmsystem To: xxx@googlemail.com Subject: """ msg2_part2 = """Zone17: Lichtschranke1 (dauerhaft) """ def on_connect(client,userdata,flags,rc): print("Connected with result code "+str(rc)) client = mqtt.Client() client.on_connect = on_connect client.connect("localhost",1883,60) client.loop_start() def setup(): GPIO.setmode(GPIO.BOARD) # Numbers GPIOs by physical location GPIO.setup(Gpin, GPIO.OUT) # Set Green Led Pin mode to output GPIO.setup(Rpin, GPIO.OUT) # Set Red Led Pin mode to output GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # Set BtnPin's mode is input, and pull down to low GPIO.add_event_detect(BtnPin, GPIO.BOTH, callback=detect, bouncetime=1000) def Led(x): if x == 1: GPIO.output(Rpin, 1) GPIO.output(Gpin, 0) if x == 0: GPIO.output(Rpin, 0) GPIO.output(Gpin, 1) def SendMail(reason): # reason=detected / reason=disconnected date = time.strftime("%Y%m%d") zeit = time.strftime("%H:%M") WriteFile(reason) server = smtplib.SMTP('smtp.gmail.com:587') server.starttls() server.login(username,password) if reason == "detected": server.sendmail(fromaddr, toaddrs, msg1_part1+" "+date+" "+zeit+" "+msg1_part2+""+date+" "+zeit+" "+msg1_part2+"("+str(TimeOut_Alert_sec)+" Seconds blocked)") client.publish("alarm/lichtschranke",date+" "+zeit+" Zone17: Lichtschranke1") if reason == "disconnected": server.sendmail(fromaddr, toaddrs, msg2_part1+" "+date+" "+zeit+" "+msg2_part2+""+date+" "+zeit+" "+msg2_part2+"("+str(TimeOut_Disconnected_sec/60)+" Minutes disconnected)") client.publish("alarm/lichtschranke",date+" "+zeit+" Zone17: Lichtschranke1 (dauerhaft)") server.quit() def WriteFile(reason): date = time.strftime("%Y%m%d") zeit = time.strftime("%H:%M") fileout = open("/home/pi/Desktop/Lichtschranke.txt","a") time.sleep(0.1) if reason == "detected": fileout.write(date+";"+zeit+"; Die Lichtschranke wurde unterbrochen \n") if reason == "disconnected": fileout.write(date+";"+zeit+"; Die Lichtschranke wurde dauerhaft unterbrochen \n") time.sleep(0.1) fileout.close() print("Log-File geschrieben") def detect(channel): global lastdetect now = time.time() if now - lastdetect < TimeOut_Alert_sec: return SendMail("detected") lastdetect = now def loop(): global Counter while True: time.sleep(1) if GPIO.input(BtnPin) == GPIO.HIGH: # print("Lichtschranke frei"); Led(0) Counter = 0 if GPIO.input(BtnPin) == GPIO.LOW: # print("Lichtschranke unterbrochen"); Led(1) Counter += 1 if Counter == TimeOut_Disconnected_sec: SendMail("disconnected") def destroy(): GPIO.output(Gpin, GPIO.HIGH) # Green led off GPIO.output(Rpin, GPIO.HIGH) # Red led off GPIO.cleanup() # Release resource def main(): # Program start from here setup() try: loop() except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the child program destroy() will be executed. pass finally: destroy() if __name__ == '__main__': # Program start from here main()
Entsprechend kann man nun einen Ausgang bei Unterbrechung schalten, der als Alarmeingang in die IP-Kamera geht und ein Alarmbild auslöst.
Ich kann nur sagen, dass ich von der Funktionalität und der Zuverlässigkeit dieser günstigen Lösung wirklich begeistert bin!! Wir überwachen so eine Strecke von über 80m, ohne dass ich hunderte Alarmbilder bei schlechten Wetter in einer Nacht erhalte! Das Ganze ist zudem schon aufgrund der großen Abstände sehr unauffällig und die Lichtschranke kann problemlos versteckt werden. Zudem kann man sie in einer Höhe anbringen, in der keine Hunde oder Katzen stören.
Bei Unterbrechung erhalte ich außerdem eine Email und eine Nachricht über MQTT, die im lokalen Netzwerk auch bei Ausfall des Internets funktioniert. Aber mehr dazu gibt es in einem weiteren Artikel.
Auf meinem Tablet nutze ich die Anroid App FireAlert 2, mit dieser tollen App kann ich individuelle Benachricchtigungsoptionen je nach Mail einstellen. So erhalte ich die Info bei Unterbrechung der Lichtschranke, auch wenn ich mein Handy/Tablet eigentlich auf lautlos gestellt habe.