Forum

Einloggen | Registrieren | RSS  

luemar(R)

17.04.2017,
20:30
 

raspberry pi und PIR (Computertechnik)

habe mittels add_vent_detect und der callback Funktion ein Script für den PIR an meinem Raspberry Pi B+ geschrieben, dass mir jeweils ein Bild der PiCamera an meine E-Mail Adresse schickt und ein Zähler registriert jede PIR-Aktivierung:
>...............
>count = 0
>def mein_callbaxk(pin):
> global count
> count += 1
> print('PIR aktiviert')
> if count%3 == 0:
> print('3 mal aktiviert')
> time.sleep(30)
> return
>........

Nach jeder 3. Aktivierungen bekomme zwar die unter dem if statement eingetragene Textnachricht '3 mal aktiviert',
jedoch wird der time.sleep(30) Befehl nicht ausgeführt.

Wo liegt der Fehler ?

luemar(R)

08.05.2017,
22:03

@ bastelix

raspberry pi und PIR

» » print('DEBUG: Beginne Ruhezustand fuer %s Sekunden' %
» » PIR_IGNOR$
» Die Zeilen schauen schon mal komisch aus, ich denke das kommt vom
» kopieren...
»
» Schau mal ob in deinem Script alle geöffneten Klammern wieder geschlossen
» werden, Zeile 27 und Zeile 54 sehen in dem geposteten Code verdächtig aus.
» Falls es daran nicht lag müsstest du mal versuchen die Original-Datei
» gezippt im Forum hochzuladen oder als gist ( https://gist.github.com/ )
» einzustellen damit ich mir das genauer anschauen kann. Hier kommen wir mit
» der Forensoftware an die Grenze des verarbeitbaren.

Hallo bastelix,
tatsächlich, habe eine (doppel) Klammer übersehen und bis jetzt gebraucht um noch weitere Fehler auszumerzen.
Jetzt funktioniert alles.
Das ganze Script ist nun geposted auf:
https://gist.github.com/luemar/de19d38429fd68f3f391a2102dd00f31.

Ich möchte neben dem Senden von E-Mails mit Fotos noch eine SMS Benachrichtigung einbauen, da ich ja nicht permanent mein
E-Mail offen habe.

Weiter habe ich das Senden einer E-Mail Nachricht bei Neustart des Raspberry Pi unter /etc/rc.local eingebaut und das Script dort ebenfalls
eingetragen um sicherzustellen, dass die ganze Überwachungsanlage auch nach einem Stromausfall wieder funktioniert..

Ferner habe ich ein Teil-Script zur Aufnahme eines Fotos und dessen Versand per E-Mail unter contrab zu einem dort zu
definierenden Termin (1x pro Tag, pro Woche, pro Monat ect.) eingetragen um zu wissen, dass die Überwachungsanlage
kontinuierlich funktioniert.

Ohne Deine Hilfe bzw. des Elektronik-Kompendiums hätte ich das nie geschafft. Ich würde mich gerne erkenntlich zeigen und wenigstens
das alles jedermann zum Gebrauch zur Verfügung stellen.

Vielen, vielen Dank, luemar.

bastelix(R)

07.05.2017,
19:47

@ luemar

raspberry pi und PIR

» print('DEBUG: Beginne Ruhezustand fuer %s Sekunden' %
» PIR_IGNOR$
Die Zeilen schauen schon mal komisch aus, ich denke das kommt vom kopieren...

Schau mal ob in deinem Script alle geöffneten Klammern wieder geschlossen werden, Zeile 27 und Zeile 54 sehen in dem geposteten Code verdächtig aus.
Falls es daran nicht lag müsstest du mal versuchen die Original-Datei gezippt im Forum hochzuladen oder als gist ( https://gist.github.com/ ) einzustellen damit ich mir das genauer anschauen kann. Hier kommen wir mit der Forensoftware an die Grenze des verarbeitbaren.

luemar(R)

07.05.2017,
17:30

@ luemar

raspberry pi und PIR

» » » Hallo Experten und bastelix,
» » Das könnte man übrigens auch falsch verstehen :-P ;-)
» »
» » » schätze die eingehende Antwort, lerne auf diesem Forum mehr als in
» » » Lehr-Texten und Tutorials.
» » Das ist doch schon mal was :-) Aber das algorithmische denken musst du
» dir
» » noch aneignen, vielleicht hilft es dir dabei wenn du mal ein einfaches
» » Python-Script als Programmablaufplan/Flussdiagramm aufzeichnest um zu
» » verstehen was der Rechner eigentlich mit deinen Befehlen anstellst. (
» » https://de.wikipedia.org/wiki/Programmablaufplan ).
» »
» » » >>while True:
» » » >>>time.sleep(8)
» » Hier hast du wieder eine Endlosschleife deren einziger Inhalt es ist
» dein
» » Programm für acht Sekunden schlafen zu legen ;-)
» »
» » Was ich bei der Gelegenheit mal loswerden muss: An Python stört mich
» » extremst, dass Programmblöcke nur durch die Einrückung definiert werden.
» » Das ist schei*e lesbar und fördert das einbauen logischer Fehler...
» »
» » So genug gemotzt ;-)
» »
» » » Mein PIR PI-ADA-189 verhält sich in verschiedenen Scripts erratisch
» d.h.
» » es
» » » gibt kein 1:1 Verhältnis
» » Dein PIR wird nicht über dein Python-Programm gesteuert, wann der PIR
» den
» » Data-Pin auf HIGH/LOW zieht ist über die Hardware definiert. Dein Script
» » wertet die Pegeländerungen lediglich aus (um genau zu sein wann immer
» der
» » Pin von LOW auf HIGH geht, aufgrund des Parameters gpio.RISING bei
» » gpio.add_event_detect) und reagiert darauf entsprechend. Du musst also
» für
» » die Wartezeiten die Eigenschaften des PIR berücksichtigen, z.B. dass er
» » Bewegungen nur alle X Sekunden (das müsste sich über einen Poti
» einstellen
» » lassen, aber nur bis zu einer gewissen Untergrenze)
» »
» » Dein Python-Script muss also selber entscheiden wann es auf den IRQ vom
» PIR
» » reagiert und z.B. ne Mail verschickt oder den IRQ ignoriert.
» »
» » » Ich möchte 2 Dinge erreichen:
» » Anders formuliert: Sendet der PIR einen IRQ wird eine Aktion ausgeführt,
» » solange die Aktion das letzte mal vor PIR_DELAY Sekunden ausgeführt
» wurde.
» » Danach werden alle PIR IRQs für PIR_IGNORE_TIME Sekunden ignoriert. Und
» » dann beginnt das ganze wieder von vorn.
» »
» » Ich hab da mal was bei gist eingestellt (ist online besser lesbar als im
» » Forum):
» https://gist.github.com/anonymous/5c25da72e1c24705d626c46a99a59b18
» » Dein Foto-Machen und Mail-Verschicken Code sollte dann in Zeile 53
» » aufgerufen werden, die restlichen prints sind Debug-Ausgaben. Ich hoffe
» in
» » den Code-Kommentaren ist soweit alles erklärt. Könnte man vermutlich
» noch
» » eleganter lösen, aber nicht nach 22 Uhr und halbwegs
» Anfänger-Verständlich
» » ;-)
» »
» » » Wenn das mal funktioniert möchte ich neben dem Bild noch ein SMS
» » erhalten
» » » und mir einen remote access
» » » einrichten.
» » Divide and conquer ;-) beim remote access solltest dich aber schon etwas
» » tiefer mit der Materie Netzwerksicherheit auskennen, sonst ist dein Pi
» » möglicherweise bald aktives Mitglied in einem IoT-Botnetz...
»
» Hallo bastelix,
» habe mich mit Deinen Hinweisen und insbesondere mit dem auf
» https://gist.github.com/anonymous/5c25da72e1c24705d626c46a99a59b18
» veröffentlichen
» Script auseinander gesetzt .. toller Service !!
»
» Vom remote Access sehe ich ab, habe weitere und gleichlautende Kommentare
» gelesen.
»
» Glaubte mich am Ziel, werde jetzt aber einen Syntaxfehler einfach nicht
» los:
»
» 1. Ein einfaches Script, das bei jedem Ansprechen des PIR ein Foto macht
» und mir per E-Mail schickt
» funktioniert problemlos:
»
» #!/usr/bin/python3
» import RPi.GPIO as gpio
» import smtplib, sys, picamera, time
» from email.mime.image import MIMEImage
» from email.mime.multipart import MIMEMultipart
» from email.mime.text import MIMEText
» from email.header import Header
»
» gpio.setmode(gpio.BOARD)
» gpio.setup(23, gpio.IN)
» def mein_callback(pin):
» frm='meine E-Mail Adresse'
» to='meine E-Mail Adresse'
» smtpHost='smtpauth.bluewin.ch'
» smtpPort=587
» smtpUser='mein Name'
» smtpPassword='mein Passwort'
» subj='von Raspberry2'
» msg='Meldung von PIR 2'
» fn='foto1.jpg'
» camera = picamera.PiCamera()
» camera.capture(fn, resize=(640,480))
» camera.close()
»
» mime=MIMEMultipart()
» mime['From']=frm
» mime['To']=to
» mime['Subject']=Header(subj, 'utf-8')
» mime.attach(MIMEText(msg, 'plain', 'utf-8'))
»
» f = open(fn, 'rb')
» img = MIMEImage(f.read())
» f.close()
» mime.attach(img)
» smtp=smtplib.SMTP(smtpHost, smtpPort)
» smtp.login(smtpUser, smtpPassword)
» smtp.sendmail(frm, to, mime.as_string())
» smtp.quit()
» try:
» gpio.add_event_detect(23, gpio.RISING, callback = mein_callback)
» while True:
» time.sleep(10)
» except KeyboardInterrupt:
» print('ENDE')
»
» 2. Dein auf
» https://gist.github.com/anonymous/5c25da72e1c24705d626c46a99a59b18
» veröffentlichtes
» Script funktioniert ebenfalls bestens.
»
» 3. Hingegen wenn ich beide Scripts zusammenfüge:
»
» #!/usr/bin/python3
» #-*- coding: utf-8 -*-
»
» import sys, time, smtplib, picamera
» import RPi.GPIO as gpio
» from email.mime.image import MIMEImage
» from email.mime.multipart import MIMEMultipart
» from email.mime.text import MIMEText
» from email.header import Header
»
» gpio.setmode(gpio.BOARD)
» gpio.setup(23, gpio.IN)
»
» MAX_COUNT = 3
» PIR_DELAY = 10
» PIR_IGNORE_TIME = 60
»
» current_count = 0
» last_count= 0
» last_time = 0
» DEBUG = True
»
» def mein_callback(pin):
» global current_count
» current_count += 1
» if DEBUG:
» print('DEBUG: PIR2 IRQ um %s zum %sten mal' %
» (time.strftime('%d.%m.%Y %H:%M:%S')
»
» gpio.add_event_detect(23, gpio.RISING, callmack = mein_callback)
» if DEBUG:
» print('DEBUG: PIR2 wartet auf IQR')
»
» try:
» while True:
» if current_count > last_count and last_count < MAX_COUNT and
» time.time(last_time + PIR_DELAY)
» print ('PIR2 wurde %s mal ausgeloest' % current_count)
»
» frm = 'meine E-Mail Adresse'
» to = 'meine E-Mail Adresse'
» smtpHost = 'smtpauth.bluewin.ch'
» smtpPort = 587
» smtpUser = 'mein Name'
» smtpPassword = 'mein Passwort'
» subj = 'von Raspberry2'
» msg = 'Meldung von PIR2'
» fn = 'foto1.jpg'
» camera = picamera.PiCamera()
» camera.capture(fn, resize(640, 480))
» camera.close()
» mime = MIMEMultipart()
» mime['From'] = frm
» mime['To'] = to
» mime['Subject'] = Header(subj, 'utf-8')
» mime.attach(MIMEText(msg, 'plain', 'utf-8')
»
» f = open(fn, 'rb')
» img = MIMEImage(f.read())
» f.close()
» mime.attach(img)
» smtp = smtplib.SMTP(smtpHost, smtpPort)
» smtp.login(smtpUser, smtpPassword)
» smtp.sendmail(frm, to, mime.as_string())
» smtp.quit()
»
» last_count = current_count
» if last_count >= MAX_COUNT:
» if DEBUG:
» print('DEBUG: Beginne Ruhezustand fuer %s Sekunden' %
» PIR_IGNOR$
» time.sleep(PIR_IGNORE_TIME)
» if DEBUG:
» print('Ende Ruhezustand, %s PIR2 IRQs registriert' %
» (current_c$
» last_count = 0
» current_count = 0
» time.sleep(2)
» except KeyboardInterrupt:
» gpio.cleanup()
» print('ENDE PIR_V1.py)
»
» bekomme ich ewig einen Syntaxfehler:
» File "./PIR_V1.py", line 56
» f = open(fn, 'rb')
» ^
» SyntaxError: invalid Syntax
»
» Habe alles x-mal überprüft, neu geschrieben etc. und finde den Fehler
» einfach nicht obwohl die beiden
» Code Blocks für E-Mail und Foto identisch sind.
»
» Vielen Dank im voraus, luemar.

sorry ich kriegs nicht hin mit dem Einrücken... probiers nochmal neu

luemar(R)

07.05.2017,
17:29

@ bastelix

raspberry pi und PIR

» » Hallo Experten und bastelix,
» Das könnte man übrigens auch falsch verstehen :-P ;-)
»
» » schätze die eingehende Antwort, lerne auf diesem Forum mehr als in
» » Lehr-Texten und Tutorials.
» Das ist doch schon mal was :-) Aber das algorithmische denken musst du dir
» noch aneignen, vielleicht hilft es dir dabei wenn du mal ein einfaches
» Python-Script als Programmablaufplan/Flussdiagramm aufzeichnest um zu
» verstehen was der Rechner eigentlich mit deinen Befehlen anstellst. (
» https://de.wikipedia.org/wiki/Programmablaufplan ).
»
» » >>while True:
» » >>>time.sleep(8)
» Hier hast du wieder eine Endlosschleife deren einziger Inhalt es ist dein
» Programm für acht Sekunden schlafen zu legen ;-)
»
» Was ich bei der Gelegenheit mal loswerden muss: An Python stört mich
» extremst, dass Programmblöcke nur durch die Einrückung definiert werden.
» Das ist schei*e lesbar und fördert das einbauen logischer Fehler...
»
» So genug gemotzt ;-)
»
» » Mein PIR PI-ADA-189 verhält sich in verschiedenen Scripts erratisch d.h.
» es
» » gibt kein 1:1 Verhältnis
» Dein PIR wird nicht über dein Python-Programm gesteuert, wann der PIR den
» Data-Pin auf HIGH/LOW zieht ist über die Hardware definiert. Dein Script
» wertet die Pegeländerungen lediglich aus (um genau zu sein wann immer der
» Pin von LOW auf HIGH geht, aufgrund des Parameters gpio.RISING bei
» gpio.add_event_detect) und reagiert darauf entsprechend. Du musst also für
» die Wartezeiten die Eigenschaften des PIR berücksichtigen, z.B. dass er
» Bewegungen nur alle X Sekunden (das müsste sich über einen Poti einstellen
» lassen, aber nur bis zu einer gewissen Untergrenze)
»
» Dein Python-Script muss also selber entscheiden wann es auf den IRQ vom PIR
» reagiert und z.B. ne Mail verschickt oder den IRQ ignoriert.
»
» » Ich möchte 2 Dinge erreichen:
» Anders formuliert: Sendet der PIR einen IRQ wird eine Aktion ausgeführt,
» solange die Aktion das letzte mal vor PIR_DELAY Sekunden ausgeführt wurde.
» Danach werden alle PIR IRQs für PIR_IGNORE_TIME Sekunden ignoriert. Und
» dann beginnt das ganze wieder von vorn.
»
» Ich hab da mal was bei gist eingestellt (ist online besser lesbar als im
» Forum): https://gist.github.com/anonymous/5c25da72e1c24705d626c46a99a59b18
» Dein Foto-Machen und Mail-Verschicken Code sollte dann in Zeile 53
» aufgerufen werden, die restlichen prints sind Debug-Ausgaben. Ich hoffe in
» den Code-Kommentaren ist soweit alles erklärt. Könnte man vermutlich noch
» eleganter lösen, aber nicht nach 22 Uhr und halbwegs Anfänger-Verständlich
» ;-)
»
» » Wenn das mal funktioniert möchte ich neben dem Bild noch ein SMS
» erhalten
» » und mir einen remote access
» » einrichten.
» Divide and conquer ;-) beim remote access solltest dich aber schon etwas
» tiefer mit der Materie Netzwerksicherheit auskennen, sonst ist dein Pi
» möglicherweise bald aktives Mitglied in einem IoT-Botnetz...

Hallo bastelix,
habe mich mit Deinen Hinweisen und insbesondere mit dem auf https://gist.github.com/anonymous/5c25da72e1c24705d626c46a99a59b18 veröffentlichen
Script auseinander gesetzt .. toller Service !!

Vom remote Access sehe ich ab, habe weitere und gleichlautende Kommentare gelesen.

Glaubte mich am Ziel, werde jetzt aber einen Syntaxfehler einfach nicht los:

1. Ein einfaches Script, das bei jedem Ansprechen des PIR ein Foto macht und mir per E-Mail schickt
funktioniert problemlos:

#!/usr/bin/python3
import RPi.GPIO as gpio
import smtplib, sys, picamera, time
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header

gpio.setmode(gpio.BOARD)
gpio.setup(23, gpio.IN)
def mein_callback(pin):
frm='meine E-Mail Adresse'
to='meine E-Mail Adresse'
smtpHost='smtpauth.bluewin.ch'
smtpPort=587
smtpUser='mein Name'
smtpPassword='mein Passwort'
subj='von Raspberry2'
msg='Meldung von PIR 2'
fn='foto1.jpg'
camera = picamera.PiCamera()
camera.capture(fn, resize=(640,480))
camera.close()

mime=MIMEMultipart()
mime['From']=frm
mime['To']=to
mime['Subject']=Header(subj, 'utf-8')
mime.attach(MIMEText(msg, 'plain', 'utf-8'))

f = open(fn, 'rb')
img = MIMEImage(f.read())
f.close()
mime.attach(img)
smtp=smtplib.SMTP(smtpHost, smtpPort)
smtp.login(smtpUser, smtpPassword)
smtp.sendmail(frm, to, mime.as_string())
smtp.quit()
try:
gpio.add_event_detect(23, gpio.RISING, callback = mein_callback)
while True:
time.sleep(10)
except KeyboardInterrupt:
print('ENDE')

2. Dein auf https://gist.github.com/anonymous/5c25da72e1c24705d626c46a99a59b18 veröffentlichtes
Script funktioniert ebenfalls bestens.

3. Hingegen wenn ich beide Scripts zusammenfüge:

#!/usr/bin/python3
#-*- coding: utf-8 -*-

import sys, time, smtplib, picamera
import RPi.GPIO as gpio
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header

gpio.setmode(gpio.BOARD)
gpio.setup(23, gpio.IN)

MAX_COUNT = 3
PIR_DELAY = 10
PIR_IGNORE_TIME = 60

current_count = 0
last_count= 0
last_time = 0
DEBUG = True

def mein_callback(pin):
global current_count
current_count += 1
if DEBUG:
print('DEBUG: PIR2 IRQ um %s zum %sten mal' % (time.strftime('%d.%m.%Y %H:%M:%S')

gpio.add_event_detect(23, gpio.RISING, callmack = mein_callback)
if DEBUG:
print('DEBUG: PIR2 wartet auf IQR')

try:
while True:
if current_count > last_count and last_count < MAX_COUNT and time.time(last_time + PIR_DELAY)
print ('PIR2 wurde %s mal ausgeloest' % current_count)

frm = 'meine E-Mail Adresse'
to = 'meine E-Mail Adresse'
smtpHost = 'smtpauth.bluewin.ch'
smtpPort = 587
smtpUser = 'mein Name'
smtpPassword = 'mein Passwort'
subj = 'von Raspberry2'
msg = 'Meldung von PIR2'
fn = 'foto1.jpg'
camera = picamera.PiCamera()
camera.capture(fn, resize(640, 480))
camera.close()
mime = MIMEMultipart()
mime['From'] = frm
mime['To'] = to
mime['Subject'] = Header(subj, 'utf-8')
mime.attach(MIMEText(msg, 'plain', 'utf-8')

f = open(fn, 'rb')
img = MIMEImage(f.read())
f.close()
mime.attach(img)
smtp = smtplib.SMTP(smtpHost, smtpPort)
smtp.login(smtpUser, smtpPassword)
smtp.sendmail(frm, to, mime.as_string())
smtp.quit()

last_count = current_count
if last_count >= MAX_COUNT:
if DEBUG:
print('DEBUG: Beginne Ruhezustand fuer %s Sekunden' % PIR_IGNOR$
time.sleep(PIR_IGNORE_TIME)
if DEBUG:
print('Ende Ruhezustand, %s PIR2 IRQs registriert' % (current_c$
last_count = 0
current_count = 0
time.sleep(2)
except KeyboardInterrupt:
gpio.cleanup()
print('ENDE PIR_V1.py)

bekomme ich ewig einen Syntaxfehler:
File "./PIR_V1.py", line 56
f = open(fn, 'rb')
^
SyntaxError: invalid Syntax

Habe alles x-mal überprüft, neu geschrieben etc. und finde den Fehler einfach nicht obwohl die beiden
Code Blocks für E-Mail und Foto identisch sind.

Vielen Dank im voraus, luemar.

bastelix(R)

27.04.2017,
23:47

@ luemar

raspberry pi und PIR

» Hallo Experten und bastelix,
Das könnte man übrigens auch falsch verstehen :-P ;-)

» schätze die eingehende Antwort, lerne auf diesem Forum mehr als in
» Lehr-Texten und Tutorials.
Das ist doch schon mal was :-) Aber das algorithmische denken musst du dir noch aneignen, vielleicht hilft es dir dabei wenn du mal ein einfaches Python-Script als Programmablaufplan/Flussdiagramm aufzeichnest um zu verstehen was der Rechner eigentlich mit deinen Befehlen anstellst. ( https://de.wikipedia.org/wiki/Programmablaufplan ).

» >>while True:
» >>>time.sleep(8)
Hier hast du wieder eine Endlosschleife deren einziger Inhalt es ist dein Programm für acht Sekunden schlafen zu legen ;-)

Was ich bei der Gelegenheit mal loswerden muss: An Python stört mich extremst, dass Programmblöcke nur durch die Einrückung definiert werden. Das ist schei*e lesbar und fördert das einbauen logischer Fehler...

So genug gemotzt ;-)

» Mein PIR PI-ADA-189 verhält sich in verschiedenen Scripts erratisch d.h. es
» gibt kein 1:1 Verhältnis
Dein PIR wird nicht über dein Python-Programm gesteuert, wann der PIR den Data-Pin auf HIGH/LOW zieht ist über die Hardware definiert. Dein Script wertet die Pegeländerungen lediglich aus (um genau zu sein wann immer der Pin von LOW auf HIGH geht, aufgrund des Parameters gpio.RISING bei gpio.add_event_detect) und reagiert darauf entsprechend. Du musst also für die Wartezeiten die Eigenschaften des PIR berücksichtigen, z.B. dass er Bewegungen nur alle X Sekunden (das müsste sich über einen Poti einstellen lassen, aber nur bis zu einer gewissen Untergrenze)

Dein Python-Script muss also selber entscheiden wann es auf den IRQ vom PIR reagiert und z.B. ne Mail verschickt oder den IRQ ignoriert.

» Ich möchte 2 Dinge erreichen:
Anders formuliert: Sendet der PIR einen IRQ wird eine Aktion ausgeführt, solange die Aktion das letzte mal vor PIR_DELAY Sekunden ausgeführt wurde.
Danach werden alle PIR IRQs für PIR_IGNORE_TIME Sekunden ignoriert. Und dann beginnt das ganze wieder von vorn.

Ich hab da mal was bei gist eingestellt (ist online besser lesbar als im Forum): https://gist.github.com/anonymous/5c25da72e1c24705d626c46a99a59b18
Dein Foto-Machen und Mail-Verschicken Code sollte dann in Zeile 53 aufgerufen werden, die restlichen prints sind Debug-Ausgaben. Ich hoffe in den Code-Kommentaren ist soweit alles erklärt. Könnte man vermutlich noch eleganter lösen, aber nicht nach 22 Uhr und halbwegs Anfänger-Verständlich ;-)

» Wenn das mal funktioniert möchte ich neben dem Bild noch ein SMS erhalten
» und mir einen remote access
» einrichten.
Divide and conquer ;-) beim remote access solltest dich aber schon etwas tiefer mit der Materie Netzwerksicherheit auskennen, sonst ist dein Pi möglicherweise bald aktives Mitglied in einem IoT-Botnetz...

luemar(R)

27.04.2017,
18:56

@ bastelix

raspberry pi und PIR

» Hi,
»
» irgendwie hab ich die Benachrichtigungs-E-Mail übersehen und deinen Post
» erst heute gelesen...
»
» » Habe Deinen letzte Hinweis mal so getestet:
» » hat aber nicht funktioniert, obwohl ich den if Block an 2 verschiedenen
» » Stellen einfügte(ohne Fehlermeldung)
» Wundert mich nicht ;-) wenn man das Programm mal auf das Wesentliche
» reduziert hast du folgendes geschrieben
» 1. Ist True gleich True dann
» 2. Schlafe eine Sekunde
» 3. Beginne bei 1.
»
» » Funktioniert hat der Test mit einem Script mit gpiozero:
» » Damit reagiert aber der PIR nach jedem Auslösen 2 mal, unabhängig von
» der
» » Stellung der Potentiometer.
» wait_for_motion() blockiert vermutlich bis ein Event kommt (hab nicht
» nachgesehen, aber der Methoden-Name impliziert das schon mal). Wird dann
» eine Bewegung erkannt zählst du den counter hoch, soweit ok.
» Dann prüfst du ob der counter > 5 ist ... das ist er sobald die Schleife
» fünf mal durchlaufen wurde, also der PIR fünf mal ausgelöst hat, und danach
» jedes mal wenn der PIR auslöst - du setzt den counter nämlich nicht
» zurück.
» Die Prüfung auf time.time() > (last_time + 3) ergibt immer TRUE, da du in
» jedem Schleifendurchlauf last_time auf die aktuelle Zeit zu setzten, fünf
» Sekunden schläfst und dann prüfst ob mehr als drei Sekunden vergangen sind
» (das ist immer der Fall, da du ja für 5 Sekunden schläfst)
»
» Ich hab den Eindruck, dass du das algorithmischen Denken noch etwas üben
» musst. Owa des wird scho nu - so wai i di kenn gibt aia eh koin rua :-)
»
» » Mein Test entsprich aber nicht dem, was ich brauche: Mein PIR-Script
» sollte
» » in den Schlafmodus versetzt werden
» » wenn count > x und time.time() < (last_time + y) ist, d.h. erst nachdem
» » diese Konditionen erfüllt sind wieder ansprechen können.
» Da kann ich dir nicht so ganz folgen. Kannst du das mal in ein paar
» normalen Sätzen formulieren?
» z.B. So: "Wenn der PIR eine Bewegung erkennt soll ein Foto gemacht werden.
» Danach sollen alle Bewegungen für X Sekunden ignoriert werden. Dann soll
» bei einer weiteren Bewegung wieder ein Foto gemacht werden."
»
» Hab übrigens mal den PIR der neulich mit der Post kam und den PI aus den
» Umzugskartons gekramt und ein bisschen experimentiert. Mein PIR (basiert
» auf HC-SR501) meldet in der empfindlichsten Einstellung nur alle zehn
» Sekunden eine Bewegung. Verhält sich dein PIR auch so? Ein paar Zeilen
» Pyhton-Script hab ich auch geschrieben. Die funktionieren soweit auch, aber
» so lange ich nicht weiß was du eigentlich erreichen willst behalte ich den
» Code mal für mich, sonst verwirre ich dich damit möglicherweise mehr als
» ich dir weiterhelfen kann ;-)
»
» » Dieses Poblem poste ich auf www.forum-raspberrypi.de.
» Gerne auch mal den Deep-Link, dann muss man nicht suchen ;-)
» http://www.forum-raspberrypi.de/Thread-python-time-sleep-methode
» Versteht das bitte nicht falsch, niemand muss sich rechtfertigen wenn er in
» mehreren Foren zum gleichen Problem Hilfe sucht, das ist schon OK. Aber es
» ist nur Fair gegenüber allen Leuten, die sich mit deiner Fragestellung
» befassen, darauf hinzuweisen. Möglicherweise hat sich das Thema ja schon in
» einem anderen Forum erledigt.

