fix: Improve 2-way audio detection (#2293)

- For Frigate cameras, you must be running at least [integration
v5.12.0](https://github.com/blakeblackshear/frigate-hass-integration/releases/tag/v5.12.0).
 - Closes: #2191 

Includes a significant refactor of cameras, and the introduction of a
`2-way-audio` capability that is dynamically fetched from `go2rtc`. One
gotcha is if you previously had a substream with 2-way audio, you may
need to modify

```yaml
 - camera_entity: camera.foo
    capabilities:
      disable_except:
        - substream
```

... to ...

```yaml
 - camera_entity: camera.foo
    capabilities:
      disable_except:
        - substream
        - 2-way-audio
```
This commit is contained in:
Dermot Duffy
2025-12-20 13:06:09 -08:00
committed by GitHub
parent 588ed6c98a
commit 1e821f09c6
47 changed files with 2240 additions and 958 deletions
+14 -10
View File
@@ -88,12 +88,18 @@ export const createConfig = (
return advancedCameraCardConfigSchema.parse(createRawConfig(config));
};
export const createCamera = (
export const createInitializedCamera = async (
config: CameraConfig,
engine: CameraManagerEngine,
capabilities?: Capabilities,
): Camera => {
return new Camera(config, engine, { capabilities: capabilities });
): Promise<Camera> => {
const camera = new Camera(config, engine);
await camera.initialize({
hass: createHASS(),
stateWatcher: mock<StateWatcherSubscriptionInterface>(),
...(capabilities ? { capabilityOptions: { capabilities } } : {}),
});
return camera;
};
export const createHASS = (states?: HassEntities, user?: CurrentUser): HomeAssistant => {
@@ -215,6 +221,10 @@ export const createStore = (
const store = new CameraManagerStore();
for (const cameraProps of cameras ?? []) {
const eventCallback = cameraProps.eventCallback ?? vi.fn();
const capabilities =
cameraProps.capabilities === undefined
? createCapabilities()
: cameraProps.capabilities ?? undefined;
const camera = new Camera(
cameraProps.config ?? createCameraConfig(),
cameraProps.engine ??
@@ -222,13 +232,7 @@ export const createStore = (
mock<StateWatcherSubscriptionInterface>(),
eventCallback,
),
{
capabilities:
cameraProps.capabilities === undefined
? createCapabilities()
: cameraProps.capabilities ?? undefined,
eventCallback: eventCallback,
},
{ eventCallback, capabilities },
);
camera.setID(cameraProps.cameraID);
store.addCamera(camera);