Skip to content

Commit

Permalink
Merge pull request #1488 from dermotduffy/update-trigger-action
Browse files Browse the repository at this point in the history
Add new `update` trigger action to just update current view dynamically
  • Loading branch information
dermotduffy committed Jul 30, 2024
2 parents 4c73c8f + ef7b4b0 commit db9303c
Show file tree
Hide file tree
Showing 113 changed files with 4,811 additions and 4,491 deletions.
1 change: 1 addition & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
docs/js/
.devcontainer/
2 changes: 1 addition & 1 deletion docs/configuration/profiles.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ Principles used in the selection of options set by `low-profile` profile mode:
- Get 'out of the box' performance similar to the basic "Home Assistant Picture Glance" card.
- Do not break the visual aesthetic of the card.

See the [source code](https://github.com/dermotduffy/frigate-hass-card/blob/dev/src/config/profiles/low-performance.ts) for an exhaustive list of options set by this profile.
See the [source code](https://github.com/dermotduffy/frigate-hass-card/blob/dev/src/config/profiles/low-performance.ts) for an exhaustive list of defaults set by this profile.

## `scrubbing`

Expand Down
67 changes: 45 additions & 22 deletions docs/configuration/view.md

Large diffs are not rendered by default.

11 changes: 6 additions & 5 deletions docs/examples.md
Original file line number Diff line number Diff line change
Expand Up @@ -479,18 +479,19 @@ overrides:
This example changes the default card view from `live` to `image` depending on
the value of the `binary_sensor.alarm_armed` sensor. The override alone will
only change the _default_ when the card next is requested to change to the
default view. By also including the `update_entities` parameter, we ask the card
to trigger a card update based on that entity -- which causes it to use the new
overriden default immediately.
default view. By also including the `view.default_reset.entities` parameter, we
ask the card to trigger a card update based on that entity -- which causes it to
use the new overriden default immediately.

```yaml
type: custom:frigate-card
cameras:
- camera_entity: camera.office
view:
default: live
update_entities:
- binary_sensor.alarm_armed
default_reset:
entities:
- binary_sensor.alarm_armed
overrides:
- conditions:
- condition: state
Expand Down
2 changes: 1 addition & 1 deletion docs/troubleshooting.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ This could be for any number of reasons. Chromecast devices can be quite picky
on network, DNS and certificate issues, as well as audio and video codecs. Check
your Home Assistant log as there may be more information in there.

!>: In particular, for Frigate to support casting of clips, the default ffmpeg
!> In particular, for Frigate to support casting of clips, the default ffmpeg
settings for Frigate must be modified, i.e. Frigate does not encode clips in a
Chromecast compatible format out of the box (specifically: audio must be enabled
in the AAC codec, whether your camera supports audio or not). See the [Frigate
Expand Down
1 change: 1 addition & 0 deletions project.inlang/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
cache
2 changes: 2 additions & 0 deletions rollup.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ const plugins = [
}),
typescript({
sourceMap: dev,
inlineSources: dev,
exclude: ['tests/**/*.test.ts'],
}),
json({ exclude: 'package.json' }),
replace({
Expand Down
3 changes: 1 addition & 2 deletions src/camera-manager/camera.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { CameraConfig } from '../config/types';
import { localize } from '../localize/localize';
import { allPromises } from '../utils/basic';
import {
DestroyCallback,
isTriggeredState,
parseStateChangeTrigger,
subscribeToTrigger,
Expand All @@ -13,8 +14,6 @@ import { CameraManagerEngine } from './engine';
import { CameraNoIDError } from './error';
import { CameraEventCallback } from './types';

type DestroyCallback = () => Promise<void>;

export class Camera {
protected _config: CameraConfig;
protected _engine: CameraManagerEngine;
Expand Down
8 changes: 5 additions & 3 deletions src/card-controller/actions/actions/camera-select.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@ export class CameraSelectAction extends FrigateCardAction<CameraSelectActionConf
const viewOnCameraSelect = config?.view.camera_select ?? 'current';
const targetViewName =
viewOnCameraSelect === 'current' ? view.view : viewOnCameraSelect;
api.getViewManager().setViewByParameters({
viewName: targetViewName,
cameraID: selectCameraID,
await api.getViewManager().setViewByParametersWithNewQuery({
params: {
view: targetViewName,
camera: selectCameraID,
},
failSafe: true,
});
}
Expand Down
6 changes: 5 additions & 1 deletion src/card-controller/actions/actions/display-mode-select.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ import { FrigateCardAction } from './base';

export class DisplayModeSelectAction extends FrigateCardAction<DisplayModeActionConfig> {
public async execute(api: CardActionsAPI): Promise<void> {
await api.getViewManager().setViewWithNewDisplayMode(this._action.display_mode);
await api.getViewManager().setViewByParametersWithNewQuery({
params: {
displayMode: this._action.display_mode,
},
});
}
}
5 changes: 4 additions & 1 deletion src/card-controller/actions/actions/substream-off.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import { GeneralActionConfig } from '../../../config/types';
import { CardActionsAPI } from '../../types';
import { SubstreamOffViewModifier } from '../../view/modifiers/substream-off';
import { FrigateCardAction } from './base';

export class SubstreamOffAction extends FrigateCardAction<GeneralActionConfig> {
public async execute(api: CardActionsAPI): Promise<void> {
api.getViewManager().setViewWithoutSubstream();
api.getViewManager().setViewByParameters({
modifiers: [new SubstreamOffViewModifier()],
});
}
}
5 changes: 4 additions & 1 deletion src/card-controller/actions/actions/substream-on.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import { GeneralActionConfig } from '../../../config/types';
import { CardActionsAPI } from '../../types';
import { SubstreamOnViewModifier } from '../../view/modifiers/substream-on';
import { FrigateCardAction } from './base';

export class SubstreamOnAction extends FrigateCardAction<GeneralActionConfig> {
public async execute(api: CardActionsAPI): Promise<void> {
api.getViewManager().setViewWithSubstream();
api.getViewManager().setViewByParameters({
modifiers: [new SubstreamOnViewModifier(api)],
});
}
}
5 changes: 4 additions & 1 deletion src/card-controller/actions/actions/substream-select.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import { SubstreamSelectActionConfig } from '../../../config/types';
import { CardActionsAPI } from '../../types';
import { SubstreamSelectViewModifier } from '../../view/modifiers/substream-select';
import { FrigateCardAction } from './base';

export class SubstreamSelectAction extends FrigateCardAction<SubstreamSelectActionConfig> {
public async execute(api: CardActionsAPI): Promise<void> {
api.getViewManager().setViewWithSubstream(this._action.camera);
api.getViewManager().setViewByParameters({
modifiers: [new SubstreamSelectViewModifier(this._action.camera)],
});
}
}
11 changes: 4 additions & 7 deletions src/card-controller/actions/actions/view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,10 @@ import { FrigateCardAction } from './base';

export class ViewAction extends FrigateCardAction<ViewActionConfig> {
public async execute(api: CardActionsAPI): Promise<void> {
api.getViewManager().setViewByParameters({
viewName: this._action.frigate_card_action,

// Note: This function needs to process (view-related) commands even when
// _view has not yet been initialized (since it may be used to set a view
// via the querystring).
cameraID: api.getViewManager().getView()?.camera,
api.getViewManager().setViewByParametersWithNewQuery({
params: {
view: this._action.frigate_card_action,
},
});
}
}
42 changes: 0 additions & 42 deletions src/card-controller/auto-update-manager.ts

This file was deleted.

20 changes: 15 additions & 5 deletions src/card-controller/card-element-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ export class CardElementManager {
this._api.getMediaLoadedInfoManager().initialize();
this._api.getMicrophoneManager().initialize();
this._api.getKeyboardStateManager().initialize();
this._api.getDefaultManager().initialize();

// Whether or not the card is in panel mode on the dashboard.
setOrRemoveAttribute(this._element, isCardInPanel(this._element), 'panel');
Expand All @@ -78,6 +79,10 @@ export class CardElementManager {
'mousemove',
this._api.getInteractionManager().reportInteraction,
);
this._element.addEventListener(
'wheel',
this._api.getInteractionManager().reportInteraction,
);
this._element.addEventListener(
'll-custom',
this._api.getActionsManager().handleCustomActionEvent,
Expand Down Expand Up @@ -123,15 +128,20 @@ export class CardElementManager {
this._api.getFullscreenManager().disconnect();
this._api.getKeyboardStateManager().uninitialize();
this._api.getActionsManager().uninitialize();
this._api.getDefaultManager().uninitialize();

// Uninitialize cameras to cause them to reinitialize on
// reconnection, to ensure the state subscription/unsubscription works
// correctly for triggers.
this._api.getInitializationManager().uninitialize(InitializationAspect.CAMERAS),
this._element.removeEventListener(
'mousemove',
this._api.getInteractionManager().reportInteraction,
);
this._api.getInitializationManager().uninitialize(InitializationAspect.CAMERAS);
this._element.removeEventListener(
'mousemove',
this._api.getInteractionManager().reportInteraction,
);
this._element.removeEventListener(
'wheel',
this._api.getInteractionManager().reportInteraction,
);
this._element.removeEventListener(
'll-custom',
this._api.getActionsManager().handleCustomActionEvent,
Expand Down
12 changes: 12 additions & 0 deletions src/card-controller/config/config-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,18 @@ export class ConfigManager {
.uninitialize(InitializationAspect.MICROPHONE_CONNECT);
}

if (
previousConfig &&
!isEqual(
previousConfig?.view.default_reset,
this._overriddenConfig?.view.default_reset,
)
) {
this._api
.getInitializationManager()
.uninitialize(InitializationAspect.DEFAULT_RESET);
}

this._api.getCardElementManager().update();
}
}
19 changes: 10 additions & 9 deletions src/card-controller/controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { EntityRegistryManager } from '../utils/ha/entity-registry';
import { EntityCache } from '../utils/ha/entity-registry/cache';
import { ResolvedMediaCache } from '../utils/ha/resolved-media';
import { ActionsManager } from './actions/actions-manager';
import { AutoUpdateManager } from './auto-update-manager';
import { DefaultManager } from './default-manager';
import { AutomationsManager } from './automations-manager';
import { CameraURLManager } from './camera-url-manager';
import {
Expand All @@ -32,12 +32,12 @@ import { StyleManager } from './style-manager';
import { TriggersManager } from './triggers-manager';
import {
CardActionsManagerAPI,
CardAutoRefreshAPI,
CardAutomationsAPI,
CardCameraAPI,
CardCameraURLAPI,
CardConditionAPI,
CardConfigAPI,
CardDefaultManagerAPI,
CardDownloadAPI,
CardElementAPI,
CardExpandAPI,
Expand All @@ -55,18 +55,18 @@ import {
CardTriggersAPI,
CardViewAPI,
} from './types';
import { ViewManager } from './view-manager';
import { ViewManager } from './view/view-manager';
import { KeyboardStateManager } from './keyboard-state-manager';

export class CardController
implements
CardActionsManagerAPI,
CardAutomationsAPI,
CardAutoRefreshAPI,
CardCameraAPI,
CardCameraURLAPI,
CardConditionAPI,
CardConfigAPI,
CardDefaultManagerAPI,
CardDownloadAPI,
CardElementAPI,
CardExpandAPI,
Expand All @@ -92,12 +92,12 @@ export class CardController

protected _actionsManager = new ActionsManager(this);
protected _automationsManager = new AutomationsManager(this);
protected _autoUpdateManager = new AutoUpdateManager(this);
protected _cameraManager = new CameraManager(this);
protected _cameraURLManager = new CameraURLManager(this);
protected _cardElementManager: CardElementManager;
protected _conditionsManager: ConditionsManager;
protected _configManager = new ConfigManager(this);
protected _defaultManager = new DefaultManager(this);
protected _downloadManager = new DownloadManager(this);
protected _expandManager = new ExpandManager(this);
protected _fullscreenManager = new FullscreenManager(this);
Expand Down Expand Up @@ -143,10 +143,6 @@ export class CardController
return this._automationsManager;
}

public getAutoUpdateManager(): AutoUpdateManager {
return this._autoUpdateManager;
}

public getCameraManager(): CameraManager {
return this._cameraManager;
}
Expand All @@ -171,6 +167,11 @@ export class CardController
public getConfigManager(): ConfigManager {
return this._configManager;
}

public getDefaultManager(): DefaultManager {
return this._defaultManager;
}

public getDownloadManager(): DownloadManager {
return this._downloadManager;
}
Expand Down
Loading

0 comments on commit db9303c

Please sign in to comment.