Hallo Experten und bastelix,
schätze die eingehende Antwort, lerne auf diesem Forum mehr als in Lehr-Texten und Tutorials.

Ich möchte 2 Dinge erreichen:
1. dass der PIR definierbare Male - z.B. 3 Mal - anspricht, in festlegbaren Zeitabständen - z.B. 30 sec.
und dann jeweils die Aufnahme eines Fotos und dessen Versand per E-Mail an mich auslöst, das um Fehlalarme zu erkennen (ein entsprechendes Script für Foto + E-Mail habe ich),
Vielleicht wäre eine Fotosequenz oder ein Video die einfachere Lösung.

2. dass danach der PIR eine definierbare Zeit in den Schlafmodus versetzt wird, damit ich nicht laufend Mails mit Fotos bekomme wenn sich Unbefugte im Überwachungsbereich bewegen.

Wenn das mal funktioniert möchte ich neben dem Bild noch ein SMS erhalten und mir einen remote access
einrichten.

Zu 1.:
Mein PIR PI-ADA-189 verhält sich in verschiedenen Scripts erratisch d.h. es gibt kein 1:1 Verhältnis
zwischen Aktivierung und Ausgangssignal, könnte auch am Script liegen:

mit dem RPi.GPIO Modul und folgendem Script:

>#!/usr/bin/python3
>import sys, time
>import RPi.GPIO as gpio

