示例#1
0
    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
示例#2
0
    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"]
示例#3
0
    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
        )
示例#4
0
    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)
示例#5
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"]
示例#6
0
    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
示例#7
0
    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
示例#8
0
    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"
示例#9
0
    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
示例#10
0
    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
示例#11
0
    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
示例#12
0
    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
示例#13
0
    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
示例#14
0
    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
示例#15
0
    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"]
示例#16
0
    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
示例#17
0
    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
示例#18
0
    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
示例#19
0
    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
示例#20
0
    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
示例#21
0
    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
示例#22
0
    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
示例#23
0
 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)
示例#24
0
    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'])
示例#25
0
 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)
示例#26
0
 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))
示例#27
0
 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)
示例#28
0
 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'])
示例#29
0
 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)
示例#30
0
    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)