homebridge-yoto 0.0.28 → 0.0.32

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
@@ -1,321 +1,30 @@
1
- # homebridge-yoto
2
-
3
- [![latest version](https://img.shields.io/npm/v/homebridge-yoto.svg)](https://www.npmjs.com/package/homebridge-yoto)
4
- [![Actions Status](https://github.com/bcomnes/homebridge-yoto/workflows/tests/badge.svg)](https://github.com/bcomnes/homebridge-yoto/actions)
5
- [![downloads](https://img.shields.io/npm/dm/homebridge-yoto.svg)](https://npmtrends.com/homebridge-yoto)
6
- ![Types in JS](https://img.shields.io/badge/types_in_js-yes-brightgreen)
7
- [![neostandard javascript style](https://img.shields.io/badge/code_style-neostandard-7fffff?style=flat&labelColor=ff80ff)](https://github.com/neostandard/neostandard)
8
- [![Socket Badge](https://socket.dev/api/badge/npm/package/homebridge-yoto)](https://socket.dev/npm/package/homebridge-yoto)
9
-
10
- THIS PLUGIN IS A WIP. DO NOT USE YET.
11
-
12
- > Control your Yoto players through Apple HomeKit
13
-
14
- A Homebridge plugin that integrates Yoto audio players with Apple HomeKit, providing real-time control over playback, volume, and device status through MQTT.
15
-
16
- ## Features
17
-
18
- - 🎵 **Playback Control** - Play, pause, and stop content from the Home app
19
- - 🔊 **Volume Control** - Adjust volume with HomeKit sliders or Siri
20
- - 🔋 **Battery Status** - Monitor battery level and charging state
21
- - 🌡️ **Temperature Monitoring** - Track device temperature
22
- - 📡 **Connection Status** - Know when devices are online/offline
23
- - 🎴 **Card Detection** - Detect when cards are inserted
24
- - 💡 **Display Brightness** - Control screen brightness like a lightbulb
25
- - ⏱️ **Sleep Timer** - Set auto-shutoff timer (0-120 minutes)
26
- - 🔊 **Volume Limits** - Set separate day/night maximum volume levels (0-16)
27
- - 🎨 **Ambient Light** - Full RGB color control for ambient LEDs
28
- - 📝 **Active Content** - Track and display what's currently playing
29
- - ⚙️ **Advanced Controls** - Bluetooth, Repeat, and more via switches
30
- - ⚡ **Real-Time Updates** - Instant status updates via MQTT (no polling!)
31
- - 🔐 **Secure OAuth2** - Device authorization flow for authentication
32
-
33
- ## Installation
34
-
35
- ### Via Homebridge UI (Recommended)
36
-
37
- 1. Search for "Yoto" in the Homebridge Config UI X plugin search
38
- 2. Click **Install**
39
- 3. Follow the OAuth setup instructions in the Homebridge logs
40
- 4. Restart Homebridge
41
-
42
- ### Via Command Line
43
-
44
- ```bash
45
- npm install -g homebridge-yoto
46
- ```
47
-
48
- Or add to your Homebridge `package.json`:
49
-
50
- ```bash
51
- npm install homebridge-yoto
52
- ```
53
-
54
- ## Configuration
55
-
56
- ### Initial Setup
57
-
58
- 1. **Install the plugin** using one of the methods above
59
- 2. **Start Homebridge** - the plugin will automatically initiate OAuth flow (uses default OAuth client ID)
60
- 3. **Check the logs** for authentication instructions:
61
- ```
62
- [Yoto] ============================================================
63
- [Yoto] YOTO AUTHENTICATION REQUIRED
64
- [Yoto] ============================================================
65
- [Yoto]
66
- [Yoto] 1. Visit: https://api.yotoplay.com/device/auth
67
- [Yoto] 2. Enter code: ABC-DEF-GHI
68
- [Yoto]
69
- [Yoto] Or visit: https://api.yotoplay.com/device/auth?code=ABC-DEF-GHI
70
- [Yoto]
71
- [Yoto] Code expires in 5 minutes
72
- [Yoto] ============================================================
73
- ```
74
- 4. **Visit the URL** and enter the code to authorize
75
- 5. **Wait for confirmation** - tokens will be saved automatically
76
- 6. **Restart Homebridge** to complete setup
77
-
78
- ### Configuration Options
79
-
80
- The plugin can be configured through the Homebridge Config UI or by editing `config.json`:
81
-
82
- ```json
83
- {
84
- "platform": "Yoto",
85
- "name": "Yoto",
86
- "clientId": "Y4HJ8BFqRQ24GQoLzgOzZ2KSqWmFG8LI",
87
- "mqttBroker": "mqtt://mqtt.yotoplay.com:1883",
88
- "statusTimeoutSeconds": 120,
89
- "exposeTemperature": true,
90
- "exposeBattery": true,
91
- "exposeConnectionStatus": true,
92
- "exposeCardDetection": false,
93
- "exposeDisplayBrightness": true,
94
- "exposeSleepTimer": false,
95
- "exposeVolumeLimits": false,
96
- "exposeAmbientLight": false,
97
- "exposeActiveContent": true,
98
- "updateAccessoryName": false,
99
- "exposeAdvancedControls": false,
100
- "volumeControlType": "speaker",
101
- "debug": false
102
- }
103
- ```
104
-
105
- #### Configuration Fields
106
-
107
- | Field | Type | Default | Description |
108
- |-------|------|---------|-------------|
109
- | `platform` | string | `"Yoto"` | **Required** - Must be "Yoto" |
110
- | `name` | string | `"Yoto"` | Platform name in Homebridge logs |
111
- | `clientId` | string | `Y4HJ8BFqRQ24GQoLzgOzZ2KSqWmFG8LI` | OAuth client ID (default works for most users) |
112
- | `accessToken` | string | - | OAuth access token (managed automatically) |
113
- | `refreshToken` | string | - | OAuth refresh token (managed automatically) |
114
- | `tokenExpiresAt` | number | - | Token expiration timestamp (managed automatically) |
115
- | `mqttBroker` | string | `mqtt://mqtt.yotoplay.com:1883` | MQTT broker URL |
116
- | `statusTimeoutSeconds` | number | `120` | Seconds without updates before marking offline |
117
- | `exposeTemperature` | boolean | `true` | Add temperature sensor service |
118
- | `exposeBattery` | boolean | `true` | Add battery service |
119
- | `exposeConnectionStatus` | boolean | `true` | Add online/offline status sensor |
120
- | `exposeCardDetection` | boolean | `false` | Add card insertion detection sensor |
121
- | `exposeDisplayBrightness` | boolean | `true` | Add lightbulb service for display brightness |
122
- | `exposeSleepTimer` | boolean | `false` | Add fan service for sleep timer control |
123
- | `exposeVolumeLimits` | boolean | `false` | Add lightbulb services for day/night volume limits |
124
- | `exposeAmbientLight` | boolean | `false` | Add lightbulb service with RGB color control |
125
- | `exposeActiveContent` | boolean | `true` | Track and log currently playing content |
126
- | `updateAccessoryName` | boolean | `false` | Update accessory name with current content title |
127
- | `exposeAdvancedControls` | boolean | `false` | Add switches for Bluetooth, Repeat, etc. |
128
- | `volumeControlType` | string | `"speaker"` | Service type for volume (`"speaker"`, `"fan"`, or `"lightbulb"`) |
129
- | `debug` | boolean | `false` | Enable verbose debug logging |
130
-
131
- **Note on Client ID:** The default client ID (`Y4HJ8BFqRQ24GQoLzgOzZ2KSqWmFG8LI`) is a public OAuth application that works for all users. You only need to change this if:
132
- - You want to use your own OAuth application
133
- - You're experiencing rate limiting issues
134
- - You need custom OAuth settings
135
-
136
- To create your own OAuth app, visit [yoto.dev](https://yoto.dev).
137
-
138
- ## HomeKit Services
139
-
140
- Each Yoto player is exposed as a HomeKit accessory with the following services:
141
-
142
- ### Smart Speaker (Primary)
143
- - **Current Media State** - Shows if content is playing, paused, or stopped
144
- - **Target Media State** - Control playback (play/pause/stop)
145
- - **Volume** - Adjust volume (0-100)
146
- - **Mute** - Mute/unmute audio
147
-
148
- ### Battery (Optional)
149
- - **Battery Level** - Current battery percentage
150
- - **Charging State** - Whether device is charging
151
- - **Low Battery** - Alert when battery is below 20%
152
-
153
- ### Temperature Sensor (Optional)
154
- - **Current Temperature** - Device temperature in Celsius
155
-
156
- ### Occupancy Sensor (Optional)
157
- - **Occupancy Detected** - Indicates if device is online
158
- - **Status Active** - Shows connection status
159
-
160
- ### Contact Sensor (Optional)
161
- - **Contact Sensor State** - Detects when a card is inserted
162
-
163
- ### Lightbulb (Display Brightness, Optional)
164
- - **On/Off** - Turn display on or off
165
- - **Brightness** - Adjust display brightness (0-100)
166
-
167
- ### Fan (Sleep Timer, Optional)
168
- - **Active** - Enable/disable sleep timer
169
- - **Rotation Speed** - Timer duration (0-100 = 0-120 minutes)
1
+ <p align="center">
170
2
 
171
- ### Switches (Advanced Controls, Optional)
172
- - **Bluetooth Switch** - Enable/disable Bluetooth
173
- - **Repeat Switch** - Enable/disable repeat all
174
- - **BT Headphones Switch** - Enable/disable Bluetooth headphones
3
+ <img src="https://github.com/homebridge/branding/raw/latest/logos/homebridge-wordmark-logo-vertical.png" width="150">
175
4
 
176
- ### Lightbulb (Volume Limits, Optional)
177
- - **Day Volume Limit** - Maximum volume during day mode (0-16 = 0-100%)
178
- - **Night Volume Limit** - Maximum volume during night mode (0-16 = 0-100%)
5
+ <img src="./logo.png" width="150">
179
6
 
180
- ### Lightbulb (Ambient Light, Optional)
181
- - **On/Off** - Enable/disable ambient light
182
- - **Hue** - Color hue (0-360)
183
- - **Saturation** - Color saturation (0-100%)
184
- - **Brightness** - Light intensity (0-100%)
7
+ </p>
185
8
 
186
- ### Active Content Information (Optional)
187
- - Automatically tracks and logs currently playing content
188
- - Displays card title, author, and category in logs
189
- - Optionally updates accessory name with current content
9
+ <span align="center">
190
10
 
191
- ## Usage Examples
192
-
193
- ### Siri Commands
194
-
195
- - "Hey Siri, play Bedroom Player"
196
- - "Hey Siri, pause Kitchen Player"
197
- - "Hey Siri, set Bedroom Player volume to 50%"
198
- - "Hey Siri, turn on Bedroom Player Display"
199
- - "Hey Siri, set Bedroom Player Display to 30%"
200
- - "Hey Siri, turn on Bedroom Player Sleep Timer"
201
- - "Hey Siri, set Bedroom Player Day Volume Limit to 75%"
202
- - "Hey Siri, set Bedroom Player Ambient Light to red"
203
- - "Hey Siri, what's the battery level of my Yoto Player?"
204
-
205
- ### Automation Ideas
206
-
207
- - **Bedtime Routine** - Automatically pause all players at bedtime
208
- - **Good Morning** - Start playing daily content when you wake up
209
- - **Low Battery Alert** - Get notified when battery drops below 20%
210
- - **Card Inserted** - Trigger lights or scenes when a card is inserted
211
- - **Device Online** - Get notified when a player comes online
212
- - **Dim Display at Night** - Automatically dim display brightness at bedtime
213
- - **Sleep Timer** - Auto-stop playback after a set time
214
- - **Night Mode Volume** - Automatically lower max volume at bedtime
215
- - **Ambient Light Scenes** - Change LED colors based on time of day or mood
216
- - **Content-Based Automations** - Trigger actions when specific content starts playing
217
-
218
- ## Troubleshooting
219
-
220
- ### Authentication Issues
221
-
222
- **Problem:** OAuth flow not completing
223
-
224
- **Solution:**
225
- 1. Check that you're visiting the correct URL from the logs
226
- 2. Ensure the code hasn't expired (5 minute timeout)
227
- 3. Try restarting Homebridge to generate a new code
228
- 4. Check your internet connection
229
- 5. Verify the client ID is correct (default: `Y4HJ8BFqRQ24GQoLzgOzZ2KSqWmFG8LI`)
230
-
231
- **Problem:** "Invalid client" or "Client not found" errors
232
-
233
- **Solution:**
234
- 1. Ensure you haven't changed the `clientId` field in config
235
- 2. If using a custom client ID, verify it's correct at yoto.dev
236
- 3. Try removing the `clientId` field to use the default
237
-
238
- ### MQTT Connection Issues
239
-
240
- **Problem:** No real-time updates, devices show "No Response"
241
-
242
- **Solution:**
243
- 1. Check `statusTimeoutSeconds` setting - increase if needed
244
- 2. Verify MQTT broker URL is correct
245
- 3. Check Homebridge logs for MQTT connection errors
246
- 4. Ensure your network allows MQTT connections (port 1883)
247
-
248
- ### Device Not Appearing
249
-
250
- **Problem:** Yoto player doesn't show up in Home app
251
-
252
- **Solution:**
253
- 1. Verify device appears in Yoto app
254
- 2. Check Homebridge logs for discovery messages
255
- 3. Try restarting Homebridge
256
- 4. Remove cached accessories and restart
257
-
258
- ### Token Refresh Issues
259
-
260
- **Problem:** "Token refresh failed" errors
261
-
262
- **Solution:**
263
- 1. Clear tokens from config and restart to re-authenticate
264
- 2. Check system time is correct (affects token validation)
265
- 3. Verify you have internet connectivity
266
-
267
- ## Development
268
-
269
- This plugin uses TypeScript-in-JavaScript with JSDoc for type safety.
270
-
271
- ### Setup
272
-
273
- ```bash
274
- git clone https://github.com/bcomnes/homebridge-yoto.git
275
- cd homebridge-yoto
276
- npm install
277
- ```
278
-
279
- ### Running Tests
280
-
281
- ```bash
282
- npm test
283
- ```
284
-
285
- ### Code Style
286
-
287
- ```bash
288
- npm run test:lint
289
- ```
290
-
291
- ### Type Checking
292
-
293
- ```bash
294
- npm run test:tsc
295
- ```
296
-
297
- ## Architecture
11
+ # homebridge-yoto
298
12
 
299
- - **OAuth2 Device Flow** - Secure authentication without client secrets
300
- - **MQTT Real-Time Updates** - Instant status updates via `/device/{id}/data/status` and `/device/{id}/data/events` topics
301
- - **Dynamic Platform** - Automatically discovers and registers devices
302
- - **REST API** - Used for device discovery and configuration updates
303
- - **Platform Accessories** - Each Yoto player is a cached platform accessory
13
+ </span>
304
14
 
305
- ## API Documentation
15
+ <span align="center">
306
16
 
307
- - [Yoto Developer API](https://yoto.dev/api/)
308
- - [Yoto MQTT Documentation](https://yoto.dev/players-mqtt/mqtt-docs/)
17
+ [![latest version](https://img.shields.io/npm/v/homebridge-yoto.svg)](https://www.npmjs.com/package/homebridge-yoto)
18
+ [![Actions Status](https://github.com/bcomnes/homebridge-yoto/workflows/tests/badge.svg)](https://github.com/bcomnes/homebridge-yoto/actions)
19
+ [![downloads](https://img.shields.io/npm/dm/homebridge-yoto.svg)](https://npmtrends.com/homebridge-yoto)
20
+ ![Types in JS](https://img.shields.io/badge/types_in_js-yes-brightgreen)
21
+ [![neostandard javascript style](https://img.shields.io/badge/code_style-neostandard-7fffff?style=flat&labelColor=ff80ff)](https://github.com/neostandard/neostandard)
22
+ [![Socket Badge](https://socket.dev/api/badge/npm/package/homebridge-yoto)](https://socket.dev/npm/package/homebridge-yoto)
309
23
 
310
- ## Contributing
24
+ </span>
311
25
 
312
- Contributions are welcome! Please:
26
+ THIS PLUGIN IS A WIP. DO NOT USE YET.
313
27
 
314
- 1. Fork the repository
315
- 2. Create a feature branch (`git checkout -b feature/amazing-feature`)
316
- 3. Commit your changes (`git commit -m 'Add amazing feature'`)
317
- 4. Push to the branch (`git push origin feature/amazing-feature`)
318
- 5. Open a Pull Request
319
28
 
320
29
  ## License
321
30
 
@@ -323,11 +32,6 @@ MIT © [Bret Comnes](https://bret.io)
323
32
 
324
33
  ## Acknowledgments
325
34
 
326
- - Thanks to [Yoto](https://yoto.io) for their excellent API and MQTT documentation
35
+ - Thanks to [Yoto](https://yoto.io) for their new API!
327
36
  - Built with [Homebridge](https://homebridge.io)
328
-
329
- ## Support
330
-
331
- - 🐛 [Report a Bug](https://github.com/bcomnes/homebridge-yoto/issues)
332
- - 💡 [Request a Feature](https://github.com/bcomnes/homebridge-yoto/issues)
333
- - 📖 [Documentation](https://github.com/bcomnes/homebridge-yoto#readme)
37
+ s
@@ -0,0 +1,3 @@
1
+ const configSchema = require('./config.schema.json')
2
+
3
+ exports.configSchema = configSchema
@@ -2,6 +2,7 @@
2
2
  "pluginAlias": "Yoto",
3
3
  "pluginType": "platform",
4
4
  "singular": true,
5
+ "customUi": true,
5
6
  "headerDisplay": "**Homebridge Yoto Plugin** - Control your Yoto players through HomeKit",
6
7
  "footerDisplay": "For help and documentation, visit the [GitHub repository](https://github.com/bcomnes/homebridge-yoto)",
7
8
  "schema": {
@@ -12,140 +13,37 @@
12
13
  "type": "string",
13
14
  "default": "Y4HJ8BFqRQ24GQoLzgOzZ2KSqWmFG8LI",
14
15
  "required": false,
15
- "description": "OAuth client ID for Yoto API authentication. Default works for most users. Create your own OAuth app at yoto.dev if needed."
16
+ "description": "OAuth client ID for Yoto API authentication. The default works for most users. Only change if you've created your own OAuth app at yoto.dev.",
17
+ "x-schema-form": {
18
+ "hidden": false
19
+ }
16
20
  },
17
21
  "accessToken": {
18
22
  "title": "Access Token",
19
23
  "type": "string",
20
24
  "required": false,
21
- "description": "Stored access token (managed automatically after OAuth)"
25
+ "description": "Automatically managed by the authentication flow. Do not edit manually.",
26
+ "x-schema-form": {
27
+ "type": "password"
28
+ }
22
29
  },
23
30
  "refreshToken": {
24
31
  "title": "Refresh Token",
25
32
  "type": "string",
26
33
  "required": false,
27
- "description": "Stored refresh token (managed automatically after OAuth)"
34
+ "description": "Automatically managed by the authentication flow. Do not edit manually.",
35
+ "x-schema-form": {
36
+ "type": "password"
37
+ }
28
38
  },
29
39
  "tokenExpiresAt": {
30
40
  "title": "Token Expiration",
31
41
  "type": "number",
32
42
  "required": false,
33
- "description": "Token expiration timestamp (managed automatically)"
34
- },
35
-
36
- "statusTimeoutSeconds": {
37
- "title": "Status Timeout (seconds)",
38
- "type": "number",
39
- "default": 120,
40
- "minimum": 60,
41
- "maximum": 300,
42
- "required": false,
43
- "description": "Seconds without MQTT updates before marking device offline"
44
- },
45
- "exposeTemperature": {
46
- "title": "Expose Temperature Sensor",
47
- "type": "boolean",
48
- "default": true,
49
- "required": false,
50
- "description": "Add temperature sensor service to each device"
51
- },
52
- "exposeBattery": {
53
- "title": "Expose Battery Service",
54
- "type": "boolean",
55
- "default": true,
56
- "required": false,
57
- "description": "Add battery service to each device"
58
- },
59
- "exposeConnectionStatus": {
60
- "title": "Expose Connection Status",
61
- "type": "boolean",
62
- "default": true,
63
- "required": false,
64
- "description": "Add occupancy sensor to track device online/offline status"
65
- },
66
- "exposeCardDetection": {
67
- "title": "Expose Card Detection",
68
- "type": "boolean",
69
- "default": false,
70
- "required": false,
71
- "description": "Add contact sensor to detect when a card is inserted"
72
- },
73
- "exposeVolumeLimits": {
74
- "title": "Expose Volume Limits",
75
- "type": "boolean",
76
- "default": false,
77
- "required": false,
78
- "description": "Add lightbulb services to control day and night volume limits (0-16)"
79
- },
80
- "exposeAmbientLight": {
81
- "title": "Expose Ambient Light",
82
- "type": "boolean",
83
- "default": false,
84
- "required": false,
85
- "description": "Add lightbulb service with RGB color control for ambient light"
86
- },
87
- "exposeActiveContent": {
88
- "title": "Expose Active Content",
89
- "type": "boolean",
90
- "default": true,
91
- "required": false,
92
- "description": "Track and log active content information when playing"
93
- },
94
- "updateAccessoryName": {
95
- "title": "Update Accessory Name with Content",
96
- "type": "boolean",
97
- "default": false,
98
- "required": false,
99
- "description": "Update accessory display name to show currently playing content"
100
- },
101
- "exposeDisplayBrightness": {
102
- "title": "Expose Display Brightness",
103
- "type": "boolean",
104
- "default": true,
105
- "required": false,
106
- "description": "Add lightbulb service to control display brightness"
107
- },
108
- "exposeSleepTimer": {
109
- "title": "Expose Sleep Timer",
110
- "type": "boolean",
111
- "default": false,
112
- "required": false,
113
- "description": "Add fan service to control sleep timer (rotation speed = minutes)"
114
- },
115
- "exposeAdvancedControls": {
116
- "title": "Expose Advanced Controls",
117
- "type": "boolean",
118
- "default": false,
119
- "required": false,
120
- "description": "Add switches for advanced settings (Bluetooth, Repeat, BT Headphones)"
121
- },
122
- "volumeControlType": {
123
- "title": "Volume Control Type",
124
- "type": "string",
125
- "default": "speaker",
126
- "required": false,
127
- "oneOf": [
128
- {
129
- "title": "Smart Speaker",
130
- "enum": ["speaker"]
131
- },
132
- {
133
- "title": "Fan (Alternate)",
134
- "enum": ["fan"]
135
- },
136
- {
137
- "title": "Lightbulb (Alternate)",
138
- "enum": ["lightbulb"]
139
- }
140
- ],
141
- "description": "Service type to use for volume control"
142
- },
143
- "debug": {
144
- "title": "Debug Logging",
145
- "type": "boolean",
146
- "default": false,
147
- "required": false,
148
- "description": "Enable verbose debug logging"
43
+ "description": "Automatically managed by the authentication flow. Do not edit manually.",
44
+ "x-schema-form": {
45
+ "hidden": true
46
+ }
149
47
  }
150
48
  }
151
49
  },
@@ -158,46 +56,12 @@
158
56
  "items": [
159
57
  {
160
58
  "type": "help",
161
- "helpvalue": "<p><strong>OAuth Setup Instructions:</strong></p><ol><li>Start Homebridge - the plugin will initiate OAuth flow automatically if no tokens are present</li><li>Check Homebridge logs for the verification URL and user code</li><li>Visit the URL and enter the code to authorize the plugin</li><li>After authorization, the tokens will be saved automatically</li><li>Restart Homebridge to apply the changes</li></ol><p><strong>Client ID:</strong> The default client ID works for most users. Only change if you've created your own OAuth app at yoto.dev or experiencing rate limiting.</p><p><em>Note: Token fields are managed automatically and should not be edited manually unless troubleshooting.</em></p>"
59
+ "helpvalue": "<p><strong>Authentication Instructions:</strong></p><ol><li>Click the <strong>\"Start Authentication\"</strong> button in the custom UI above</li><li>Follow the on-screen instructions to authorize with your Yoto account</li><li>Tokens will be saved automatically when authorization completes</li><li>Homebridge will restart and connect to your devices</li></ol><p><strong>Advanced:</strong> The default OAuth Client ID works for all users. The token fields below are automatically managed by the plugin and should not be edited manually.</p>"
162
60
  },
163
61
  "clientId",
164
62
  "accessToken",
165
- "refreshToken",
166
- "tokenExpiresAt"
63
+ "refreshToken"
167
64
  ]
168
- },
169
- {
170
- "type": "section",
171
- "title": "MQTT Configuration",
172
- "expandable": true,
173
- "expanded": false,
174
- "items": ["statusTimeoutSeconds"]
175
- },
176
- {
177
- "type": "section",
178
- "title": "Feature Toggles",
179
- "expandable": true,
180
- "expanded": true,
181
- "items": [
182
- "exposeBattery",
183
- "exposeTemperature",
184
- "exposeConnectionStatus",
185
- "exposeCardDetection",
186
- "exposeDisplayBrightness",
187
- "exposeSleepTimer",
188
- "exposeVolumeLimits",
189
- "exposeAmbientLight",
190
- "exposeAdvancedControls",
191
- "exposeActiveContent",
192
- "updateAccessoryName"
193
- ]
194
- },
195
- {
196
- "type": "section",
197
- "title": "Advanced Settings",
198
- "expandable": true,
199
- "expanded": false,
200
- "items": ["volumeControlType", "debug"]
201
65
  }
202
66
  ]
203
67
  }