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 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`.
@@ -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"}
@@ -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
  }
@@ -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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"}
@@ -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(180px, 1fr));
77
+ grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
78
78
  margin-top: 1rem;
79
79
  }
80
80
 
81
- .scene-action-guide div {
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.7rem 0.8rem;
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-guide strong {
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: 0.95rem;
156
+ font-size: 1.02rem;
157
+ font-weight: 600;
93
158
  }
94
159
 
95
- .scene-action-guide span {
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
- <div>
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
- </div>
203
- <div>
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
- </div>
207
- <div>
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
- </div>
211
- <div>
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
- </div>
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.2",
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",