|
@@ -17,6 +17,10 @@ import numpy as np
|
|
import logging
|
|
import logging
|
|
from flask import Flask, Response, make_response, jsonify, request
|
|
from flask import Flask, Response, make_response, jsonify, request
|
|
import paho.mqtt.client as mqtt
|
|
import paho.mqtt.client as mqtt
|
|
|
|
+from peewee import *
|
|
|
|
+from playhouse.shortcuts import model_to_dict
|
|
|
|
+from playhouse.sqlite_ext import *
|
|
|
|
+from playhouse.flask_utils import FlaskDB
|
|
|
|
|
|
from frigate.video import capture_camera, track_camera, get_ffmpeg_input, get_frame_shape, CameraCapture, start_or_restart_ffmpeg
|
|
from frigate.video import capture_camera, track_camera, get_ffmpeg_input, get_frame_shape, CameraCapture, start_or_restart_ffmpeg
|
|
from frigate.object_processing import TrackedObjectProcessor
|
|
from frigate.object_processing import TrackedObjectProcessor
|
|
@@ -43,6 +47,8 @@ if not os.path.exists(CACHE_DIR) and not os.path.islink(CACHE_DIR):
|
|
if not os.path.exists(CLIPS_DIR) and not os.path.islink(CLIPS_DIR):
|
|
if not os.path.exists(CLIPS_DIR) and not os.path.islink(CLIPS_DIR):
|
|
os.makedirs(CLIPS_DIR)
|
|
os.makedirs(CLIPS_DIR)
|
|
|
|
|
|
|
|
+DATABASE = f"sqliteext:///{os.path.join(CLIPS_DIR, 'frigate.db')}"
|
|
|
|
+
|
|
MQTT_HOST = CONFIG['mqtt']['host']
|
|
MQTT_HOST = CONFIG['mqtt']['host']
|
|
MQTT_PORT = CONFIG.get('mqtt', {}).get('port', 1883)
|
|
MQTT_PORT = CONFIG.get('mqtt', {}).get('port', 1883)
|
|
MQTT_TOPIC_PREFIX = CONFIG.get('mqtt', {}).get('topic_prefix', 'frigate')
|
|
MQTT_TOPIC_PREFIX = CONFIG.get('mqtt', {}).get('topic_prefix', 'frigate')
|
|
@@ -78,6 +84,27 @@ GLOBAL_OBJECT_CONFIG = CONFIG.get('objects', {})
|
|
WEB_PORT = CONFIG.get('web_port', 5000)
|
|
WEB_PORT = CONFIG.get('web_port', 5000)
|
|
DETECTORS = CONFIG.get('detectors', {'coral': {'type': 'edgetpu', 'device': 'usb'}})
|
|
DETECTORS = CONFIG.get('detectors', {'coral': {'type': 'edgetpu', 'device': 'usb'}})
|
|
|
|
|
|
|
|
+# create a flask app
|
|
|
|
+app = Flask(__name__)
|
|
|
|
+app.config.from_object(__name__)
|
|
|
|
+flask_db = FlaskDB(app)
|
|
|
|
+db = flask_db.database
|
|
|
|
+log = logging.getLogger('werkzeug')
|
|
|
|
+log.setLevel(logging.ERROR)
|
|
|
|
+
|
|
|
|
+class Event(flask_db.Model):
|
|
|
|
+ id = CharField(null=False, primary_key=True, max_length=30)
|
|
|
|
+ label = CharField(index=True, max_length=20)
|
|
|
|
+ camera = CharField(index=True, max_length=20)
|
|
|
|
+ start_time = DateTimeField(),
|
|
|
|
+ end_time = DateTimeField(),
|
|
|
|
+ top_score = FloatField(),
|
|
|
|
+ false_positive = BooleanField(),
|
|
|
|
+ zones = JSONField()
|
|
|
|
+
|
|
|
|
+def init_db():
|
|
|
|
+ db.create_tables([Event], safe=True)
|
|
|
|
+
|
|
class FrigateWatchdog(threading.Thread):
|
|
class FrigateWatchdog(threading.Thread):
|
|
def __init__(self, camera_processes, config, detectors, detection_queue, out_events, tracked_objects_queue, stop_event):
|
|
def __init__(self, camera_processes, config, detectors, detection_queue, out_events, tracked_objects_queue, stop_event):
|
|
threading.Thread.__init__(self)
|
|
threading.Thread.__init__(self)
|
|
@@ -302,14 +329,9 @@ def main():
|
|
signal.signal(signal.SIGTERM, receiveSignal)
|
|
signal.signal(signal.SIGTERM, receiveSignal)
|
|
signal.signal(signal.SIGINT, receiveSignal)
|
|
signal.signal(signal.SIGINT, receiveSignal)
|
|
|
|
|
|
- # create a flask app that encodes frames a mjpeg on demand
|
|
|
|
- app = Flask(__name__)
|
|
|
|
- log = logging.getLogger('werkzeug')
|
|
|
|
- log.setLevel(logging.ERROR)
|
|
|
|
-
|
|
|
|
@app.route('/')
|
|
@app.route('/')
|
|
def ishealthy():
|
|
def ishealthy():
|
|
- # return a healh
|
|
|
|
|
|
+ # return a health
|
|
return "Frigate is running. Alive and healthy!"
|
|
return "Frigate is running. Alive and healthy!"
|
|
|
|
|
|
@app.route('/debug/stack')
|
|
@app.route('/debug/stack')
|
|
@@ -328,6 +350,13 @@ def main():
|
|
else:
|
|
else:
|
|
os.kill(pid, signal.SIGUSR1)
|
|
os.kill(pid, signal.SIGUSR1)
|
|
return "check logs", 200
|
|
return "check logs", 200
|
|
|
|
+
|
|
|
|
+ @app.route('/events')
|
|
|
|
+ def events():
|
|
|
|
+ events = Event.select().dicts()
|
|
|
|
+ # if events is None:
|
|
|
|
+ # return jsonify([])
|
|
|
|
+ return jsonify([model_to_dict(e) for e in events])
|
|
|
|
|
|
@app.route('/debug/stats')
|
|
@app.route('/debug/stats')
|
|
def stats():
|
|
def stats():
|
|
@@ -438,4 +467,5 @@ def main():
|
|
object_processor.join()
|
|
object_processor.join()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
if __name__ == '__main__':
|
|
|
|
+ init_db()
|
|
main()
|
|
main()
|