>gpio.setmode(gpio.BOARD)
>gpio.setup(23, gpio.IN)
>count = 0
>def mein_callback(pin):
>>global count
>>count += 1
>>print('PIR 1 aktiviert am',count,'.Mal', time.strftime('%d.%m.%Y %H:%M:%S'))
>>return

>try:
>>gpio.add_event_detect(23, gpio.RISING, callback = mein_callback)

>>while True:
>>>time.sleep(8)

>except KeyboardInterrupt:
>>print('PIR deaktiviert')

>gpio.cleanup()

"schläft" der PIR 10 sec. (wie Du erwähnt hast) plus die in time.sleep eingestellten Sekunden.
Wird der PIR vor Ablauf dieser Zeit erneut aktiviert "schläft" er erneut während dieser Zeitperiode.
Theoretisch würde er, wenn er repetitiv vor Ablauf der Zeitperiode aktiviert würde, kein
Ausgangssignal mehr liefern, also blockiert bleiben.

Mit dem Modul gpiozero und folgendem Versuchs-Script (unvollständig):

>#!/usr/bin/python3
>import time
>from gpiozero import MotionSensor
>pir = MotionSensor(11)
>global count
>count = 0
>global last_time
>last_time = time.time()

>while 1:
>>pir.wait_for_motion()
>>count += 1
>>print('PIR 1', count, 'mal aktiviert am', last_time)
>>time.sleep(11)

