summaryrefslogtreecommitdiff
path: root/bin/esp32_capture.py
diff options
context:
space:
mode:
authorEvgeny Zinoviev <me@ch1p.io>2023-09-27 00:54:57 +0300
committerEvgeny Zinoviev <me@ch1p.io>2023-09-27 00:54:57 +0300
commitd3a295872c49defb55fc8e4e43e55550991e0927 (patch)
treeb9dca15454f9027d5a9dad0d4443a20de04dbc5d /bin/esp32_capture.py
parentb7cbc2571c1870b4582ead45277d0aa7f961bec8 (diff)
parentbdbb296697f55f4c3a07af43c9aaf7a9ea86f3d0 (diff)
Merge branch 'master' of ch1p.io:homekit
Diffstat (limited to 'bin/esp32_capture.py')
-rwxr-xr-xbin/esp32_capture.py58
1 files changed, 58 insertions, 0 deletions
diff --git a/bin/esp32_capture.py b/bin/esp32_capture.py
new file mode 100755
index 0000000..839114d
--- /dev/null
+++ b/bin/esp32_capture.py
@@ -0,0 +1,58 @@
+#!/usr/bin/env python3
+import asyncio
+import logging
+import os.path
+import __py_include
+
+from argparse import ArgumentParser
+from homekit.camera.esp32 import WebClient
+from homekit.util import Addr
+from apscheduler.schedulers.asyncio import AsyncIOScheduler
+from datetime import datetime
+from typing import Optional
+
+logger = logging.getLogger(__name__)
+cam: Optional[WebClient] = None
+
+
+class ESP32Capture:
+ def __init__(self, addr: Addr, interval: float, output_directory: str):
+ self.logger = logging.getLogger(self.__class__.__name__)
+ self.client = WebClient(addr)
+ self.output_directory = output_directory
+ self.interval = interval
+
+ self.scheduler = AsyncIOScheduler()
+ self.scheduler.add_job(self.capture, 'interval', seconds=arg.interval)
+ self.scheduler.start()
+
+ async def capture(self):
+ self.logger.debug('capture: start')
+ now = datetime.now()
+ filename = os.path.join(
+ self.output_directory,
+ now.strftime('%Y-%m-%d-%H:%M:%S.%f.jpg')
+ )
+ if not await self.client.capture(filename):
+ self.logger.error('failed to capture')
+ self.logger.debug('capture: done')
+
+
+if __name__ == '__main__':
+ parser = ArgumentParser()
+ parser.add_argument('--addr', type=str, required=True)
+ parser.add_argument('--output-directory', type=str, required=True)
+ parser.add_argument('--interval', type=float, default=0.5)
+ parser.add_argument('--verbose', action='store_true')
+ arg = parser.parse_args()
+
+ if arg.verbose:
+ logging.basicConfig(level=logging.DEBUG)
+
+ loop = asyncio.get_event_loop()
+
+ ESP32Capture(Addr.fromstring(arg.addr), arg.interval, arg.output_directory)
+ try:
+ loop.run_forever()
+ except KeyboardInterrupt:
+ pass