Add max_simultaneous_engine_requests parameter

This commit is contained in:
Dermot Duffy
2024-08-26 19:57:55 -07:00
parent 5844a034e5
commit 0403441e07
12 changed files with 44 additions and 8 deletions
+19 -4
View File
@@ -112,6 +112,7 @@ export class CameraManager {
protected _engineFactory: CameraManagerEngineFactory;
protected _store: CameraManagerStore;
protected _initializationLimit = new PQueue({ concurrency: 1 });
protected _requestLimit = new PQueue();
constructor(
api: CardCameraAPI,
@@ -135,6 +136,9 @@ export class CameraManager {
return false;
}
this._requestLimit.concurrency =
config.performance.features.max_simultaneous_engine_requests ?? Infinity;
// For each camera merge the config (which has no defaults) into the camera
// global config (which does have defaults). The merging must happen in this
// order, to ensure that the defaults in the cameras global config do not
@@ -535,7 +539,10 @@ export class CameraManager {
}
const queryStartTime = new Date();
await engine.favoriteMedia(hass, cameraConfig, media, favorite);
await this._requestLimit.add(() =>
engine.favoriteMedia(hass, cameraConfig, media, favorite),
);
log(
this._api.getConfigManager().getCardWideConfig(),
@@ -590,7 +597,11 @@ export class CameraManager {
return null;
}
return await engine.getMediaSeekTime(hass, this._store, media, target);
return (
(await this._requestLimit.add(() =>
engine.getMediaSeekTime(hass, this._store, media, target),
)) ?? null
);
}
protected async _handleQuery<QT extends DataQuery>(
@@ -653,7 +664,9 @@ export class CameraManager {
}
await Promise.all(
Array.from(engines.keys()).map((engine) =>
processEngineQuery(engine, { ...query, cameraIDs: engines.get(engine) }),
this._requestLimit.add(() =>
processEngineQuery(engine, { ...query, cameraIDs: engines.get(engine) }),
),
),
);
};
@@ -789,6 +802,8 @@ export class CameraManager {
if (!engine || !hass) {
return;
}
return await engine.executePTZAction(hass, cameraConfig, action, options);
return await this._requestLimit.add(() =>
engine.executePTZAction(hass, cameraConfig, action, options),
);
}
}
+4
View File
@@ -35,6 +35,7 @@ import {
CONF_MENU_BUTTONS_TIMELINE,
CONF_MENU_STYLE,
CONF_PERFORMANCE_FEATURES_ANIMATED_PROGRESS_INDICATOR,
CONF_PERFORMANCE_FEATURES_MAX_SIMULTANEOUS_ENGINE_REQUESTS,
CONF_PERFORMANCE_FEATURES_MEDIA_CHUNK_SIZE,
CONF_PERFORMANCE_STYLE_BORDER_RADIUS,
CONF_PERFORMANCE_STYLE_BOX_SHADOW,
@@ -137,4 +138,7 @@ export const LOW_PERFORMANCE_PROFILE = {
// No trigger actions.
[CONF_VIEW_TRIGGERS_ACTIONS_TRIGGER]: 'none',
// One engine request at a time.
[CONF_PERFORMANCE_FEATURES_MAX_SIMULTANEOUS_ENGINE_REQUESTS]: 1,
};
+1
View File
@@ -1913,6 +1913,7 @@ export const performanceConfigSchema = z
.min(0)
.max(MEDIA_CHUNK_SIZE_MAX)
.default(performanceConfigDefault.features.media_chunk_size),
max_simultaneous_engine_requests: z.number().min(1).optional(),
})
.default(performanceConfigDefault.features),
style: z
+1
View File
@@ -348,6 +348,7 @@ export const CONF_OVERRIDES = 'overrides' as const;
const CONF_PERFORMANCE = 'performance' as const;
export const CONF_PERFORMANCE_FEATURES_ANIMATED_PROGRESS_INDICATOR = `${CONF_PERFORMANCE}.features.animated_progress_indicator`;
export const CONF_PERFORMANCE_FEATURES_MEDIA_CHUNK_SIZE = `${CONF_PERFORMANCE}.features.media_chunk_size`;
export const CONF_PERFORMANCE_FEATURES_MAX_SIMULTANEOUS_ENGINE_REQUESTS = `${CONF_PERFORMANCE}.features.max_simultaneous_engine_requests`;
export const CONF_PERFORMANCE_PROFILE = `${CONF_PERFORMANCE}.profile`;
export const CONF_PERFORMANCE_STYLE_BOX_SHADOW = `${CONF_PERFORMANCE}.style.box_shadow`;
export const CONF_PERFORMANCE_STYLE_BORDER_RADIUS = `${CONF_PERFORMANCE}.style.border_radius`;
+7
View File
@@ -171,6 +171,7 @@ import {
CONF_MENU_POSITION,
CONF_MENU_STYLE,
CONF_PERFORMANCE_FEATURES_ANIMATED_PROGRESS_INDICATOR,
CONF_PERFORMANCE_FEATURES_MAX_SIMULTANEOUS_ENGINE_REQUESTS,
CONF_PERFORMANCE_FEATURES_MEDIA_CHUNK_SIZE,
CONF_PERFORMANCE_PROFILE,
CONF_PERFORMANCE_STYLE_BORDER_RADIUS,
@@ -2790,6 +2791,12 @@ export class FrigateCardEditor extends LitElement implements LovelaceCardEditor
${this._renderNumberInput(CONF_PERFORMANCE_FEATURES_MEDIA_CHUNK_SIZE, {
max: MEDIA_CHUNK_SIZE_MAX,
})}
${this._renderNumberInput(
CONF_PERFORMANCE_FEATURES_MAX_SIMULTANEOUS_ENGINE_REQUESTS,
{
min: 1,
},
)}
`,
)}
${this._putInSubmenu(
+1
View File
@@ -401,6 +401,7 @@
"features": {
"animated_progress_indicator": "Indicador animat del progrés",
"editor_label": "Opcions de característiques",
"max_simultaneous_engine_requests": "",
"media_chunk_size": "Mida del fragment multimèdia"
},
"style": {
+1
View File
@@ -401,6 +401,7 @@
"features": {
"animated_progress_indicator": "Animated Progress Indicator",
"editor_label": "Feature Options",
"max_simultaneous_engine_requests": "Max simultaneous camera engine requests",
"media_chunk_size": "Media chunk size"
},
"style": {
+1
View File
@@ -401,6 +401,7 @@
"features": {
"animated_progress_indicator": "Indicateur de progression animé",
"editor_label": "Options de fonctionnalités",
"max_simultaneous_engine_requests": "",
"media_chunk_size": "Taille du morceau de média"
},
"style": {
+1
View File
@@ -401,6 +401,7 @@
"features": {
"animated_progress_indicator": "Indicatore di avanzamento animato",
"editor_label": "Opzioni funzionalità",
"max_simultaneous_engine_requests": "",
"media_chunk_size": "Dimensione del blocco multimediale"
},
"style": {
+1
View File
@@ -401,6 +401,7 @@
"features": {
"animated_progress_indicator": "Indicador de Carregamento Animado",
"editor_label": "Opções de recursos",
"max_simultaneous_engine_requests": "",
"media_chunk_size": "Tamanho do bloco de mídia"
},
"style": {
+1
View File
@@ -401,6 +401,7 @@
"features": {
"animated_progress_indicator": "Animação na barra de progresso",
"editor_label": "Editor de etiquetas",
"max_simultaneous_engine_requests": "",
"media_chunk_size": "Tamanho do ficheiro"
},
"style": {