wird der print Befehl, je nachdem welcher Wert in time.sleep eingetragen ist, unregelmässig, 1 mal, 3 mal 4 mal usw. ausgeführt und erst ab 10 sec gibt es eine annähernd 1:1 Reaktion auf Aktivierungen des PIR.

Zu 2. habe ich noch kein Lösung gefunden, bin dankbar um Anregungen.
Das mit anderen Foren geht klar.

Ein ziemlicher Brocken. Bin gespannt, luemar.

bastelix(R)

22.04.2017,
22:46

@ luemar

raspberry pi und PIR

Hi,

irgendwie hab ich die Benachrichtigungs-E-Mail übersehen und deinen Post erst heute gelesen...

» Habe Deinen letzte Hinweis mal so getestet:
» hat aber nicht funktioniert, obwohl ich den if Block an 2 verschiedenen
» Stellen einfügte(ohne Fehlermeldung)
Wundert mich nicht ;-) wenn man das Programm mal auf das Wesentliche reduziert hast du folgendes geschrieben
1. Ist True gleich True dann
2. Schlafe eine Sekunde
3. Beginne bei 1.

» Funktioniert hat der Test mit einem Script mit gpiozero:
» Damit reagiert aber der PIR nach jedem Auslösen 2 mal, unabhängig von der
» Stellung der Potentiometer.
wait_for_motion() blockiert vermutlich bis ein Event kommt (hab nicht nachgesehen, aber der Methoden-Name impliziert das schon mal). Wird dann eine Bewegung erkannt zählst du den counter hoch, soweit ok.
Dann prüfst du ob der counter > 5 ist ... das ist er sobald die Schleife fünf mal durchlaufen wurde, also der PIR fünf mal ausgelöst hat, und danach jedes mal wenn der PIR auslöst - du setzt den counter nämlich nicht zurück.
Die Prüfung auf time.time() > (last_time + 3) ergibt immer TRUE, da du in jedem Schleifendurchlauf last_time auf die aktuelle Zeit zu setzten, fünf Sekunden schläfst und dann prüfst ob mehr als drei Sekunden vergangen sind (das ist immer der Fall, da du ja für 5 Sekunden schläfst)

