refactor: Unify substream actions into substream_{on,off} (#2497)
## Summary
- Collapse `live_substream_{on,off,select}` into a unified
`substream_{on,off}` pair, symmetric with `call_{start,end}`.
- Rename the `camera` field on the former `live_substream_select` to
`stream` (it always was a stream ID).
- Add optional `camera` field to both new actions for targeting a
non-selected base camera.
- YAML configs are migrated automatically; URL bookmarks must be updated
by hand.
## Migration
### Cycling between camera and substream (toggle button)
Before:
```yaml
tap_action:
action: custom:advanced-camera-card-action
advanced_camera_card_action: live_substream_on
```
After:
```yaml
tap_action:
action: custom:advanced-camera-card-action
advanced_camera_card_action: substream_on
```
### Selecting a specific substream
Before:
```yaml
tap_action:
action: custom:advanced-camera-card-action
advanced_camera_card_action: live_substream_select
camera: camera.front_door_hd
```
After:
```yaml
tap_action:
action: custom:advanced-camera-card-action
advanced_camera_card_action: substream_on
stream: camera.front_door_hd
```
### Turning the substream off
Before:
```yaml
tap_action:
action: custom:advanced-camera-card-action
advanced_camera_card_action: live_substream_off
```
After:
```yaml
tap_action:
action: custom:advanced-camera-card-action
advanced_camera_card_action: substream_off
```
### URL querystrings (manual update required)
| Before | After |
| --- | --- |
|
`?advanced-camera-card-action.live_substream_select=camera.front_door_hd`
| `?advanced-camera-card-action.substream_on=camera.front_door_hd` |
This commit is contained in:
committed by
dermotduffy
parent
15e335a647
commit
f18e4cd4b8
@@ -827,6 +827,36 @@ const microphoneConnectedToCallTransform = (data: unknown): boolean => {
|
||||
return true;
|
||||
};
|
||||
|
||||
// Unify the legacy trio `live_substream_{on,off,select}` into the new
|
||||
// `substream_{on,off}` pair. `live_substream_select` carried the substream ID
|
||||
// in its `camera` field; that field becomes `stream` on `substream_on`.
|
||||
const substreamActionsUnifyTransform = (data: RawAdvancedCameraCardConfig): boolean => {
|
||||
if (
|
||||
data['action'] !== 'fire-dom-event' &&
|
||||
data['action'] !== 'custom:advanced-camera-card-action'
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
const action = data['advanced_camera_card_action'];
|
||||
if (action === 'live_substream_on') {
|
||||
data['advanced_camera_card_action'] = 'substream_on';
|
||||
return true;
|
||||
}
|
||||
if (action === 'live_substream_off') {
|
||||
data['advanced_camera_card_action'] = 'substream_off';
|
||||
return true;
|
||||
}
|
||||
if (action === 'live_substream_select') {
|
||||
data['advanced_camera_card_action'] = 'substream_on';
|
||||
if ('camera' in data) {
|
||||
data['stream'] = data['camera'];
|
||||
delete data['camera'];
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
const frigateCardToAdvancedCameraCardStyleTransform = (data: unknown): unknown => {
|
||||
if (typeof data !== 'object' || !data || Array.isArray(data)) {
|
||||
return data;
|
||||
@@ -1051,4 +1081,13 @@ const UPGRADES = [
|
||||
typeof data === 'object' && data ? data[CONF_AUTOMATIONS] : {},
|
||||
);
|
||||
},
|
||||
|
||||
// Unify `live_substream_{on,off,select}` actions. Walked over the entire
|
||||
// tree because card actions can appear anywhere (menu buttons, elements,
|
||||
// automations, view-action handlers, etc.).
|
||||
(data: unknown): boolean => {
|
||||
return upgradeObjectRecursively(substreamActionsUnifyTransform)(
|
||||
typeof data === 'object' && data ? (data as RawAdvancedCameraCardConfig) : {},
|
||||
);
|
||||
},
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user