2020-11-01 13:17:44 +01:00
|
|
|
import json
|
|
|
|
from unittest import TestCase, main
|
|
|
|
import voluptuous as vol
|
2020-11-03 15:15:58 +01:00
|
|
|
from frigate.config import FRIGATE_CONFIG_SCHEMA, FrigateConfig
|
2020-11-01 13:17:44 +01:00
|
|
|
|
|
|
|
class TestConfig(TestCase):
|
2020-11-03 15:15:58 +01:00
|
|
|
def setUp(self):
|
|
|
|
self.minimal = {
|
|
|
|
'mqtt': {
|
|
|
|
'host': 'mqtt'
|
|
|
|
},
|
|
|
|
'cameras': {
|
|
|
|
'back': {
|
|
|
|
'ffmpeg': {
|
2020-11-29 22:55:53 +01:00
|
|
|
'inputs': [
|
|
|
|
{ 'path': 'rtsp://10.0.0.1:554/video', 'roles': ['detect'] }
|
|
|
|
]
|
2020-11-03 15:15:58 +01:00
|
|
|
},
|
|
|
|
'height': 1080,
|
|
|
|
'width': 1920
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-11-01 13:17:44 +01:00
|
|
|
def test_empty(self):
|
|
|
|
FRIGATE_CONFIG_SCHEMA({})
|
|
|
|
|
|
|
|
def test_minimal(self):
|
2020-11-03 15:15:58 +01:00
|
|
|
FRIGATE_CONFIG_SCHEMA(self.minimal)
|
|
|
|
|
|
|
|
def test_config_class(self):
|
|
|
|
FrigateConfig(config=self.minimal)
|
|
|
|
|
|
|
|
def test_inherit_tracked_objects(self):
|
|
|
|
config = {
|
|
|
|
'mqtt': {
|
|
|
|
'host': 'mqtt'
|
|
|
|
},
|
|
|
|
'objects': {
|
|
|
|
'track': ['person', 'dog']
|
|
|
|
},
|
|
|
|
'cameras': {
|
|
|
|
'back': {
|
|
|
|
'ffmpeg': {
|
2020-11-29 22:55:53 +01:00
|
|
|
'inputs': [
|
|
|
|
{ 'path': 'rtsp://10.0.0.1:554/video', 'roles': ['detect'] }
|
|
|
|
]
|
2020-11-03 15:15:58 +01:00
|
|
|
},
|
|
|
|
'height': 1080,
|
|
|
|
'width': 1920
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
frigate_config = FrigateConfig(config=config)
|
|
|
|
assert('dog' in frigate_config.cameras['back'].objects.track)
|
|
|
|
|
|
|
|
def test_override_tracked_objects(self):
|
|
|
|
config = {
|
|
|
|
'mqtt': {
|
|
|
|
'host': 'mqtt'
|
|
|
|
},
|
|
|
|
'objects': {
|
|
|
|
'track': ['person', 'dog']
|
|
|
|
},
|
|
|
|
'cameras': {
|
|
|
|
'back': {
|
|
|
|
'ffmpeg': {
|
2020-11-29 22:55:53 +01:00
|
|
|
'inputs': [
|
|
|
|
{ 'path': 'rtsp://10.0.0.1:554/video', 'roles': ['detect'] }
|
|
|
|
]
|
2020-11-03 15:15:58 +01:00
|
|
|
},
|
|
|
|
'height': 1080,
|
|
|
|
'width': 1920,
|
|
|
|
'objects': {
|
|
|
|
'track': ['cat']
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
frigate_config = FrigateConfig(config=config)
|
|
|
|
assert('cat' in frigate_config.cameras['back'].objects.track)
|
|
|
|
|
|
|
|
def test_default_object_filters(self):
|
|
|
|
config = {
|
|
|
|
'mqtt': {
|
|
|
|
'host': 'mqtt'
|
|
|
|
},
|
|
|
|
'objects': {
|
|
|
|
'track': ['person', 'dog']
|
|
|
|
},
|
|
|
|
'cameras': {
|
|
|
|
'back': {
|
|
|
|
'ffmpeg': {
|
2020-11-29 22:55:53 +01:00
|
|
|
'inputs': [
|
|
|
|
{ 'path': 'rtsp://10.0.0.1:554/video', 'roles': ['detect'] }
|
|
|
|
]
|
2020-11-03 15:15:58 +01:00
|
|
|
},
|
|
|
|
'height': 1080,
|
|
|
|
'width': 1920
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
frigate_config = FrigateConfig(config=config)
|
|
|
|
assert('dog' in frigate_config.cameras['back'].objects.filters)
|
|
|
|
|
|
|
|
def test_inherit_object_filters(self):
|
|
|
|
config = {
|
|
|
|
'mqtt': {
|
|
|
|
'host': 'mqtt'
|
|
|
|
},
|
|
|
|
'objects': {
|
|
|
|
'track': ['person', 'dog'],
|
|
|
|
'filters': {
|
|
|
|
'dog': {
|
|
|
|
'threshold': 0.7
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'cameras': {
|
|
|
|
'back': {
|
|
|
|
'ffmpeg': {
|
2020-11-29 22:55:53 +01:00
|
|
|
'inputs': [
|
|
|
|
{ 'path': 'rtsp://10.0.0.1:554/video', 'roles': ['detect'] }
|
|
|
|
]
|
2020-11-03 15:15:58 +01:00
|
|
|
},
|
|
|
|
'height': 1080,
|
|
|
|
'width': 1920
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
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_override_object_filters(self):
|
|
|
|
config = {
|
|
|
|
'mqtt': {
|
|
|
|
'host': 'mqtt'
|
|
|
|
},
|
|
|
|
'cameras': {
|
|
|
|
'back': {
|
|
|
|
'ffmpeg': {
|
2020-11-29 22:55:53 +01:00
|
|
|
'inputs': [
|
|
|
|
{ 'path': 'rtsp://10.0.0.1:554/video', 'roles': ['detect'] }
|
|
|
|
]
|
2020-11-03 15:15:58 +01:00
|
|
|
},
|
|
|
|
'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)
|
|
|
|
|
2021-02-05 14:22:33 +01:00
|
|
|
def test_ffmpeg_params_global(self):
|
2020-11-03 15:15:58 +01:00
|
|
|
config = {
|
|
|
|
'ffmpeg': {
|
|
|
|
'input_args': ['-re']
|
|
|
|
},
|
2020-11-01 13:17:44 +01:00
|
|
|
'mqtt': {
|
|
|
|
'host': 'mqtt'
|
|
|
|
},
|
|
|
|
'cameras': {
|
|
|
|
'back': {
|
|
|
|
'ffmpeg': {
|
2020-11-29 22:55:53 +01:00
|
|
|
'inputs': [
|
|
|
|
{ 'path': 'rtsp://10.0.0.1:554/video', 'roles': ['detect'] }
|
|
|
|
]
|
2020-11-03 15:15:58 +01:00
|
|
|
},
|
|
|
|
'height': 1080,
|
|
|
|
'width': 1920,
|
|
|
|
'objects': {
|
|
|
|
'track': ['person', 'dog'],
|
|
|
|
'filters': {
|
|
|
|
'dog': {
|
|
|
|
'threshold': 0.7
|
|
|
|
}
|
|
|
|
}
|
2020-11-01 13:17:44 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-11-03 15:15:58 +01:00
|
|
|
frigate_config = FrigateConfig(config=config)
|
2020-11-29 22:55:53 +01:00
|
|
|
assert('-re' in frigate_config.cameras['back'].ffmpeg_cmds[0]['cmd'])
|
2021-02-05 14:22:33 +01:00
|
|
|
|
|
|
|
def test_ffmpeg_params_camera(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_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'])
|
|
|
|
|
2020-11-23 15:25:46 +01:00
|
|
|
|
2020-12-23 14:16:37 +01:00
|
|
|
def test_inherit_clips_retention(self):
|
2020-11-23 15:25:46 +01:00
|
|
|
config = {
|
|
|
|
'mqtt': {
|
|
|
|
'host': 'mqtt'
|
|
|
|
},
|
2020-12-23 14:16:37 +01:00
|
|
|
'clips': {
|
2020-11-23 15:25:46 +01:00
|
|
|
'retain': {
|
|
|
|
'default': 20,
|
|
|
|
'objects': {
|
|
|
|
'person': 30
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'cameras': {
|
|
|
|
'back': {
|
|
|
|
'ffmpeg': {
|
2020-11-29 22:55:53 +01:00
|
|
|
'inputs': [
|
|
|
|
{ 'path': 'rtsp://10.0.0.1:554/video', 'roles': ['detect'] }
|
|
|
|
]
|
2020-11-23 15:25:46 +01:00
|
|
|
},
|
|
|
|
'height': 1080,
|
|
|
|
'width': 1920
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
frigate_config = FrigateConfig(config=config)
|
2020-12-23 14:16:37 +01:00
|
|
|
assert(frigate_config.cameras['back'].clips.retain.objects['person'] == 30)
|
2020-11-29 22:55:53 +01:00
|
|
|
|
|
|
|
def test_roles_listed_twice_throws_error(self):
|
|
|
|
config = {
|
|
|
|
'mqtt': {
|
|
|
|
'host': 'mqtt'
|
|
|
|
},
|
2020-12-23 14:16:37 +01:00
|
|
|
'clips': {
|
2020-11-29 22:55:53 +01:00
|
|
|
'retain': {
|
|
|
|
'default': 20,
|
|
|
|
'objects': {
|
|
|
|
'person': 30
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'cameras': {
|
|
|
|
'back': {
|
|
|
|
'ffmpeg': {
|
|
|
|
'inputs': [
|
|
|
|
{ 'path': 'rtsp://10.0.0.1:554/video', 'roles': ['detect'] },
|
|
|
|
{ 'path': 'rtsp://10.0.0.1:554/video2', 'roles': ['detect'] }
|
|
|
|
]
|
|
|
|
},
|
|
|
|
'height': 1080,
|
|
|
|
'width': 1920
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
self.assertRaises(vol.MultipleInvalid, lambda: FrigateConfig(config=config))
|
2020-11-30 02:00:46 +01:00
|
|
|
|
|
|
|
def test_zone_matching_camera_name_throws_error(self):
|
|
|
|
config = {
|
|
|
|
'mqtt': {
|
|
|
|
'host': 'mqtt'
|
|
|
|
},
|
2020-12-23 14:16:37 +01:00
|
|
|
'clips': {
|
2020-11-30 02:00:46 +01:00
|
|
|
'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))
|
2020-12-04 13:59:03 +01:00
|
|
|
|
2020-12-23 14:16:37 +01:00
|
|
|
def test_clips_should_default_to_global_objects(self):
|
2020-12-04 13:59:03 +01:00
|
|
|
config = {
|
|
|
|
'mqtt': {
|
|
|
|
'host': 'mqtt'
|
|
|
|
},
|
2020-12-23 14:16:37 +01:00
|
|
|
'clips': {
|
2020-12-04 13:59:03 +01:00
|
|
|
'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,
|
2020-12-23 14:16:37 +01:00
|
|
|
'clips': {
|
2020-12-04 13:59:03 +01:00
|
|
|
'enabled': True
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
config = FrigateConfig(config=config)
|
2021-01-16 14:39:08 +01:00
|
|
|
assert(config.cameras['back'].clips.objects is None)
|
2020-12-07 15:07:35 +01:00
|
|
|
|
|
|
|
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'] },
|
2021-01-13 13:49:05 +01:00
|
|
|
{ 'path': 'rtsp://10.0.0.1:554/record', 'roles': ['record'] }
|
2020-12-07 15:07:35 +01:00
|
|
|
]
|
|
|
|
},
|
|
|
|
'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'])
|
|
|
|
|
2020-11-01 13:17:44 +01:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main(verbosity=2)
|