Ich hab den Eindruck, dass du das algorithmischen Denken noch etwas üben musst. Owa des wird scho nu - so wai i di kenn gibt aia eh koin rua :-)

» Mein Test entsprich aber nicht dem, was ich brauche: Mein PIR-Script sollte
» in den Schlafmodus versetzt werden
» wenn count > x und time.time() < (last_time + y) ist, d.h. erst nachdem
» diese Konditionen erfüllt sind wieder ansprechen können.
Da kann ich dir nicht so ganz folgen. Kannst du das mal in ein paar normalen Sätzen formulieren?
z.B. So: "Wenn der PIR eine Bewegung erkennt soll ein Foto gemacht werden. Danach sollen alle Bewegungen für X Sekunden ignoriert werden. Dann soll bei einer weiteren Bewegung wieder ein Foto gemacht werden."

Hab übrigens mal den PIR der neulich mit der Post kam und den PI aus den Umzugskartons gekramt und ein bisschen experimentiert. Mein PIR (basiert auf HC-SR501) meldet in der empfindlichsten Einstellung nur alle zehn Sekunden eine Bewegung. Verhält sich dein PIR auch so? Ein paar Zeilen Pyhton-Script hab ich auch geschrieben. Die funktionieren soweit auch, aber so lange ich nicht weiß was du eigentlich erreichen willst behalte ich den Code mal für mich, sonst verwirre ich dich damit möglicherweise mehr als ich dir weiterhelfen kann ;-)

