mirror of
https://github.com/blakeblackshear/frigate.git
synced 2024-11-21 19:07:46 +01:00
parent
f3f9b36e07
commit
2f401bd8da
@ -107,33 +107,64 @@ class FrigateApp:
|
|||||||
for camera_name in self.config.cameras.keys():
|
for camera_name in self.config.cameras.keys():
|
||||||
# create camera_metrics
|
# create camera_metrics
|
||||||
self.camera_metrics[camera_name] = {
|
self.camera_metrics[camera_name] = {
|
||||||
"camera_fps": mp.Value("d", 0.0),
|
"camera_fps": mp.Value("d", 0.0), # type: ignore[typeddict-item]
|
||||||
"skipped_fps": mp.Value("d", 0.0),
|
# issue https://github.com/python/typeshed/issues/8799
|
||||||
"process_fps": mp.Value("d", 0.0),
|
# from mypy 0.981 onwards
|
||||||
"detection_enabled": mp.Value(
|
"skipped_fps": mp.Value("d", 0.0), # type: ignore[typeddict-item]
|
||||||
"i", self.config.cameras[camera_name].detect.enabled
|
# issue https://github.com/python/typeshed/issues/8799
|
||||||
|
# from mypy 0.981 onwards
|
||||||
|
"process_fps": mp.Value("d", 0.0), # type: ignore[typeddict-item]
|
||||||
|
# issue https://github.com/python/typeshed/issues/8799
|
||||||
|
# from mypy 0.981 onwards
|
||||||
|
"detection_enabled": mp.Value( # type: ignore[typeddict-item]
|
||||||
|
# issue https://github.com/python/typeshed/issues/8799
|
||||||
|
# from mypy 0.981 onwards
|
||||||
|
"i",
|
||||||
|
self.config.cameras[camera_name].detect.enabled,
|
||||||
),
|
),
|
||||||
"motion_enabled": mp.Value("i", True),
|
"motion_enabled": mp.Value("i", True), # type: ignore[typeddict-item]
|
||||||
"improve_contrast_enabled": mp.Value(
|
# issue https://github.com/python/typeshed/issues/8799
|
||||||
"i", self.config.cameras[camera_name].motion.improve_contrast
|
# from mypy 0.981 onwards
|
||||||
|
"improve_contrast_enabled": mp.Value( # type: ignore[typeddict-item]
|
||||||
|
# issue https://github.com/python/typeshed/issues/8799
|
||||||
|
# from mypy 0.981 onwards
|
||||||
|
"i",
|
||||||
|
self.config.cameras[camera_name].motion.improve_contrast,
|
||||||
),
|
),
|
||||||
"motion_threshold": mp.Value(
|
"motion_threshold": mp.Value( # type: ignore[typeddict-item]
|
||||||
"i", self.config.cameras[camera_name].motion.threshold
|
# issue https://github.com/python/typeshed/issues/8799
|
||||||
|
# from mypy 0.981 onwards
|
||||||
|
"i",
|
||||||
|
self.config.cameras[camera_name].motion.threshold,
|
||||||
),
|
),
|
||||||
"motion_contour_area": mp.Value(
|
"motion_contour_area": mp.Value( # type: ignore[typeddict-item]
|
||||||
"i", self.config.cameras[camera_name].motion.contour_area
|
# issue https://github.com/python/typeshed/issues/8799
|
||||||
|
# from mypy 0.981 onwards
|
||||||
|
"i",
|
||||||
|
self.config.cameras[camera_name].motion.contour_area,
|
||||||
),
|
),
|
||||||
"detection_fps": mp.Value("d", 0.0),
|
"detection_fps": mp.Value("d", 0.0), # type: ignore[typeddict-item]
|
||||||
"detection_frame": mp.Value("d", 0.0),
|
# issue https://github.com/python/typeshed/issues/8799
|
||||||
"read_start": mp.Value("d", 0.0),
|
# from mypy 0.981 onwards
|
||||||
"ffmpeg_pid": mp.Value("i", 0),
|
"detection_frame": mp.Value("d", 0.0), # type: ignore[typeddict-item]
|
||||||
|
# issue https://github.com/python/typeshed/issues/8799
|
||||||
|
# from mypy 0.981 onwards
|
||||||
|
"read_start": mp.Value("d", 0.0), # type: ignore[typeddict-item]
|
||||||
|
# issue https://github.com/python/typeshed/issues/8799
|
||||||
|
# from mypy 0.981 onwards
|
||||||
|
"ffmpeg_pid": mp.Value("i", 0), # type: ignore[typeddict-item]
|
||||||
|
# issue https://github.com/python/typeshed/issues/8799
|
||||||
|
# from mypy 0.981 onwards
|
||||||
"frame_queue": mp.Queue(maxsize=2),
|
"frame_queue": mp.Queue(maxsize=2),
|
||||||
"capture_process": None,
|
"capture_process": None,
|
||||||
"process": None,
|
"process": None,
|
||||||
}
|
}
|
||||||
self.record_metrics[camera_name] = {
|
self.record_metrics[camera_name] = {
|
||||||
"record_enabled": mp.Value(
|
"record_enabled": mp.Value( # type: ignore[typeddict-item]
|
||||||
"i", self.config.cameras[camera_name].record.enabled
|
# issue https://github.com/python/typeshed/issues/8799
|
||||||
|
# from mypy 0.981 onwards
|
||||||
|
"i",
|
||||||
|
self.config.cameras[camera_name].record.enabled,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -262,8 +262,12 @@ def stats_snapshot(
|
|||||||
for name, detector in stats_tracking["detectors"].items():
|
for name, detector in stats_tracking["detectors"].items():
|
||||||
pid = detector.detect_process.pid if detector.detect_process else None
|
pid = detector.detect_process.pid if detector.detect_process else None
|
||||||
stats["detectors"][name] = {
|
stats["detectors"][name] = {
|
||||||
"inference_speed": round(detector.avg_inference_speed.value * 1000, 2),
|
"inference_speed": round(detector.avg_inference_speed.value * 1000, 2), # type: ignore[attr-defined]
|
||||||
"detection_start": detector.detection_start.value,
|
# issue https://github.com/python/typeshed/issues/8799
|
||||||
|
# from mypy 0.981 onwards
|
||||||
|
"detection_start": detector.detection_start.value, # type: ignore[attr-defined]
|
||||||
|
# issue https://github.com/python/typeshed/issues/8799
|
||||||
|
# from mypy 0.981 onwards
|
||||||
"pid": pid,
|
"pid": pid,
|
||||||
}
|
}
|
||||||
stats["detection_fps"] = round(total_detection_fps, 2)
|
stats["detection_fps"] = round(total_detection_fps, 2)
|
||||||
|
@ -24,7 +24,9 @@ class FrigateWatchdog(threading.Thread):
|
|||||||
|
|
||||||
# check the detection processes
|
# check the detection processes
|
||||||
for detector in self.detectors.values():
|
for detector in self.detectors.values():
|
||||||
detection_start = detector.detection_start.value
|
detection_start = detector.detection_start.value # type: ignore[attr-defined]
|
||||||
|
# issue https://github.com/python/typeshed/issues/8799
|
||||||
|
# from mypy 0.981 onwards
|
||||||
if detection_start > 0.0 and now - detection_start > 10:
|
if detection_start > 0.0 and now - detection_start > 10:
|
||||||
logger.info(
|
logger.info(
|
||||||
"Detection appears to be stuck. Restarting detection process..."
|
"Detection appears to be stuck. Restarting detection process..."
|
||||||
|
@ -3,13 +3,13 @@ Flask == 2.3.*
|
|||||||
faster-fifo == 1.4.*
|
faster-fifo == 1.4.*
|
||||||
imutils == 0.5.*
|
imutils == 0.5.*
|
||||||
matplotlib == 3.7.*
|
matplotlib == 3.7.*
|
||||||
mypy == 0.942
|
mypy == 1.4.1
|
||||||
numpy == 1.23.*
|
numpy == 1.23.*
|
||||||
onvif_zeep == 0.2.12
|
onvif_zeep == 0.2.12
|
||||||
opencv-python-headless == 4.7.0.*
|
opencv-python-headless == 4.7.0.*
|
||||||
paho-mqtt == 1.6.*
|
paho-mqtt == 1.6.*
|
||||||
peewee == 3.16.*
|
peewee == 3.16.*
|
||||||
peewee_migrate == 1.10.*
|
peewee_migrate == 1.11.*
|
||||||
psutil == 5.9.*
|
psutil == 5.9.*
|
||||||
pydantic == 1.10.*
|
pydantic == 1.10.*
|
||||||
git+https://github.com/fbcotter/py3nvml#egg=py3nvml
|
git+https://github.com/fbcotter/py3nvml#egg=py3nvml
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
<link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon.png" />
|
<link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon.png" />
|
||||||
<link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32.png" />
|
<link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32.png" />
|
||||||
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16.png" />
|
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16.png" />
|
||||||
<link rel="icon" type="image/svg+xml" href="/images/favicon.svg">
|
<link rel="icon" type="image/svg+xml" href="/images/favicon.svg" />
|
||||||
<link rel="manifest" href="/site.webmanifest" />
|
<link rel="manifest" href="/site.webmanifest" />
|
||||||
<link rel="mask-icon" href="/images/favicon.svg" color="#3b82f7" />
|
<link rel="mask-icon" href="/images/favicon.svg" color="#3b82f7" />
|
||||||
<meta name="msapplication-TileColor" content="#3b82f7" />
|
<meta name="msapplication-TileColor" content="#3b82f7" />
|
||||||
|
955
web/package-lock.json
generated
955
web/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -38,8 +38,8 @@
|
|||||||
"@testing-library/user-event": "^14.4.3",
|
"@testing-library/user-event": "^14.4.3",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.59.1",
|
"@typescript-eslint/eslint-plugin": "^5.59.1",
|
||||||
"@typescript-eslint/parser": "^5.59.1",
|
"@typescript-eslint/parser": "^5.59.1",
|
||||||
"@vitest/coverage-c8": "^0.31.0",
|
"@vitest/coverage-v8": "^0.32.2",
|
||||||
"@vitest/ui": "^0.31.0",
|
"@vitest/ui": "^0.32.2",
|
||||||
"autoprefixer": "^10.4.14",
|
"autoprefixer": "^10.4.14",
|
||||||
"eslint": "^8.39.0",
|
"eslint": "^8.39.0",
|
||||||
"eslint-config-preact": "^1.3.0",
|
"eslint-config-preact": "^1.3.0",
|
||||||
@ -53,6 +53,6 @@
|
|||||||
"tailwindcss": "^3.3.2",
|
"tailwindcss": "^3.3.2",
|
||||||
"typescript": "^5.0.4",
|
"typescript": "^5.0.4",
|
||||||
"vite": "^4.3.5",
|
"vite": "^4.3.5",
|
||||||
"vitest": "^0.31.0"
|
"vitest": "^0.32.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,9 +18,9 @@ export default function Export() {
|
|||||||
const localISODate = localDate.toISOString().split('T')[0];
|
const localISODate = localDate.toISOString().split('T')[0];
|
||||||
|
|
||||||
const [startDate, setStartDate] = useState(localISODate);
|
const [startDate, setStartDate] = useState(localISODate);
|
||||||
const [startTime, setStartTime] = useState("00:00");
|
const [startTime, setStartTime] = useState('00:00');
|
||||||
const [endDate, setEndDate] = useState(localISODate);
|
const [endDate, setEndDate] = useState(localISODate);
|
||||||
const [endTime, setEndTime] = useState("23:59");
|
const [endTime, setEndTime] = useState('23:59');
|
||||||
|
|
||||||
const onHandleExport = () => {
|
const onHandleExport = () => {
|
||||||
if (camera == 'select') {
|
if (camera == 'select') {
|
||||||
@ -33,8 +33,6 @@ export default function Export() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (!startDate || !startTime || !endDate || !endTime) {
|
if (!startDate || !startTime || !endDate || !endTime) {
|
||||||
setMessage({ text: 'A start and end time needs to be selected', error: true });
|
setMessage({ text: 'A start and end time needs to be selected', error: true });
|
||||||
return;
|
return;
|
||||||
@ -48,12 +46,13 @@ export default function Export() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
axios.post(`export/${camera}/start/${start}/end/${end}`, { playback })
|
axios
|
||||||
|
.post(`export/${camera}/start/${start}/end/${end}`, { playback })
|
||||||
.then(() => {
|
.then(() => {
|
||||||
setMessage({ text: 'Successfully started export. View the file in the /exports folder.', error: false });
|
setMessage({ text: 'Successfully started export. View the file in the /exports folder.', error: false });
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
setMessage({ text: 'Failed to start export: '+error.response.data.message, error: true });
|
setMessage({ text: `Failed to start export: ${error.response.data.message}`, error: true });
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -93,13 +92,37 @@ export default function Export() {
|
|||||||
<Heading className="py-2" size="sm">
|
<Heading className="py-2" size="sm">
|
||||||
From:
|
From:
|
||||||
</Heading>
|
</Heading>
|
||||||
<input className="dark:bg-slate-800" id="startDate" type="date" value={startDate} onChange={(e) => setStartDate(e.target.value)}/>
|
<input
|
||||||
<input className="dark:bg-slate-800" id="startTime" type="time" value={startTime} onChange={(e) => setStartTime(e.target.value)}/>
|
className="dark:bg-slate-800"
|
||||||
|
id="startDate"
|
||||||
|
type="date"
|
||||||
|
value={startDate}
|
||||||
|
onChange={(e) => setStartDate(e.target.value)}
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
className="dark:bg-slate-800"
|
||||||
|
id="startTime"
|
||||||
|
type="time"
|
||||||
|
value={startTime}
|
||||||
|
onChange={(e) => setStartTime(e.target.value)}
|
||||||
|
/>
|
||||||
<Heading className="py-2" size="sm">
|
<Heading className="py-2" size="sm">
|
||||||
To:
|
To:
|
||||||
</Heading>
|
</Heading>
|
||||||
<input className="dark:bg-slate-800" id="endDate" type="date" value={endDate} onChange={(e) => setEndDate(e.target.value)}/>
|
<input
|
||||||
<input className="dark:bg-slate-800" id="endTime" type="time" value={endTime} onChange={(e) => setEndTime(e.target.value)}/>
|
className="dark:bg-slate-800"
|
||||||
|
id="endDate"
|
||||||
|
type="date"
|
||||||
|
value={endDate}
|
||||||
|
onChange={(e) => setEndDate(e.target.value)}
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
className="dark:bg-slate-800"
|
||||||
|
id="endTime"
|
||||||
|
type="time"
|
||||||
|
value={endTime}
|
||||||
|
onChange={(e) => setEndTime(e.target.value)}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<Button onClick={() => onHandleExport()}>Submit</Button>
|
<Button onClick={() => onHandleExport()}>Submit</Button>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user