Documentation for the review activity audio and motion endpoints

This commit is contained in:
Rui Alves 2024-10-14 16:05:21 +01:00
parent 6d596a372c
commit a53f128d96
2 changed files with 18 additions and 3 deletions

View File

@ -39,3 +39,12 @@ class DayReview(BaseModel):
class ReviewSummaryResponse(BaseModel): class ReviewSummaryResponse(BaseModel):
last24Hours: Last24HoursReview last24Hours: Last24HoursReview
root: Dict[str, DayReview] root: Dict[str, DayReview]
class ReviewActivityMotionResponse(BaseModel):
start_time: int
motion: float
camera: str
class ReviewActivityAudioResponse(BaseModel):
start_time: int
audio: int

View File

@ -1,6 +1,7 @@
"""Review apis.""" """Review apis."""
import datetime import datetime
import json
import logging import logging
from functools import reduce from functools import reduce
from pathlib import Path from pathlib import Path
@ -18,6 +19,8 @@ from frigate.api.defs.review_query_parameters import (
ReviewSummaryQueryParams, ReviewSummaryQueryParams,
) )
from frigate.api.defs.review_responses import ( from frigate.api.defs.review_responses import (
ReviewActivityAudioResponse,
ReviewActivityMotionResponse,
ReviewSegmentResponse, ReviewSegmentResponse,
ReviewSummaryResponse, ReviewSummaryResponse,
) )
@ -428,7 +431,9 @@ def delete_reviews(body: dict = None):
) )
@router.get("/review/activity/motion") @router.get(
"/review/activity/motion", response_model=list[ReviewActivityMotionResponse]
)
def motion_activity(params: ReviewActivityMotionQueryParams = Depends()): def motion_activity(params: ReviewActivityMotionQueryParams = Depends()):
"""Get motion and audio activity.""" """Get motion and audio activity."""
cameras = params.cameras cameras = params.cameras
@ -502,7 +507,7 @@ def motion_activity(params: ReviewActivityMotionQueryParams = Depends()):
return JSONResponse(content=normalized) return JSONResponse(content=normalized)
@router.get("/review/activity/audio") @router.get("/review/activity/audio", response_model=list[ReviewActivityAudioResponse])
def audio_activity(params: ReviewActivityMotionQueryParams = Depends()): def audio_activity(params: ReviewActivityMotionQueryParams = Depends()):
"""Get motion and audio activity.""" """Get motion and audio activity."""
cameras = params.cameras cameras = params.cameras
@ -554,6 +559,7 @@ def audio_activity(params: ReviewActivityMotionQueryParams = Depends()):
# normalize data # normalize data
df = df.resample(f"{scale}S").mean().fillna(0.0) df = df.resample(f"{scale}S").mean().fillna(0.0)
# FIXME: If min/max audio is the same then we get division by 0 and as such audio is 'nan'
df["audio"] = ( df["audio"] = (
(df["audio"] - df["audio"].max()) (df["audio"] - df["audio"].max())
/ (df["audio"].min() - df["audio"].max()) / (df["audio"].min() - df["audio"].max())
@ -562,7 +568,7 @@ def audio_activity(params: ReviewActivityMotionQueryParams = Depends()):
# change types for output # change types for output
df.index = df.index.astype(int) // (10**9) df.index = df.index.astype(int) // (10**9)
normalized = df.reset_index().to_dict("records") normalized = json.loads(df.reset_index().to_json(orient="records"))
return JSONResponse(content=normalized) return JSONResponse(content=normalized)