» Dieses Poblem poste ich auf www.forum-raspberrypi.de.
Gerne auch mal den Deep-Link, dann muss man nicht suchen ;-) http://www.forum-raspberrypi.de/Thread-python-time-sleep-methode
Versteht das bitte nicht falsch, niemand muss sich rechtfertigen wenn er in mehreren Foren zum gleichen Problem Hilfe sucht, das ist schon OK. Aber es ist nur Fair gegenüber allen Leuten, die sich mit deiner Fragestellung befassen, darauf hinzuweisen. Möglicherweise hat sich das Thema ja schon in einem anderen Forum erledigt.

luemar(R)

20.04.2017,
12:04

@ bastelix

raspberry pi und PIR

» » Nach jeder 3. Aktivierungen bekomme zwar die unter dem if statement
» » eingetragene Textnachricht '3 mal aktiviert',
» » jedoch wird der time.sleep(30) Befehl nicht ausgeführt.
» »
» » Wo liegt der Fehler ?
» Ich würde das nicht direkt Fehler nennen. Die sleep-Methode wird ausgeführt
» aber nicht in deinem Hauptprogramm, sondern in einem eigen Thread.
»
» "RPi.GPIO runs a second thread for callback functions. This means that
» callback functions can be run at the same time as your main program, in
» immediate response to an edge."
»
» Von der Doku her würde ich sagen, dass es einen eigenen Thread für die
» callbacks gibt, es könnte aber auch sein, dass jedes mal ein eigener Thread
» für ein Event gestartet wird. Falls das interessant ist, müsste man sich
» mal die Implementierung anschaun.
»
» Man sollte aber Event-Behandlung eh möglichst kurz halten, also keine sleep
» und keine langwierigen Operationen ausführen. Besser wäre es, wenn du
» deinen if-Block in dein Hauptprogramm ziehst und im Callback nur den
» counter hochzählst.
» Dann könntest du das ganze auch noch so umschreiben, dass du kein sleep
» brauchst, z.B. indem du dir beim ausgeben der Nachricht die aktuelle Zeit
» (last_time = time.time()) in eine Variable schreibst und dein if
» erweiterest ( if count%3 == 0 and time.time() > (last_time + 30): )
»
» Oh und falls du die Frage in mehreren Foren stellst, fände ich es höflich,
» wenn du darauf auch hinweist (z.B. einfach Habe ich hier auch gefragt:
» LINK) ;-)

