Hi,
Motion gestartet:2023-12-06 15:08:11,672
Starte Task:2023-12-06 15:10:00,217
Nehme Bild auf:2023-12-06 15:10:01,220
Da gabs ne Fehlermeldung die du wahrscheinlich einfach nicht gesehen hast.
ich hab das ganze jetzt mit einer PiCamera V2 (BerryBase) nachgestellt und benutze hier das aktuelle Bookworm 64bit mit Desktop (Recommended) vom 05.12.23.
Als erstes: man nutzt jetzt Picamera2. Die Doku dazu gibts scheinbar nur als PDF.
https://datasheets.raspberrypi.com/camera/picamera2-manual.pdf
Picamera hatte sein letztes Release 2017.
Unter Bookworm kommt Picamera2 standardmäßig mit, zumindest bei der oben genannten Version.
Getestet hab ich das ohne Pushbullet usw., weil ich die Hardware nicht habe bzw. kein Pushbulllet brauche. Für die Config hab ich Toml genommen, weil das ebenfalls standardmäßig dabei war. Die Pushbullet Lib wird nicht mehr gepflegt. Es gibt aber einige Alternativen.
Statt das alte Log immer wieder zu überschreiben, wird jede Meldung am Ende der Datei weiter geschrieben.
[server]
host = "mail.net"
port = "465"
user = "mail_acc@anbieter.de"
password = "password"
[message]
from = "mail_acc@anbieter.de"
to = "mail_acc@anbieter.de"
subject = "Cam zu Mail"
[path]
image = "/home/pi/image.jpg"
[gpio_pin]
relais = 13
led = 5
pir = 6
[trigger]
trigger_time = "13:51"
Alles anzeigen
#!/usr/bin/python3
import tomllib
import smtplib
import schedule
import imghdr
import logging
import threading
from gpiozero import MotionSensor
from picamera2 import Picamera2
from time import sleep
from functools import partial
from pathlib import Path
from email.message import EmailMessage
logging.basicConfig(filename="/home/pi/Motion_zu_Mail_SMS.log",
filemode="a",
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s ",
datefmt="%d.%m.%Y %H:%M")
logger = logging.getLogger()
CONFIG_PATH = Path("/home/pi/config.toml")
with open(CONFIG_PATH, 'rb') as file:
config = tomllib.load(file)
PATH_TO_IMAGE = Path(config["path"]["image"])
def get_picture():
logging.info("Nehme Bild auf")
camera = Picamera2()
with camera as cam:
cam.start()
sleep(1)
cam.capture_file(f"{Path(PATH_TO_IMAGE)}")
def create_message():
logging.info("Erstelle Mail")
msg = EmailMessage()
msg['From'] = config["message"]["from"]
msg['To'] = config["message"]["to"]
msg['Subject'] = config["message"]["subject"]
with open(f"{Path(PATH_TO_IMAGE)}", 'rb') as fp:
img_data = fp.read()
msg.add_attachment(img_data,
maintype='image',
subtype=imghdr.what(None, img_data))
return msg
def send_mail():
with smtplib.SMTP_SSL(config["server"]["host"],
config["server"]["port"]) as s:
s.login(config["server"]["user"], config["server"]["password"])
s.send_message(create_message())
logging.info("Mail gesendet")
def task(lock, trigger):
logging.info(f"Starte Task durch: {trigger}")
with lock:
sleep(1)
get_picture()
send_mail()
logging.info("Task Ende")
def main():
logging.info("Motion gestartet")
pir = MotionSensor(config["gpio_pin"]["pir"])
lock = threading.Lock()
try:
pir.when_motion = partial(task, lock, "Pir")
schedule.every().day.at(config["trigger"]["trigger_time"]).do(task, lock, "Schedule")
while True:
schedule.run_pending()
sleep(1)
except Exception as e:
logger.error(f"Fehlermeldung: {e}")
except KeyboardInterrupt:
logging.info("Abbruch durch strg-c.")
finally:
raise SystemExit
if __name__ == "__main__":
main()
Alles anzeigen
16.12.2023 13:53 - INFO - Motion gestartet
16.12.2023 13:53 - INFO - Starte Task durch: Schedule
16.12.2023 13:53 - INFO - Nehme Bild auf
16.12.2023 13:53 - INFO - Initialization successful.
16.12.2023 13:53 - INFO - Camera now open.
16.12.2023 13:53 - INFO - Camera configuration has been adjusted!
16.12.2023 13:53 - INFO - Configuration successful!
16.12.2023 13:53 - INFO - Camera started
16.12.2023 13:53 - INFO - Saved <picamera2.request.Helpers object at 0x7f82567f50> to file /home/pi/image.jpg.
16.12.2023 13:53 - INFO - Time taken for encode: 9.240254999895114 ms.
16.12.2023 13:53 - INFO - Camera stopped
16.12.2023 13:53 - INFO - Camera closed successfully.
16.12.2023 13:53 - INFO - Erstelle Mail
16.12.2023 13:53 - INFO - Mail gesendet
16.12.2023 13:53 - INFO - Task Ende
16.12.2023 13:53 - INFO - Abbruch durch strg-c.
16.12.2023 14:04 - INFO - Motion gestartet
16.12.2023 14:04 - INFO - Starte Task durch: Pir
16.12.2023 14:04 - INFO - Nehme Bild auf
16.12.2023 14:04 - INFO - Initialization successful.
16.12.2023 14:04 - INFO - Camera now open.
16.12.2023 14:04 - INFO - Camera configuration has been adjusted!
16.12.2023 14:04 - INFO - Configuration successful!
16.12.2023 14:04 - INFO - Camera started
16.12.2023 14:04 - INFO - Saved <picamera2.request.Helpers object at 0x7f7e0ff7d0> to file /home/pi/image.jpg.
16.12.2023 14:04 - INFO - Time taken for encode: 32.82667599978595 ms.
16.12.2023 14:04 - INFO - Camera stopped
16.12.2023 14:04 - INFO - Camera closed successfully.
16.12.2023 14:04 - INFO - Erstelle Mail
16.12.2023 14:04 - INFO - Mail gesendet
16.12.2023 14:04 - INFO - Task Ende
16.12.2023 14:23 - INFO - Abbruch durch strg-c.
Alles anzeigen
Anhang in der Mail:
Ich hab die Schutzfolie der Kamera nicht entfernt.
Hier noch das angepasste Script mit Pushbullet usw.:
#!/usr/bin/python3
import tomllib
import smtplib
import schedule
import imghdr
import logging
import threading
from pushbullet import Pushbullet
from gpiozero import MotionSensor
from picamera2 import Picamera2
from time import sleep
from functools import partial
from pathlib import Path
from email.message import EmailMessage
logging.basicConfig(filename="/home/pi/Motion_zu_Mail_SMS.log",
filemode="a",
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s ",
datefmt="%d.%m.%Y %H:%M")
logger = logging.getLogger()
CONFIG_PATH = Path("/home/pi/config.toml")
with open(CONFIG_PATH, 'rb') as file:
config = tomllib.load(file)
PATH_TO_IMAGE = Path(config["path"]["image"])
def get_picture():
logging.info("Nehme Bild auf")
camera = Picamera2()
with camera as cam:
cam.start()
sleep(1)
cam.capture_file(f"{Path(PATH_TO_IMAGE)}")
def create_message():
logging.info("Erstelle Mail")
msg = EmailMessage()
msg['From'] = config["message"]["from"]
msg['To'] = config["message"]["to"]
msg['Subject'] = config["message"]["subject"]
with open(f"{Path(PATH_TO_IMAGE)}", 'rb') as fp:
img_data = fp.read()
msg.add_attachment(img_data,
maintype='image',
subtype=imghdr.what(None, img_data))
return msg
def send_mail():
with smtplib.SMTP_SSL(config["server"]["host"],
config["server"]["port"]) as s:
s.login(config["server"]["user"], config["server"]["password"])
s.send_message(create_message())
logging.info("Mail gesendet")
def send_sms():
logging.info("Sende SMS")
pushbullet = Pushbullet(config["pushbullet"]["api_key"])
try:
pushbullet.push_sms(pushbullet.devices[0],
config["pushbullet"]["telefonnummer"],
"PIR Home Seemoeve aktiviert")
except PushbulletError as e:
logging.info(f"SMS Error: {e}")
def task(lock, camera_light, trigger):
logging.info(f"Starte Task durch: {trigger}")
with lock:
camera_light.on()
sleep(1)
get_picture()
camera_light.off()
send_mail()
send_sms()
logging.info("Task Ende")
def main():
logging.info("Motion gestartet")
status_led = LED(config["gpio_pin"]["led"])
status_led.on()
camera_light = DigitalOutputDevice(config["gpio_pin"]["relais"])
pir = MotionSensor(config["gpio_pin"]["pir"])
lock = threading.Lock()
try:
pir.when_motion = partial(task, lock,
camera_light, "Pir")
schedule.every().day.at(
config["trigger"]["trigger_time"]
).do(task, lock,
camera_light, "Pir")
while True:
schedule.run_pending()
sleep(1)
except Exception as e:
logger.error(f"Fehlermeldung: {e}")
except KeyboardInterrupt:
logging.info("Abbruch durch strg-c.")
finally:
camera_light.off()
status_led.off()
raise SystemExit
if __name__ == "__main__":
main()
Alles anzeigen
Ungetestet.
Ich hoffe ich habe nichts vergessen.