def test_clips_should_default_to_global_objects(self): config = { "mqtt": {"host": "mqtt"}, "record": { "events": {"retain": {"default": 20, "objects": {"person": 30}}} }, "objects": {"track": ["person", "dog"]}, "cameras": { "back": { "ffmpeg": { "inputs": [ {"path": "rtsp://10.0.0.1:554/video", "roles": ["detect"]} ] }, "detect": { "height": 1080, "width": 1920, "fps": 5, }, "record": {"events": {}}, } }, } frigate_config = FrigateConfig(**config) assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config back_camera = runtime_config.cameras["back"] assert back_camera.record.events.objects is None assert back_camera.record.events.retain.objects["person"] == 30
def test_role_assigned_but_not_enabled(self): config = { "mqtt": {"host": "mqtt"}, "cameras": { "back": { "ffmpeg": { "inputs": [ { "path": "rtsp://10.0.0.1:554/video", "roles": ["detect", "rtmp"], }, {"path": "rtsp://10.0.0.1:554/record", "roles": ["record"]}, ] }, "detect": { "height": 1080, "width": 1920, "fps": 5, }, } }, } frigate_config = FrigateConfig(**config) assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config ffmpeg_cmds = runtime_config.cameras["back"].ffmpeg_cmds assert len(ffmpeg_cmds) == 1 assert not "clips" in ffmpeg_cmds[0]["roles"]
def test_inherit_clips_retention(self): config = { "mqtt": {"host": "mqtt"}, "record": { "events": {"retain": {"default": 20, "objects": {"person": 30}}} }, "cameras": { "back": { "ffmpeg": { "inputs": [ {"path": "rtsp://10.0.0.1:554/video", "roles": ["detect"]} ] }, "detect": { "height": 1080, "width": 1920, "fps": 5, }, } }, } frigate_config = FrigateConfig(**config) assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config assert ( runtime_config.cameras["back"].record.events.retain.objects["person"] == 30 )
def test_zone_assigns_color_and_contour(self): config = { "mqtt": {"host": "mqtt"}, "record": { "events": {"retain": {"default": 20, "objects": {"person": 30}}} }, "cameras": { "back": { "ffmpeg": { "inputs": [ {"path": "rtsp://10.0.0.1:554/video", "roles": ["detect"]} ] }, "detect": { "height": 1080, "width": 1920, "fps": 5, }, "zones": {"test": {"coordinates": "1,1,1,1,1,1"}}, } }, } frigate_config = FrigateConfig(**config) assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config assert isinstance( runtime_config.cameras["back"].zones["test"].contour, np.ndarray ) assert runtime_config.cameras["back"].zones["test"].color != (0, 0, 0)
def test_ffmpeg_params_camera(self): config = { "mqtt": {"host": "mqtt"}, "ffmpeg": {"input_args": ["test"]}, "cameras": { "back": { "ffmpeg": { "inputs": [ {"path": "rtsp://10.0.0.1:554/video", "roles": ["detect"]} ], "input_args": ["-re"], }, "detect": { "height": 1080, "width": 1920, "fps": 5, }, "objects": { "track": ["person", "dog"], "filters": {"dog": {"threshold": 0.7}}, }, } }, } frigate_config = FrigateConfig(**config) assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config assert "-re" in runtime_config.cameras["back"].ffmpeg_cmds[0]["cmd"] assert "test" not in runtime_config.cameras["back"].ffmpeg_cmds[0]["cmd"]
def test_config_class(self): frigate_config = FrigateConfig(**self.minimal) assert self.minimal == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config assert "cpu" in runtime_config.detectors.keys() assert runtime_config.detectors["cpu"].type == DetectorTypeEnum.cpu
def test_global_object_mask(self): config = { "mqtt": {"host": "mqtt"}, "objects": {"track": ["person", "dog"]}, "cameras": { "back": { "ffmpeg": { "inputs": [ {"path": "rtsp://10.0.0.1:554/video", "roles": ["detect"]} ] }, "detect": { "height": 1080, "width": 1920, "fps": 5, }, "objects": { "mask": "0,0,1,1,0,1", "filters": {"dog": {"mask": "1,1,1,1,1,1"}}, }, } }, } frigate_config = FrigateConfig(**config) assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config back_camera = runtime_config.cameras["back"] assert "dog" in back_camera.objects.filters assert len(back_camera.objects.filters["dog"].raw_mask) == 2 assert len(back_camera.objects.filters["person"].raw_mask) == 1
def test_default_labelmap(self): config = { "mqtt": {"host": "mqtt"}, "model": {"width": 320, "height": 320}, "cameras": { "back": { "ffmpeg": { "inputs": [ { "path": "rtsp://10.0.0.1:554/video", "roles": ["detect"], }, ] }, "detect": { "height": 1080, "width": 1920, "fps": 5, }, } }, } frigate_config = FrigateConfig(**config) assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config assert runtime_config.model.merged_labelmap[0] == "person"
def test_global_timestamp_style_merge(self): config = { "mqtt": {"host": "mqtt"}, "rtmp": {"enabled": False}, "timestamp_style": {"position": "br", "thickness": 2}, "cameras": { "back": { "ffmpeg": { "inputs": [ { "path": "rtsp://10.0.0.1:554/video", "roles": ["detect"], }, ] }, "timestamp_style": {"position": "bl", "thickness": 4}, } }, } frigate_config = FrigateConfig(**config) assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config assert runtime_config.cameras["back"].timestamp_style.position == "bl" assert runtime_config.cameras["back"].timestamp_style.thickness == 4
def test_inherit_object_filters(self): config = { "mqtt": {"host": "mqtt"}, "objects": { "track": ["person", "dog"], "filters": {"dog": {"threshold": 0.7}}, }, "cameras": { "back": { "ffmpeg": { "inputs": [ {"path": "rtsp://10.0.0.1:554/video", "roles": ["detect"]} ] }, "detect": { "height": 1080, "width": 1920, "fps": 5, }, } }, } frigate_config = FrigateConfig(**config) assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config assert "dog" in runtime_config.cameras["back"].objects.filters assert runtime_config.cameras["back"].objects.filters["dog"].threshold == 0.7
def test_global_live_merge(self): config = { "mqtt": {"host": "mqtt"}, "live": {"quality": 4, "height": 480}, "cameras": { "back": { "ffmpeg": { "inputs": [ { "path": "rtsp://10.0.0.1:554/video", "roles": ["detect"], }, ] }, "live": { "quality": 7, }, } }, } frigate_config = FrigateConfig(**config) assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config assert runtime_config.cameras["back"].live.quality == 7 assert runtime_config.cameras["back"].live.height == 480
def test_global_rtmp_default(self): config = { "mqtt": {"host": "mqtt"}, "rtmp": {"enabled": False}, "cameras": { "back": { "ffmpeg": { "inputs": [ { "path": "rtsp://10.0.0.1:554/video", "roles": ["detect"], }, { "path": "rtsp://10.0.0.1:554/video2", "roles": ["record"], }, ] }, } }, } frigate_config = FrigateConfig(**config) assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config assert not runtime_config.cameras["back"].rtmp.enabled
def test_allow_retain_to_be_a_decimal(self): config = { "mqtt": { "host": "mqtt" }, "snapshots": { "retain": { "default": 1.5 } }, "cameras": { "back": { "ffmpeg": { "inputs": [ { "path": "rtsp://10.0.0.1:554/video", "roles": ["detect"], }, ] }, } }, } frigate_config = FrigateConfig(**config) assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config assert runtime_config.cameras["back"].snapshots.retain.default == 1.5
def test_default_snapshots(self): config = { "mqtt": { "host": "mqtt" }, "cameras": { "back": { "ffmpeg": { "inputs": [ { "path": "rtsp://10.0.0.1:554/video", "roles": ["detect"], }, ] } } }, } frigate_config = FrigateConfig(**config) assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config assert runtime_config.cameras["back"].snapshots.bounding_box assert runtime_config.cameras["back"].snapshots.quality == 70
def test_default_input_args(self): config = { "mqtt": {"host": "mqtt"}, "cameras": { "back": { "ffmpeg": { "inputs": [ { "path": "rtsp://10.0.0.1:554/video", "roles": ["detect"], }, ] }, "detect": { "height": 1080, "width": 1920, "fps": 5, }, } }, } frigate_config = FrigateConfig(**config) assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config assert "-rtsp_transport" in runtime_config.cameras["back"].ffmpeg_cmds[0]["cmd"]
def test_motion_contour_area_dynamic(self): config = { "mqtt": {"host": "mqtt"}, "cameras": { "back": { "ffmpeg": { "inputs": [ { "path": "rtsp://10.0.0.1:554/video", "roles": ["detect"], }, ] }, "detect": { "height": 1080, "width": 1920, "fps": 5, }, } }, } frigate_config = FrigateConfig(**config) assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config assert round(runtime_config.cameras["back"].motion.contour_area) == 30
def test_motion_frame_height_wont_go_below_120(self): config = { "mqtt": {"host": "mqtt"}, "cameras": { "back": { "ffmpeg": { "inputs": [ { "path": "rtsp://10.0.0.1:554/video", "roles": ["detect"], }, ] }, "detect": { "height": 1080, "width": 1920, "fps": 5, }, } }, } frigate_config = FrigateConfig(**config) assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config assert runtime_config.cameras["back"].motion.frame_height == 50
def test_default_detect(self): config = { "mqtt": { "host": "mqtt" }, "cameras": { "back": { "ffmpeg": { "inputs": [ { "path": "rtsp://10.0.0.1:554/video", "roles": ["detect"], }, ] } } }, } frigate_config = FrigateConfig(**config) assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config assert runtime_config.cameras["back"].detect.max_disappeared == 25 assert runtime_config.cameras["back"].detect.height == 720
def test_global_snapshots_merge(self): config = { "mqtt": {"host": "mqtt"}, "snapshots": {"bounding_box": False, "height": 300}, "cameras": { "back": { "ffmpeg": { "inputs": [ { "path": "rtsp://10.0.0.1:554/video", "roles": ["detect"], }, ] }, "snapshots": { "height": 150, "enabled": True, }, } }, } frigate_config = FrigateConfig(**config) assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config assert runtime_config.cameras["back"].snapshots.bounding_box == False assert runtime_config.cameras["back"].snapshots.height == 150 assert runtime_config.cameras["back"].snapshots.enabled
def test_global_snapshots(self): config = { "mqtt": {"host": "mqtt"}, "snapshots": {"enabled": True}, "cameras": { "back": { "ffmpeg": { "inputs": [ { "path": "rtsp://10.0.0.1:554/video", "roles": ["detect"], }, ] }, "snapshots": { "height": 100, }, } }, } frigate_config = FrigateConfig(**config) assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config assert runtime_config.cameras["back"].snapshots.enabled assert runtime_config.cameras["back"].snapshots.height == 100
def test_global_detect_merge(self): config = { "mqtt": {"host": "mqtt"}, "detect": {"max_disappeared": 1, "height": 720}, "cameras": { "back": { "ffmpeg": { "inputs": [ { "path": "rtsp://10.0.0.1:554/video", "roles": ["detect"], }, ] }, "detect": { "height": 1080, "width": 1920, "fps": 5, }, } }, } frigate_config = FrigateConfig(**config) assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config assert runtime_config.cameras["back"].detect.max_disappeared == 1 assert runtime_config.cameras["back"].detect.height == 1080 assert runtime_config.cameras["back"].detect.width == 1920
def test_override_tracked_objects(self): config = { "mqtt": {"host": "mqtt"}, "objects": {"track": ["person", "dog"]}, "cameras": { "back": { "ffmpeg": { "inputs": [ {"path": "rtsp://10.0.0.1:554/video", "roles": ["detect"]} ] }, "detect": { "height": 1080, "width": 1920, "fps": 5, }, "objects": {"track": ["cat"]}, } }, } frigate_config = FrigateConfig(**config) assert config == frigate_config.dict(exclude_unset=True) runtime_config = frigate_config.runtime_config assert "cat" in runtime_config.cameras["back"].objects.track
def test_override_tracked_objects(self): config = { 'mqtt': { 'host': 'mqtt' }, 'objects': { 'track': ['person', 'dog'] }, 'cameras': { 'back': { 'ffmpeg': { 'inputs': [{ 'path': 'rtsp://10.0.0.1:554/video', 'roles': ['detect'] }] }, 'height': 1080, 'width': 1920, 'objects': { 'track': ['cat'] } } } } frigate_config = FrigateConfig(config=config) assert ('cat' in frigate_config.cameras['back'].objects.track)
def test_role_assigned_but_not_enabled(self): json_config = { 'mqtt': { 'host': 'mqtt' }, 'cameras': { 'back': { 'ffmpeg': { 'inputs': [{ 'path': 'rtsp://10.0.0.1:554/video', 'roles': ['detect', 'rtmp'] }, { 'path': 'rtsp://10.0.0.1:554/record', 'roles': ['record'] }] }, 'height': 1080, 'width': 1920 } } } config = FrigateConfig(config=json_config) ffmpeg_cmds = config.cameras['back'].ffmpeg_cmds assert (len(ffmpeg_cmds) == 1) assert (not 'clips' in ffmpeg_cmds[0]['roles'])
def test_clips_should_default_to_global_objects(self): config = { 'mqtt': { 'host': 'mqtt' }, 'clips': { 'retain': { 'default': 20, 'objects': { 'person': 30 } } }, 'objects': { 'track': ['person', 'dog'] }, 'cameras': { 'back': { 'ffmpeg': { 'inputs': [{ 'path': 'rtsp://10.0.0.1:554/video', 'roles': ['detect'] }] }, 'height': 1080, 'width': 1920, 'clips': { 'enabled': True } } } } config = FrigateConfig(config=config) assert (config.cameras['back'].clips.objects is None)
def test_zone_matching_camera_name_throws_error(self): config = { 'mqtt': { 'host': 'mqtt' }, 'clips': { 'retain': { 'default': 20, 'objects': { 'person': 30 } } }, 'cameras': { 'back': { 'ffmpeg': { 'inputs': [{ 'path': 'rtsp://10.0.0.1:554/video', 'roles': ['detect'] }] }, 'height': 1080, 'width': 1920, 'zones': { 'back': { 'coordinates': '1,1,1,1,1,1' } } } } } self.assertRaises(vol.MultipleInvalid, lambda: FrigateConfig(config=config))
def test_inherit_clips_retention(self): config = { 'mqtt': { 'host': 'mqtt' }, 'clips': { 'retain': { 'default': 20, 'objects': { 'person': 30 } } }, 'cameras': { 'back': { 'ffmpeg': { 'inputs': [{ 'path': 'rtsp://10.0.0.1:554/video', 'roles': ['detect'] }] }, 'height': 1080, 'width': 1920 } } } frigate_config = FrigateConfig(config=config) assert (frigate_config.cameras['back'].clips.retain.objects['person'] == 30)
def test_ffmpeg_params_input(self): config = { 'mqtt': { 'host': 'mqtt' }, 'cameras': { 'back': { 'ffmpeg': { 'inputs': [{ 'path': 'rtsp://10.0.0.1:554/video', 'roles': ['detect'], 'input_args': ['-re'] }] }, 'height': 1080, 'width': 1920, 'objects': { 'track': ['person', 'dog'], 'filters': { 'dog': { 'threshold': 0.7 } } } } } } frigate_config = FrigateConfig(config=config) assert ('-re' in frigate_config.cameras['back'].ffmpeg_cmds[0]['cmd'])
def test_override_object_filters(self): config = { 'mqtt': { 'host': 'mqtt' }, 'cameras': { 'back': { 'ffmpeg': { 'inputs': [{ 'path': 'rtsp://10.0.0.1:554/video', 'roles': ['detect'] }] }, 'height': 1080, 'width': 1920, 'objects': { 'track': ['person', 'dog'], 'filters': { 'dog': { 'threshold': 0.7 } } } } } } frigate_config = FrigateConfig(config=config) assert ('dog' in frigate_config.cameras['back'].objects.filters) assert (frigate_config.cameras['back'].objects.filters['dog'].threshold == 0.7)
def test_fails_on_missing_role(self): config = { "mqtt": {"host": "mqtt"}, "cameras": { "back": { "ffmpeg": { "inputs": [ { "path": "rtsp://10.0.0.1:554/video", "roles": ["detect"], }, { "path": "rtsp://10.0.0.1:554/video2", "roles": ["record"], }, ] }, "detect": { "height": 1080, "width": 1920, "fps": 5, }, "rtmp": {"enabled": True}, } }, } frigate_config = FrigateConfig(**config) self.assertRaises(ValueError, lambda: frigate_config.runtime_config)