Bind da noch nicht sattelfest genug, musste erst mal 'Tread' nachsehen.

Habe Deinen letzte Hinweis mal so getestet:

>#!/usr/bin/python3
>import sys, time
>import RPi.GPIO as gpio

>gpio.setmode(gpio.BOARD)
>gpio.setup(23, gpio.IN)

>count = 0
>def mein_callback(pin):
> > global count
>> count += 1
>> last_time = time.time()
>> print('PIR 1 aktiviert am',(time.strftime('%d.%m.%Y %H:%M:%S')), count)
>> print (last_time)
>> if count > 3 and time.time() > (last_time + 3):
>>> print('yes')
>> return
>try:
>> gpio.add_event_detect(23, gpio.RISING, callback = mein_callback)
>> if count > 2 and time.time() > (last_time + 2):
>>> print('yes')
>> while True:
>>> time.sleep(1)

>except KeyboardInterrupt:
>> print('PIR deaktiviert')

>gpio.cleanup()

hat aber nicht funktioniert, obwohl ich den if Block an 2 verschiedenen Stellen einfügte(ohne Fehlermeldung)
Funktioniert hat der Test mit einem Script mit gpiozero:

>#!/usr/bin/python3
>import time
>from gpiozero import MotionSensor
>pir = MotionSensor(11)
>global count
>count = 0
>while 1:
>> pir.wait_for_motion()
>> count += 1
>> last_time = time.time()
>> print('PIR 1 aktiviert', count, last_time)
>> time.sleep(5)
>> if count > 5 and time.time() > (last_time + 3):
> > print('yes')

