homebridge-sonos-scenes 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -0
- package/config.schema.json +44 -0
- package/dist/src/cloud/brokerClient.d.ts +17 -0
- package/dist/src/cloud/brokerClient.js +57 -0
- package/dist/src/cloud/brokerClient.js.map +1 -0
- package/dist/src/config.js +31 -1
- package/dist/src/config.js.map +1 -1
- package/dist/src/types.d.ts +13 -0
- package/docs/cloud-broker.md +141 -0
- package/examples/config.example.json +10 -0
- package/homebridge-ui/public/index.html +96 -20
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -39,6 +39,8 @@ homebridge-ui/
|
|
|
39
39
|
examples/
|
|
40
40
|
config.example.json
|
|
41
41
|
sample-topology.json
|
|
42
|
+
docs/
|
|
43
|
+
cloud-broker.md
|
|
42
44
|
test/
|
|
43
45
|
```
|
|
44
46
|
|
|
@@ -84,6 +86,17 @@ The Homebridge project’s verified-plugin guidance also expects the plugin to b
|
|
|
84
86
|
- `tv` source loading is disabled by default and remains transport-gated.
|
|
85
87
|
- Favorites rely on URIs exposed through the local transport; some complex favorite types may need more transport-specific handling later.
|
|
86
88
|
|
|
89
|
+
## Local Only Vs Local + Cloud
|
|
90
|
+
|
|
91
|
+
The intended product shape is now:
|
|
92
|
+
|
|
93
|
+
- `local_only`: today’s supported mode. It keeps discovery, grouping, line-in, TV, and directly playable favorites on the local Sonos path.
|
|
94
|
+
- `local_plus_cloud`: a future mode for users who choose to run their own Sonos cloud broker for favorites and playlists that are not reliable over the local path.
|
|
95
|
+
|
|
96
|
+
This project does not host that broker for users. The goal is an optional self-hosted companion service, not a shared multi-tenant cloud run by the plugin maintainer.
|
|
97
|
+
|
|
98
|
+
The config model already reserves a `cloud` section so advanced users and future versions do not need a breaking config redesign later. The broker contract is documented in [docs/cloud-broker.md](docs/cloud-broker.md).
|
|
99
|
+
|
|
87
100
|
## Official Sonos References
|
|
88
101
|
|
|
89
102
|
These docs informed the product boundaries and future cloud-adapter shape:
|
|
@@ -99,5 +112,6 @@ These docs informed the product boundaries and future cloud-adapter shape:
|
|
|
99
112
|
## Current Gaps
|
|
100
113
|
|
|
101
114
|
- The local transport is MVP-level and best-effort for advanced favorites and TV input handling.
|
|
115
|
+
- The `local_plus_cloud` mode is a planned architecture boundary only; the self-hosted broker contract is documented, but broker-backed playback is not wired into the runtime yet.
|
|
102
116
|
- Subscription-driven refresh is still represented by the transport abstraction, but not yet fully wired for live event propagation.
|
|
103
117
|
- `npm audit` currently reports a high-severity advisory in the transitive `ip` dependency pulled in by `sonos`.
|
package/config.schema.json
CHANGED
|
@@ -73,6 +73,50 @@
|
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
},
|
|
76
|
+
"cloud": {
|
|
77
|
+
"title": "Cloud",
|
|
78
|
+
"type": "object",
|
|
79
|
+
"properties": {
|
|
80
|
+
"mode": {
|
|
81
|
+
"title": "Control Mode",
|
|
82
|
+
"type": "string",
|
|
83
|
+
"default": "local_only",
|
|
84
|
+
"oneOf": [
|
|
85
|
+
"local_only",
|
|
86
|
+
"local_plus_cloud"
|
|
87
|
+
]
|
|
88
|
+
},
|
|
89
|
+
"broker": {
|
|
90
|
+
"title": "Broker",
|
|
91
|
+
"type": "object",
|
|
92
|
+
"properties": {
|
|
93
|
+
"url": {
|
|
94
|
+
"title": "Broker URL",
|
|
95
|
+
"type": "string"
|
|
96
|
+
},
|
|
97
|
+
"apiKey": {
|
|
98
|
+
"title": "Broker API Key",
|
|
99
|
+
"type": "string"
|
|
100
|
+
},
|
|
101
|
+
"timeoutMs": {
|
|
102
|
+
"title": "Broker Timeout (ms)",
|
|
103
|
+
"type": "integer",
|
|
104
|
+
"default": 8000
|
|
105
|
+
},
|
|
106
|
+
"routeFavorites": {
|
|
107
|
+
"title": "Route Favorites Through Broker",
|
|
108
|
+
"type": "boolean",
|
|
109
|
+
"default": true
|
|
110
|
+
},
|
|
111
|
+
"routePlaylists": {
|
|
112
|
+
"title": "Route Playlists Through Broker",
|
|
113
|
+
"type": "boolean",
|
|
114
|
+
"default": true
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
},
|
|
76
120
|
"scenes": {
|
|
77
121
|
"title": "Scenes",
|
|
78
122
|
"type": "array",
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { CloudBrokerConfig } from "../types";
|
|
2
|
+
export type CloudBrokerFeature = "favorites" | "playlists";
|
|
3
|
+
export interface CloudBrokerStatus {
|
|
4
|
+
ok: boolean;
|
|
5
|
+
name?: string;
|
|
6
|
+
version?: string;
|
|
7
|
+
features: CloudBrokerFeature[];
|
|
8
|
+
docsUrl?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class CloudBrokerClient {
|
|
11
|
+
private readonly config;
|
|
12
|
+
constructor(config: CloudBrokerConfig);
|
|
13
|
+
get configured(): boolean;
|
|
14
|
+
get baseUrl(): string | undefined;
|
|
15
|
+
getStatus(): Promise<CloudBrokerStatus>;
|
|
16
|
+
private request;
|
|
17
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CloudBrokerClient = void 0;
|
|
4
|
+
function trimTrailingSlash(value) {
|
|
5
|
+
return value.replace(/\/+$/g, "");
|
|
6
|
+
}
|
|
7
|
+
class CloudBrokerClient {
|
|
8
|
+
config;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.config = config;
|
|
11
|
+
}
|
|
12
|
+
get configured() {
|
|
13
|
+
return typeof this.config.url === "string" && this.config.url.trim().length > 0;
|
|
14
|
+
}
|
|
15
|
+
get baseUrl() {
|
|
16
|
+
if (!this.configured) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
return trimTrailingSlash(this.config.url.trim());
|
|
20
|
+
}
|
|
21
|
+
async getStatus() {
|
|
22
|
+
return this.request("/v1/status", {
|
|
23
|
+
method: "GET",
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
async request(path, init) {
|
|
27
|
+
if (!this.baseUrl) {
|
|
28
|
+
throw new Error("No cloud broker URL is configured.");
|
|
29
|
+
}
|
|
30
|
+
const controller = new AbortController();
|
|
31
|
+
const timeout = setTimeout(() => controller.abort(), this.config.timeoutMs);
|
|
32
|
+
try {
|
|
33
|
+
const response = await fetch(`${this.baseUrl}${path}`, {
|
|
34
|
+
...init,
|
|
35
|
+
headers: {
|
|
36
|
+
Accept: "application/json",
|
|
37
|
+
...(this.config.apiKey
|
|
38
|
+
? {
|
|
39
|
+
Authorization: `Bearer ${this.config.apiKey}`,
|
|
40
|
+
}
|
|
41
|
+
: {}),
|
|
42
|
+
...init.headers,
|
|
43
|
+
},
|
|
44
|
+
signal: controller.signal,
|
|
45
|
+
});
|
|
46
|
+
if (!response.ok) {
|
|
47
|
+
throw new Error(`Cloud broker request failed: ${response.status} ${response.statusText}`);
|
|
48
|
+
}
|
|
49
|
+
return await response.json();
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
clearTimeout(timeout);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.CloudBrokerClient = CloudBrokerClient;
|
|
57
|
+
//# sourceMappingURL=brokerClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brokerClient.js","sourceRoot":"","sources":["../../../src/cloud/brokerClient.ts"],"names":[],"mappings":";;;AAYA,SAAS,iBAAiB,CAAC,KAAa;IACtC,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,MAAa,iBAAiB;IACC;IAA7B,YAA6B,MAAyB;QAAzB,WAAM,GAAN,MAAM,CAAmB;IAAG,CAAC;IAE1D,IAAI,UAAU;QACZ,OAAO,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,OAAO;QACT,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,OAAO,CAAoB,YAAY,EAAE;YACnD,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,IAAY,EAAE,IAAiB;QACtD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAE5E,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;gBACrD,GAAG,IAAI;gBACP,OAAO,EAAE;oBACP,MAAM,EAAE,kBAAkB;oBAC1B,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;wBACpB,CAAC,CAAC;4BACE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;yBAC9C;wBACH,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,IAAI,CAAC,OAAO;iBAChB;gBACD,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAC5F,CAAC;YAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAO,CAAC;QACpC,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;CACF;AArDD,8CAqDC"}
|
package/dist/src/config.js
CHANGED
|
@@ -15,12 +15,25 @@ const DEFAULT_TRANSPORT = {
|
|
|
15
15
|
requestTimeoutMs: 5000,
|
|
16
16
|
allowTvSource: false,
|
|
17
17
|
};
|
|
18
|
+
const DEFAULT_CLOUD_BROKER = {
|
|
19
|
+
timeoutMs: 8000,
|
|
20
|
+
routeFavorites: true,
|
|
21
|
+
routePlaylists: true,
|
|
22
|
+
};
|
|
23
|
+
const DEFAULT_CLOUD = {
|
|
24
|
+
mode: "local_only",
|
|
25
|
+
broker: { ...DEFAULT_CLOUD_BROKER },
|
|
26
|
+
};
|
|
18
27
|
function createDefaultPlatformConfig() {
|
|
19
28
|
return {
|
|
20
29
|
platform: types_1.PLATFORM_NAME,
|
|
21
30
|
name: "Sonos Scenes",
|
|
22
31
|
logLevel: "info",
|
|
23
32
|
transport: { ...DEFAULT_TRANSPORT },
|
|
33
|
+
cloud: {
|
|
34
|
+
mode: DEFAULT_CLOUD.mode,
|
|
35
|
+
broker: { ...DEFAULT_CLOUD.broker },
|
|
36
|
+
},
|
|
24
37
|
scenes: [],
|
|
25
38
|
};
|
|
26
39
|
}
|
|
@@ -134,6 +147,22 @@ function normalizePlatformConfig(config) {
|
|
|
134
147
|
...(config?.transport ?? {}),
|
|
135
148
|
kind: "local",
|
|
136
149
|
};
|
|
150
|
+
const cloud = {
|
|
151
|
+
mode: config?.cloud?.mode === "local_plus_cloud" ? "local_plus_cloud" : "local_only",
|
|
152
|
+
broker: {
|
|
153
|
+
...DEFAULT_CLOUD_BROKER,
|
|
154
|
+
...(config?.cloud?.broker ?? {}),
|
|
155
|
+
url: typeof config?.cloud?.broker?.url === "string" ? config.cloud.broker.url.trim() : undefined,
|
|
156
|
+
apiKey: typeof config?.cloud?.broker?.apiKey === "string" ? config.cloud.broker.apiKey.trim() : undefined,
|
|
157
|
+
timeoutMs: Math.max(1000, asNumber(config?.cloud?.broker?.timeoutMs, DEFAULT_CLOUD_BROKER.timeoutMs)),
|
|
158
|
+
routeFavorites: typeof config?.cloud?.broker?.routeFavorites === "boolean"
|
|
159
|
+
? config.cloud.broker.routeFavorites
|
|
160
|
+
: DEFAULT_CLOUD_BROKER.routeFavorites,
|
|
161
|
+
routePlaylists: typeof config?.cloud?.broker?.routePlaylists === "boolean"
|
|
162
|
+
? config.cloud.broker.routePlaylists
|
|
163
|
+
: DEFAULT_CLOUD_BROKER.routePlaylists,
|
|
164
|
+
},
|
|
165
|
+
};
|
|
137
166
|
return {
|
|
138
167
|
...defaults,
|
|
139
168
|
...config,
|
|
@@ -147,6 +176,7 @@ function normalizePlatformConfig(config) {
|
|
|
147
176
|
: defaults.logLevel,
|
|
148
177
|
defaultHouseholdId: typeof config?.defaultHouseholdId === "string" ? config.defaultHouseholdId : undefined,
|
|
149
178
|
transport,
|
|
179
|
+
cloud,
|
|
150
180
|
scenes: Array.isArray(config?.scenes) ? config.scenes.map((scene) => normalizeScene(scene)) : [],
|
|
151
181
|
};
|
|
152
182
|
}
|
|
@@ -187,7 +217,7 @@ function validateSource(scene, household, transport, result) {
|
|
|
187
217
|
}
|
|
188
218
|
if (favorite.playable === false) {
|
|
189
219
|
result.errors.push(favorite.unsupportedReason
|
|
190
|
-
?? `Favorite "${favorite.name}" is not playable through the active local transport.`);
|
|
220
|
+
?? `Favorite "${favorite.name}" is not playable through the active local transport. Use Local Only scenes for line-in and directly playable favorites, or add a Sonos cloud broker in a future Local + Cloud setup.`);
|
|
191
221
|
}
|
|
192
222
|
return;
|
|
193
223
|
}
|
package/dist/src/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/src/types.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export declare const PLATFORM_NAME = "SonosScenes";
|
|
|
4
4
|
export type LogLevel = "debug" | "info" | "warn" | "error";
|
|
5
5
|
export type SceneSourceKind = "favorite" | "line_in" | "tv";
|
|
6
6
|
export type SceneTrigger = "on" | "off" | "test";
|
|
7
|
+
export type CloudControlMode = "local_only" | "local_plus_cloud";
|
|
7
8
|
export interface FavoriteSource {
|
|
8
9
|
kind: "favorite";
|
|
9
10
|
favoriteId: string;
|
|
@@ -56,12 +57,24 @@ export interface LocalTransportConfig {
|
|
|
56
57
|
requestTimeoutMs: number;
|
|
57
58
|
allowTvSource: boolean;
|
|
58
59
|
}
|
|
60
|
+
export interface CloudBrokerConfig {
|
|
61
|
+
url?: string;
|
|
62
|
+
apiKey?: string;
|
|
63
|
+
timeoutMs: number;
|
|
64
|
+
routeFavorites: boolean;
|
|
65
|
+
routePlaylists: boolean;
|
|
66
|
+
}
|
|
67
|
+
export interface SonosCloudConfig {
|
|
68
|
+
mode: CloudControlMode;
|
|
69
|
+
broker: CloudBrokerConfig;
|
|
70
|
+
}
|
|
59
71
|
export interface ScenesPlatformConfig extends PlatformConfig {
|
|
60
72
|
platform: typeof PLATFORM_NAME;
|
|
61
73
|
name: string;
|
|
62
74
|
logLevel: LogLevel;
|
|
63
75
|
defaultHouseholdId?: string;
|
|
64
76
|
transport: LocalTransportConfig;
|
|
77
|
+
cloud: SonosCloudConfig;
|
|
65
78
|
scenes: SceneDefinition[];
|
|
66
79
|
}
|
|
67
80
|
export interface SonosHouseholdSummary {
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Self-Hosted Cloud Broker Contract
|
|
2
|
+
|
|
3
|
+
This project is intentionally local-first. For some Sonos favorites and playlists, the local UPnP path is not reliable enough, so the long-term plan is an optional self-hosted broker that uses Sonos's official cloud APIs on the user's behalf.
|
|
4
|
+
|
|
5
|
+
This document defines the shape of that future broker so the Homebridge plugin can support a `local_plus_cloud` mode without forcing the maintainer to host user tokens.
|
|
6
|
+
|
|
7
|
+
## Design Goals
|
|
8
|
+
|
|
9
|
+
- Keep the Homebridge plugin installable and useful with no cloud dependency.
|
|
10
|
+
- Let advanced users self-host their own broker.
|
|
11
|
+
- Keep Sonos client secrets and refresh tokens out of the npm-distributed plugin.
|
|
12
|
+
- Use the Sonos Connected Home cloud APIs for cloud-backed favorites and playlists.
|
|
13
|
+
|
|
14
|
+
## Non-Goals
|
|
15
|
+
|
|
16
|
+
- Proxying audio streams.
|
|
17
|
+
- Acting as a generic Sonos controller for all playback.
|
|
18
|
+
- Replacing local grouping, line-in, TV, or local volume control.
|
|
19
|
+
|
|
20
|
+
## Expected Plugin Modes
|
|
21
|
+
|
|
22
|
+
- `local_only`
|
|
23
|
+
- All scene execution stays on the local transport.
|
|
24
|
+
- The plugin should only expose sources that are reliable on the local path.
|
|
25
|
+
|
|
26
|
+
- `local_plus_cloud`
|
|
27
|
+
- Local transport still handles grouping, line-in, TV, and volume.
|
|
28
|
+
- The broker handles Sonos OAuth plus cloud-backed favorites and playlists.
|
|
29
|
+
|
|
30
|
+
## Broker Responsibilities
|
|
31
|
+
|
|
32
|
+
- Host a public HTTPS OAuth callback for Sonos authorization.
|
|
33
|
+
- Exchange Sonos authorization codes for access and refresh tokens.
|
|
34
|
+
- Refresh access tokens as needed.
|
|
35
|
+
- Query Sonos cloud households, groups, favorites, and playlists.
|
|
36
|
+
- Load favorites or playlists through Sonos's official cloud endpoints.
|
|
37
|
+
|
|
38
|
+
## Proposed Endpoints
|
|
39
|
+
|
|
40
|
+
### `GET /v1/status`
|
|
41
|
+
|
|
42
|
+
Returns a minimal capability document so the plugin can validate the broker URL before enabling cloud-backed scene options.
|
|
43
|
+
|
|
44
|
+
Example response:
|
|
45
|
+
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"ok": true,
|
|
49
|
+
"name": "sonos-scenes-broker",
|
|
50
|
+
"version": "0.1.0",
|
|
51
|
+
"features": ["favorites", "playlists"],
|
|
52
|
+
"docsUrl": "https://example.com/docs"
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### `GET /v1/households`
|
|
57
|
+
|
|
58
|
+
Returns Sonos households available to the authenticated installation.
|
|
59
|
+
|
|
60
|
+
### `GET /v1/households/:householdId/groups`
|
|
61
|
+
|
|
62
|
+
Returns groups and players for a household, shaped closely enough to Sonos's Connected Home response that the plugin can merge or map it into its existing topology model.
|
|
63
|
+
|
|
64
|
+
### `GET /v1/households/:householdId/favorites`
|
|
65
|
+
|
|
66
|
+
Returns Sonos favorites that can be launched through the broker.
|
|
67
|
+
|
|
68
|
+
### `GET /v1/households/:householdId/playlists`
|
|
69
|
+
|
|
70
|
+
Returns Sonos playlists that can be launched through the broker.
|
|
71
|
+
|
|
72
|
+
### `POST /v1/groups/:groupId/favorites/load`
|
|
73
|
+
|
|
74
|
+
Loads a Sonos favorite onto the target group.
|
|
75
|
+
|
|
76
|
+
Example request:
|
|
77
|
+
|
|
78
|
+
```json
|
|
79
|
+
{
|
|
80
|
+
"favoriteId": "2/13",
|
|
81
|
+
"action": "PLAY_NOW"
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### `POST /v1/groups/:groupId/playlists/load`
|
|
86
|
+
|
|
87
|
+
Loads a Sonos playlist onto the target group.
|
|
88
|
+
|
|
89
|
+
Example request:
|
|
90
|
+
|
|
91
|
+
```json
|
|
92
|
+
{
|
|
93
|
+
"playlistId": "playlist-123",
|
|
94
|
+
"action": "PLAY_NOW"
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Authentication Between Plugin And Broker
|
|
99
|
+
|
|
100
|
+
The plugin should not assume anonymous access.
|
|
101
|
+
|
|
102
|
+
Recommended first cut:
|
|
103
|
+
|
|
104
|
+
- user deploys the broker
|
|
105
|
+
- broker exposes a static bearer token or API key for the Homebridge plugin
|
|
106
|
+
- plugin stores that token in `config.json` under `cloud.broker.apiKey`
|
|
107
|
+
|
|
108
|
+
This is simple enough for self-hosting and avoids prematurely designing a more complex plugin-to-broker auth scheme.
|
|
109
|
+
|
|
110
|
+
## Suggested Plugin Config Shape
|
|
111
|
+
|
|
112
|
+
```json
|
|
113
|
+
{
|
|
114
|
+
"cloud": {
|
|
115
|
+
"mode": "local_plus_cloud",
|
|
116
|
+
"broker": {
|
|
117
|
+
"url": "https://sonos-broker.example.com",
|
|
118
|
+
"apiKey": "replace-me",
|
|
119
|
+
"timeoutMs": 8000,
|
|
120
|
+
"routeFavorites": true,
|
|
121
|
+
"routePlaylists": true
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Operational Guidance
|
|
128
|
+
|
|
129
|
+
- The broker should store Sonos refresh tokens encrypted at rest.
|
|
130
|
+
- The broker should avoid logging access tokens, refresh tokens, or raw authorization codes.
|
|
131
|
+
- The broker should support account disconnect and token revocation cleanup.
|
|
132
|
+
- The broker should return explicit errors when a Sonos household or favorite is unavailable.
|
|
133
|
+
|
|
134
|
+
## Sonos Docs
|
|
135
|
+
|
|
136
|
+
- Connected Home: <https://docs.sonos.com/docs/connected-home-get-started>
|
|
137
|
+
- Authorize: <https://docs.sonos.com/docs/authorize>
|
|
138
|
+
- Discover: <https://docs.sonos.com/docs/discover>
|
|
139
|
+
- Control: <https://docs.sonos.com/docs/control>
|
|
140
|
+
- getFavorites: <https://docs.sonos.com/reference/favorites-getfavorites-householdid>
|
|
141
|
+
- loadFavorite: <https://docs.sonos.com/reference/favorites-loadfavorite-groupid>
|
|
@@ -12,6 +12,16 @@
|
|
|
12
12
|
"requestTimeoutMs": 5000,
|
|
13
13
|
"allowTvSource": false
|
|
14
14
|
},
|
|
15
|
+
"cloud": {
|
|
16
|
+
"mode": "local_only",
|
|
17
|
+
"broker": {
|
|
18
|
+
"url": "",
|
|
19
|
+
"apiKey": "",
|
|
20
|
+
"timeoutMs": 8000,
|
|
21
|
+
"routeFavorites": true,
|
|
22
|
+
"routePlaylists": true
|
|
23
|
+
}
|
|
24
|
+
},
|
|
15
25
|
"scenes": [
|
|
16
26
|
{
|
|
17
27
|
"id": "upper-level-line-in",
|
|
@@ -74,25 +74,90 @@
|
|
|
74
74
|
.scene-action-guide {
|
|
75
75
|
display: grid;
|
|
76
76
|
gap: 0.65rem;
|
|
77
|
-
grid-template-columns: repeat(auto-fit, minmax(
|
|
77
|
+
grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
|
|
78
78
|
margin-top: 1rem;
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
.scene-action-
|
|
81
|
+
.scene-action-card {
|
|
82
|
+
appearance: none;
|
|
83
|
+
width: 100%;
|
|
82
84
|
border: 1px solid rgba(170, 198, 255, 0.16);
|
|
83
85
|
border-radius: 0.85rem;
|
|
84
|
-
padding: 0.
|
|
86
|
+
padding: 0.8rem 0.9rem;
|
|
85
87
|
background: rgba(12, 24, 46, 0.18);
|
|
88
|
+
text-align: left;
|
|
89
|
+
transition: transform 120ms ease, border-color 120ms ease, background 120ms ease, box-shadow 120ms ease;
|
|
90
|
+
box-shadow: 0 10px 24px rgba(8, 15, 30, 0.12);
|
|
91
|
+
cursor: pointer;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.scene-action-card:hover {
|
|
95
|
+
transform: translateY(-1px);
|
|
96
|
+
background: rgba(16, 32, 60, 0.28);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.scene-action-card:focus-visible {
|
|
100
|
+
outline: none;
|
|
101
|
+
box-shadow: 0 0 0 3px rgba(170, 198, 255, 0.2);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.scene-action-card.discovery {
|
|
105
|
+
border-color: rgba(226, 232, 240, 0.28);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.scene-action-card.validate {
|
|
109
|
+
border-color: rgba(10, 132, 255, 0.32);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.scene-action-card.test {
|
|
113
|
+
border-color: rgba(168, 85, 247, 0.34);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.scene-action-card.save {
|
|
117
|
+
border-color: rgba(46, 213, 115, 0.34);
|
|
86
118
|
}
|
|
87
119
|
|
|
88
|
-
.scene-action-
|
|
120
|
+
.scene-action-kicker {
|
|
121
|
+
display: inline-flex;
|
|
122
|
+
align-items: center;
|
|
123
|
+
padding: 0.2rem 0.5rem;
|
|
124
|
+
border-radius: 999px;
|
|
125
|
+
font-size: 0.74rem;
|
|
126
|
+
font-weight: 600;
|
|
127
|
+
letter-spacing: 0.03em;
|
|
128
|
+
text-transform: uppercase;
|
|
129
|
+
margin-bottom: 0.55rem;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.scene-action-card.discovery .scene-action-kicker {
|
|
133
|
+
background: rgba(226, 232, 240, 0.12);
|
|
134
|
+
color: #e5edf8;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.scene-action-card.validate .scene-action-kicker {
|
|
138
|
+
background: rgba(10, 132, 255, 0.16);
|
|
139
|
+
color: #7ec3ff;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.scene-action-card.test .scene-action-kicker {
|
|
143
|
+
background: rgba(168, 85, 247, 0.18);
|
|
144
|
+
color: #d8b4fe;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.scene-action-card.save .scene-action-kicker {
|
|
148
|
+
background: rgba(46, 213, 115, 0.16);
|
|
149
|
+
color: #78f0a9;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.scene-action-card strong {
|
|
89
153
|
display: block;
|
|
90
154
|
color: #f3f7ff;
|
|
91
155
|
margin-bottom: 0.2rem;
|
|
92
|
-
font-size:
|
|
156
|
+
font-size: 1.02rem;
|
|
157
|
+
font-weight: 600;
|
|
93
158
|
}
|
|
94
159
|
|
|
95
|
-
.scene-action-
|
|
160
|
+
.scene-action-card span {
|
|
96
161
|
display: block;
|
|
97
162
|
color: rgba(232, 242, 255, 0.84);
|
|
98
163
|
font-size: 0.87rem;
|
|
@@ -188,30 +253,28 @@
|
|
|
188
253
|
and test them before saving.
|
|
189
254
|
</p>
|
|
190
255
|
</div>
|
|
191
|
-
<div class="d-flex flex-wrap gap-2">
|
|
192
|
-
<button class="btn btn-outline-secondary" id="refresh-button" type="button" title="Refresh households, rooms, groups, and favorites from Sonos.">Discover</button>
|
|
193
|
-
<button class="btn btn-outline-primary" id="validate-button" type="button" title="Check the scene against the current Sonos topology without changing playback.">Validate</button>
|
|
194
|
-
<button class="btn btn-primary" id="test-button" type="button" title="Actually run the scene on Sonos right now so you can confirm it works.">Run Test</button>
|
|
195
|
-
<button class="btn btn-success" id="save-homebridge-button" type="button" title="Write the current scene configuration into Homebridge.">Save To Homebridge</button>
|
|
196
|
-
</div>
|
|
197
256
|
</div>
|
|
198
257
|
<div class="scene-action-guide">
|
|
199
|
-
<
|
|
258
|
+
<button class="scene-action-card discovery" id="refresh-button" type="button" title="Refresh households, rooms, groups, and favorites from Sonos.">
|
|
259
|
+
<div class="scene-action-kicker">Refresh</div>
|
|
200
260
|
<strong>Discover</strong>
|
|
201
261
|
<span>Refresh the live list of Sonos households, rooms, groups, favorites, and inputs.</span>
|
|
202
|
-
</
|
|
203
|
-
<
|
|
262
|
+
</button>
|
|
263
|
+
<button class="scene-action-card validate" id="validate-button" type="button" title="Check the scene against the current Sonos topology without changing playback.">
|
|
264
|
+
<div class="scene-action-kicker">Safe Check</div>
|
|
204
265
|
<strong>Validate</strong>
|
|
205
266
|
<span>Checks your scene setup for errors against the current Sonos topology without changing anything on your speakers.</span>
|
|
206
|
-
</
|
|
207
|
-
<
|
|
267
|
+
</button>
|
|
268
|
+
<button class="scene-action-card test" id="test-button" type="button" title="Actually run the scene on Sonos right now so you can confirm it works.">
|
|
269
|
+
<div class="scene-action-kicker">Live Run</div>
|
|
208
270
|
<strong>Run Test</strong>
|
|
209
271
|
<span>Actually runs the scene on your Sonos system now so you can confirm the grouping, source, and volume behavior.</span>
|
|
210
|
-
</
|
|
211
|
-
<
|
|
272
|
+
</button>
|
|
273
|
+
<button class="scene-action-card save" id="save-homebridge-button" type="button" title="Write the current scene configuration into Homebridge.">
|
|
274
|
+
<div class="scene-action-kicker">Persist</div>
|
|
212
275
|
<strong>Save To Homebridge</strong>
|
|
213
276
|
<span>Saves the current scenes into Homebridge so they persist and appear as HomeKit switch accessories.</span>
|
|
214
|
-
</
|
|
277
|
+
</button>
|
|
215
278
|
</div>
|
|
216
279
|
</section>
|
|
217
280
|
|
|
@@ -394,6 +457,19 @@
|
|
|
394
457
|
},
|
|
395
458
|
safeConfig.transport || {},
|
|
396
459
|
),
|
|
460
|
+
cloud: {
|
|
461
|
+
mode: safeConfig.cloud?.mode === "local_plus_cloud" ? "local_plus_cloud" : "local_only",
|
|
462
|
+
broker: Object.assign(
|
|
463
|
+
{
|
|
464
|
+
url: "",
|
|
465
|
+
apiKey: "",
|
|
466
|
+
timeoutMs: 8000,
|
|
467
|
+
routeFavorites: true,
|
|
468
|
+
routePlaylists: true,
|
|
469
|
+
},
|
|
470
|
+
safeConfig.cloud?.broker || {},
|
|
471
|
+
),
|
|
472
|
+
},
|
|
397
473
|
scenes: Array.isArray(safeConfig.scenes) ? safeConfig.scenes.map(normalizeScene) : [],
|
|
398
474
|
};
|
|
399
475
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "homebridge-sonos-scenes",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Homebridge plugin for Sonos workflow scenes and orchestration.",
|
|
5
5
|
"author": "applemanj",
|
|
6
6
|
"homepage": "https://github.com/applemanj/homebridge-sonos-scenes#readme",
|
|
@@ -26,7 +26,8 @@
|
|
|
26
26
|
"config.schema.json",
|
|
27
27
|
"README.md",
|
|
28
28
|
"LICENSE",
|
|
29
|
-
"examples"
|
|
29
|
+
"examples",
|
|
30
|
+
"docs"
|
|
30
31
|
],
|
|
31
32
|
"keywords": [
|
|
32
33
|
"homebridge-plugin",
|