From 343d0855c7be9fc199adca85478a8f951978cea0 Mon Sep 17 00:00:00 2001 From: Kevin Date: Sun, 3 Oct 2021 18:25:14 +0200 Subject: [PATCH] Setup camera capture. Captured image has datetime timestamp overlay Main function here is the capture function. All attrs are currently fixed. The server fetches the saved image, in order to not have read/write conflict we first save captured image as 'assets/foo.jpg' and after capture rename it to 'assets/capture.jpg'. --- brewCamera.py | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 brewCamera.py diff --git a/brewCamera.py b/brewCamera.py new file mode 100644 index 0000000..7def911 --- /dev/null +++ b/brewCamera.py @@ -0,0 +1,49 @@ +import os +import time +import picamera +import threading +from datetime import datetime + +from logger import logger + +class BrewCamera(): + def __init__(self, interval=10): + self.lastCaptureTimestamp = None + self.interval = interval + self.warmupTime = 0.3 + + def spawnBackgroundCapture(self): + thread = threading.Thread(target=self.captureOnIntervalForever, args=()) + thread.daemon = True + thread.start() + logger.info("spawned camera capture daemon at interval: {}".format(self.interval)) + + def captureOnIntervalForever(self): + while True: + time.sleep(self.interval - self.warmupTime) + self.capture() + + def capture(self): + try: + logger.debug('Capturing image') + with picamera.PiCamera() as camera: + camera.resolution = (1297, 972) + camera.rotation = 180 + camera.annotate_background = picamera.Color('black') + camera.annotate_text_size = 50 # (values 6 to 160, default is 32) + camera.annotate_text = datetime.now().strftime('%A %d %b %Y %H:%M:%S') + + # Camera warm-up time + time.sleep(self.warmupTime) + camera.capture('assets/foo.jpg') + self.lastCaptureTime = datetime.now() + os.replace('assets/foo.jpg', 'assets/capture.jpg') + + except picamera.exc.PiCameraMMALError as error: + logger.error('Picamera MMAL exception. Retrying picture in 1 second', es={ + error: str(error), + exception: error.__class__.__name__ + }) + time.sleep(1) + self.capture() +