Damit reagiert aber der PIR nach jedem Auslösen 2 mal, unabhängig von der Stellung der Potentiometer.
Dieses Poblem poste ich auf www.forum-raspberrypi.de.

Mein Test entsprich aber nicht dem, was ich brauche: Mein PIR-Script sollte in den Schlafmodus versetzt werden
wenn count > x und time.time() < (last_time + y) ist, d.h. erst nachdem diese Konditionen erfüllt sind wieder ansprechen können.

ELEKTRONIK- MODELLBAU- FREUNDE

E-Mail

19.04.2017,
18:10

@ luemar

raspberry pi und PIR

» habe mittels add_vent_detect und der callback Funktion ein Script für den
» PIR an meinem Raspberry Pi B+ geschrieben, dass mir jeweils ein Bild der
» PiCamera an meine E-Mail Adresse schickt und ein Zähler registriert jede
» PIR-Aktivierung:
» >...............
» >count = 0
» >def mein_callbaxk(pin):
» > global count
» > count += 1
» > print('PIR aktiviert')
» > if count%3 == 0:
» > print('3 mal aktiviert')
» > time.sleep(30)
» > return
» >........
»
» Nach jeder 3. Aktivierungen bekomme zwar die unter dem if statement
» eingetragene Textnachricht '3 mal aktiviert',
» jedoch wird der time.sleep(30) Befehl nicht ausgeführt.
»
» Wo liegt der Fehler ?
++++++++++++++++++++++++++++++

wiesi ist da forum soo komisch nie eine direkte antwort
ruf an << 0511+484129 << nur hier daas forum der zukunft <<:-P

luemar(R)

18.04.2017,
17:17

@ finni

raspberry pi und PIR

» » www.forum-raspberrypi.de
»
» Das meint Gast sicher auch. Allerdings muss ich schon sagen, du stellst
» dich nicht gerade klug an. Nichtmal in diesem Forum nutzt du den Code-Tag,
» um deinen Code den Leuten vernünftig zu präsentieren. Und dann rückst du
» den erst auf Nachfrage raus.
»
» So wichtig scheint es dir mit Hilfe wohl nicht zu sein ;)

doch, aber ich bin ein Neuling auf Foren und das mit der Klugheit wollen wir mal offen lassen....
und ich bleibe sehr offen für reelle Hilfe. luemar.

finni(R)

18.04.2017,
14:12

@ luemar

raspberry pi und PIR

» www.forum-raspberrypi.de

Das meint Gast sicher auch. Allerdings muss ich schon sagen, du stellst dich nicht gerade klug an. Nichtmal in diesem Forum nutzt du den Code-Tag, um deinen Code den Leuten vernünftig zu präsentieren. Und dann rückst du den erst auf Nachfrage raus.

So wichtig scheint es dir mit Hilfe wohl nicht zu sein ;)

bastelix(R)

18.04.2017,
12:06

@ Gast

raspberry pi und PIR

» Python, keine Einrückung.
Wenn du auf Antworten klickst, dann siehst du die Einrückung im Zitat. Ist zwar nicht optimal, aber es geht...

bastelix(R)

18.04.2017,
11:56

@ luemar

raspberry pi und PIR

» Nach jeder 3. Aktivierungen bekomme zwar die unter dem if statement
» eingetragene Textnachricht '3 mal aktiviert',
» jedoch wird der time.sleep(30) Befehl nicht ausgeführt.
»
» Wo liegt der Fehler ?
Ich würde das nicht direkt Fehler nennen. Die sleep-Methode wird ausgeführt aber nicht in deinem Hauptprogramm, sondern in einem eigen Thread.

"RPi.GPIO runs a second thread for callback functions. This means that callback functions can be run at the same time as your main program, in immediate response to an edge."

Von der Doku her würde ich sagen, dass es einen eigenen Thread für die callbacks gibt, es könnte aber auch sein, dass jedes mal ein eigener Thread für ein Event gestartet wird. Falls das interessant ist, müsste man sich mal die Implementierung anschaun.

Man sollte aber Event-Behandlung eh möglichst kurz halten, also keine sleep und keine langwierigen Operationen ausführen. Besser wäre es, wenn du deinen if-Block in dein Hauptprogramm ziehst und im Callback nur den counter hochzählst.
Dann könntest du das ganze auch noch so umschreiben, dass du kein sleep brauchst, z.B. indem du dir beim ausgeben der Nachricht die aktuelle Zeit (last_time = time.time()) in eine Variable schreibst und dein if erweiterest ( if count%3 == 0 and time.time() > (last_time + 30): )

Oh und falls du die Frage in mehreren Foren stellst, fände ich es höflich, wenn du darauf auch hinweist (z.B. einfach Habe ich hier auch gefragt: LINK) ;-)

luemar(R)

18.04.2017,
11:39

@ Gast

raspberry pi und PIR

» » Habe das Problem bereits auf dem DE Raspberry Pi Forum gepostet
»
» Noch nie von gehört. Wie lautet der Link dahin?

www.forum-raspberrypi.de

Gast

17.04.2017,
21:34

@ luemar

raspberry pi und PIR

» Habe das Problem bereits auf dem DE Raspberry Pi Forum gepostet

Noch nie von gehört. Wie lautet der Link dahin?