Prevent recordings from being turned on if disabled in config (#6444)

* Prevent enabling recordings if not enabled in config

* Fix conflict

* Fix spacing

* Update wording

* Update wording

---------

Co-authored-by: Blake Blackshear <blakeb@blakeshome.com>
This commit is contained in:
Nicolas Mowen 2023-05-15 06:36:26 -06:00 committed by GitHub
parent 305323c9e9
commit 5951a740d2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 24 additions and 10 deletions

View File

@ -180,6 +180,12 @@ class Dispatcher:
record_settings = self.config.cameras[camera_name].record record_settings = self.config.cameras[camera_name].record
if payload == "ON": if payload == "ON":
if not self.config.cameras[camera_name].record.enabled_in_config:
logger.error(
f"Recordings must be enabled in the config to be turned on via MQTT."
)
return
if not record_settings.enabled: if not record_settings.enabled:
logger.info(f"Turning on recordings for {camera_name}") logger.info(f"Turning on recordings for {camera_name}")
record_settings.enabled = True record_settings.enabled = True

View File

@ -172,6 +172,9 @@ class RecordConfig(FrigateBaseModel):
events: EventsConfig = Field( events: EventsConfig = Field(
default_factory=EventsConfig, title="Event specific settings." default_factory=EventsConfig, title="Event specific settings."
) )
enabled_in_config: Optional[bool] = Field(
title="Keep track of original state of recording."
)
class MotionConfig(FrigateBaseModel): class MotionConfig(FrigateBaseModel):
@ -952,6 +955,9 @@ class FrigateConfig(FrigateBaseModel):
for input in camera_config.ffmpeg.inputs: for input in camera_config.ffmpeg.inputs:
input.path = input.path.format(**FRIGATE_ENV_VARS) input.path = input.path.format(**FRIGATE_ENV_VARS)
# set config recording value
camera_config.record.enabled_in_config = camera_config.record.enabled
# Add default filters # Add default filters
object_keys = camera_config.objects.track object_keys = camera_config.objects.track
if camera_config.objects.filters is None: if camera_config.objects.filters is None:

View File

@ -16,7 +16,7 @@ export const handlers = [
front: { front: {
name: 'front', name: 'front',
objects: { track: ['taco', 'cat', 'dog'] }, objects: { track: ['taco', 'cat', 'dog'] },
record: { enabled: true }, record: { enabled: true, enabled_in_config: true },
detect: { width: 1280, height: 720 }, detect: { width: 1280, height: 720 },
snapshots: {}, snapshots: {},
restream: { enabled: true, jsmpeg: { height: 720 } }, restream: { enabled: true, jsmpeg: { height: 720 } },
@ -25,7 +25,7 @@ export const handlers = [
side: { side: {
name: 'side', name: 'side',
objects: { track: ['taco', 'cat', 'dog'] }, objects: { track: ['taco', 'cat', 'dog'] },
record: { enabled: false }, record: { enabled: false, enabled_in_config: true },
detect: { width: 1280, height: 720 }, detect: { width: 1280, height: 720 },
snapshots: {}, snapshots: {},
restream: { enabled: true, jsmpeg: { height: 720 } }, restream: { enabled: true, jsmpeg: { height: 720 } },

View File

@ -16,12 +16,12 @@ export default function Cameras() {
<ActivityIndicator /> <ActivityIndicator />
) : ( ) : (
<div className="grid grid-cols-1 3xl:grid-cols-3 md:grid-cols-2 gap-4 p-2 px-4"> <div className="grid grid-cols-1 3xl:grid-cols-3 md:grid-cols-2 gap-4 p-2 px-4">
<SortedCameras unsortedCameras={config.cameras} /> <SortedCameras config={config} unsortedCameras={config.cameras} />
</div> </div>
); );
} }
function SortedCameras({ unsortedCameras }) { function SortedCameras({ config, unsortedCameras }) {
const sortedCameras = useMemo( const sortedCameras = useMemo(
() => () =>
Object.entries(unsortedCameras) Object.entries(unsortedCameras)
@ -33,13 +33,13 @@ function SortedCameras({ unsortedCameras }) {
return ( return (
<Fragment> <Fragment>
{sortedCameras.map(([camera, conf]) => ( {sortedCameras.map(([camera, conf]) => (
<Camera key={camera} name={camera} conf={conf} /> <Camera key={camera} name={camera} config={config.cameras[camera]} conf={conf} />
))} ))}
</Fragment> </Fragment>
); );
} }
function Camera({ name }) { function Camera({ name, config }) {
const { payload: detectValue, send: sendDetect } = useDetectState(name); const { payload: detectValue, send: sendDetect } = useDetectState(name);
const { payload: recordValue, send: sendRecordings } = useRecordingsState(name); const { payload: recordValue, send: sendRecordings } = useRecordingsState(name);
const { payload: snapshotValue, send: sendSnapshots } = useSnapshotsState(name); const { payload: snapshotValue, send: sendSnapshots } = useSnapshotsState(name);
@ -65,11 +65,13 @@ function Camera({ name }) {
}, },
}, },
{ {
name: `Toggle recordings ${recordValue === 'ON' ? 'off' : 'on'}`, name: config.record.enabled_in_config ? `Toggle recordings ${recordValue === 'ON' ? 'off' : 'on'}` : 'Recordings must be enabled in the config to be turned on in the UI.',
icon: ClipIcon, icon: ClipIcon,
color: recordValue === 'ON' ? 'blue' : 'gray', color: config.record.enabled_in_config ? (recordValue === 'ON' ? 'blue' : 'gray') : 'red',
onClick: () => { onClick: () => {
if (config.record.enabled_in_config) {
sendRecordings(recordValue === 'ON' ? 'OFF' : 'ON', true); sendRecordings(recordValue === 'ON' ? 'OFF' : 'ON', true);
}
}, },
}, },
{ {
@ -81,7 +83,7 @@ function Camera({ name }) {
}, },
}, },
], ],
[detectValue, sendDetect, recordValue, sendRecordings, snapshotValue, sendSnapshots] [config, detectValue, sendDetect, recordValue, sendRecordings, snapshotValue, sendSnapshots]
); );
return ( return (