Hallo,
wie ersichtlich bin ich im Bezug auf Python blutiger Anfänger und erbitte eure Hilfe.
Mein Vorhaben ist, mittels PIR oder Magnetkontakt einen Event auszulösen und darauf hin eine Benachrichtigung mittels pushbullet zu erhalten. Gleichzeitig soll noch mit der Pi Cam eine Videosequenz aufgezeichnet werden. Diese per pushbullet, oder ein Standbild zu erhalten wäre schön.
Nachdem ich mich durch, ich weiß nicht wie viele Artikel gelesen habe und verschiedene Ansatzpunkte versucht habe, habe ich es halbwegs hinbekommen.
Besonderen Dank an meigrafd, von wo ich die Auslösung des events mittels Interrupt übernommen habe. Ich finde, das ist die eleganteste Lösung.
Der Weg, wie ich das ganze zusammengefügt habe ist aber mit Sicherheit laienhaft und bedürfte eine Überarbeitung.
Als erstes rufe ich pir1.py auf. Von dort wird ein subprocess (pushbullet.sh) aufgerufen um nach einem Event eine push Nachricht zu versenden. Danach wird ein weiterer subrocess (cam.py) aufgerufen um die Aufnahme zu starten und zu speichern.
Das erste Problem ist, das nach starten von pir1.py das ganze nur einmal funktioniert. Also keine Wiederholung, ohne pir1.py neu zu starten.
Mit dem booten sollte es im Hintergrund laufen (als Dienst / deamon) und bei jedem neuen Event von vorne beginnen.
Die Aufnahmen werden auf einem 32 GB USB Stick gespeichert und sollten pro Event als eigenständige Datei gespeichert werden. Der Speicher sollte erst einmal groß genug sein.
Später würde ich noch darüber nachdenken, mittels cron alle Dateien z. B. älter 3 Wochen zu löschen.
Zum Schluss, nach Absenden der Pushnachricht, kommt ein ganzer "Psalm" vom pushbullet Server zurück auf die Konsole. Diesen würde ich gerne unterdrücken. Habe bereits versucht dies mittels >/dev/null 2>&1 am Ende des pushbullet.sh zu unterdrücken, was aber nicht ging.
pir1.py
Spoiler:
#!/usr/bin/python
import io
import time
import picamera
import RPi.GPIO as GPIO
import signal
import subprocess
PIR_PIN = 24
GPIO.setmode(GPIO.BCM)
GPIO.setup(PIR_PIN, GPIO.IN)
def interrupt_event(pin):
Time = time.asctime()
print("{} -> GPIO {} ausgeloest! Motion dedected".format(Time, pin))
subprocess.call("./pushbullet.sh")
subprocess.call("./cam.py")
def main():
try:
GPIO.add_event_detect(PIR_PIN, GPIO.RISING, callback=interrupt_event, bouncetime=100)
#keep script running
signal.pause()
except KeyboardInterrupt: # does not work if it runs in background.
print("Quit")
if __name__ == '__main__':
main()
GPIO.cleanup()
[/php]
pushbullet.sh
[code]
#!/bin/bash
API="xxxxxxxxxxxxxxxxxxxxxxx"
MSG="$1"
curl -u $API: https://api.pushbullet.com/v2/pushes -d type=note -d title="Alarm" -d body="$MSG"
#An diese Stelle müsste noch ein weiterer curl Befehl zum Push des Bildes oder der Viedosequenz. Habe ich aber noch nicht hinbekommen.
Alles anzeigen
Spoiler:
cam.py
[code=php]
#!/usr/bin/python
import io
import time
import picamera
import RPi.GPIO as GPIO
import signal
import subprocess
PIR_PIN = 24
GPIO.setmode(GPIO.BCM)
GPIO.setup(PIR_PIN, GPIO.IN)
with picamera.PiCamera() as camera:
stream = picamera.PiCameraCircularIO(camera, seconds=20)
camera.start_preview()
camera.start_recording(stream, format='h264')
GPIO.wait_for_edge(24, GPIO.FALLING)
camera.stop_recording()
camera.stop_preview()
for frame in stream.frames:
if frame.header:
stream.seek(frame.position)
break
with io.open('/media/usbstick/cam/video.h264', 'wb') as output:
while True:
data = stream.read1()
if not data:
break
output.write(data)
[/php]
Vielen Dank für eure Hilfe.