yoto-nodejs-client 0.0.5 → 0.0.7
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 +73 -40
- package/bin/auth.js +4 -3
- package/bin/device-model.js +25 -5
- package/bin/device-tui.js +25 -3
- package/bin/devices.js +25 -9
- package/bin/lib/cli-helpers.d.ts.map +1 -1
- package/bin/lib/cli-helpers.js +3 -1
- package/bin/lib/token-helpers.d.ts +4 -2
- package/bin/lib/token-helpers.d.ts.map +1 -1
- package/bin/lib/token-helpers.js +9 -8
- package/bin/refresh-token.js +4 -2
- package/bin/token-info.js +2 -2
- package/lib/api-client.d.ts +11 -10
- package/lib/api-client.d.ts.map +1 -1
- package/lib/api-client.js +12 -14
- package/lib/api-endpoints/auth.test.js +4 -4
- package/lib/api-endpoints/content.test.js +32 -32
- package/lib/api-endpoints/devices.d.ts +4 -4
- package/lib/api-endpoints/devices.js +2 -2
- package/lib/api-endpoints/devices.test.js +45 -45
- package/lib/api-endpoints/endpoint-test-helpers.d.ts +3 -4
- package/lib/api-endpoints/endpoint-test-helpers.d.ts.map +1 -1
- package/lib/api-endpoints/endpoint-test-helpers.js +21 -5
- package/lib/api-endpoints/family-library-groups.d.ts +3 -3
- package/lib/api-endpoints/family-library-groups.d.ts.map +1 -1
- package/lib/api-endpoints/family-library-groups.js +3 -3
- package/lib/api-endpoints/family-library-groups.test.js +29 -29
- package/lib/api-endpoints/family.test.js +11 -11
- package/lib/api-endpoints/icons.test.js +14 -14
- package/lib/mqtt/client.d.ts +123 -48
- package/lib/mqtt/client.d.ts.map +1 -1
- package/lib/mqtt/client.js +131 -49
- package/lib/mqtt/factory.d.ts +12 -5
- package/lib/mqtt/factory.d.ts.map +1 -1
- package/lib/mqtt/factory.js +39 -11
- package/lib/mqtt/index.js +2 -1
- package/lib/mqtt/mqtt.test.js +25 -22
- package/lib/test-helpers/device-model-test-helpers.d.ts +29 -0
- package/lib/test-helpers/device-model-test-helpers.d.ts.map +1 -0
- package/lib/test-helpers/device-model-test-helpers.js +116 -0
- package/lib/token.d.ts +44 -2
- package/lib/token.d.ts.map +1 -1
- package/lib/token.js +142 -2
- package/lib/yoto-account.d.ts +339 -9
- package/lib/yoto-account.d.ts.map +1 -1
- package/lib/yoto-account.js +411 -39
- package/lib/yoto-account.test.js +139 -0
- package/lib/yoto-device.d.ts +418 -30
- package/lib/yoto-device.d.ts.map +1 -1
- package/lib/yoto-device.js +670 -104
- package/lib/yoto-device.test.js +88 -0
- package/package.json +1 -1
package/lib/yoto-device.d.ts
CHANGED
|
@@ -4,10 +4,6 @@
|
|
|
4
4
|
* @returns {string} Official color name or the original value if not found
|
|
5
5
|
*/
|
|
6
6
|
export function getNightlightColorName(colorValue: string): string;
|
|
7
|
-
/**
|
|
8
|
-
* Power source state
|
|
9
|
-
* @typedef {'battery' | 'dock' | 'usb-c' | 'wireless'} PowerSource
|
|
10
|
-
*/
|
|
11
7
|
/**
|
|
12
8
|
* Official Yoto nightlight colors
|
|
13
9
|
*
|
|
@@ -38,7 +34,7 @@ export const NIGHTLIGHT_COLORS: {
|
|
|
38
34
|
* @property {boolean} isCharging - Whether device is currently charging
|
|
39
35
|
* @property {boolean} isOnline - Whether device is currently online
|
|
40
36
|
* @property {number} volume - User volume level (0-16 scale)
|
|
41
|
-
* @property {number} maxVolume - Maximum volume limit (0-16 scale)
|
|
37
|
+
* @property {number} maxVolume - Active Maximum volume (depending on day or night) limit (0-16 scale)
|
|
42
38
|
* @property {CardInsertionState} cardInsertionState - Card insertion state
|
|
43
39
|
* @property {DayMode} dayMode - Day mode status
|
|
44
40
|
* @property {PowerSource} powerSource - Power source
|
|
@@ -58,12 +54,56 @@ export const NIGHTLIGHT_COLORS: {
|
|
|
58
54
|
* @property {string} source - Data source ('http' or 'mqtt') - metadata field added by stateful client
|
|
59
55
|
*/
|
|
60
56
|
export const YotoDeviceStatusType: {};
|
|
57
|
+
/**
|
|
58
|
+
* Canonical device config - normalized format for HTTP config payloads
|
|
59
|
+
*
|
|
60
|
+
* String booleans and numeric strings are normalized. Brightness "auto" values
|
|
61
|
+
* are split into value + boolean flag.
|
|
62
|
+
*
|
|
63
|
+
* @typedef {Object} YotoDeviceModelConfig
|
|
64
|
+
* @property {string[]} alarms - Alarm list entries
|
|
65
|
+
* @property {string} ambientColour - Ambient light color (hex code)
|
|
66
|
+
* @property {boolean} bluetoothEnabled - Bluetooth enabled state
|
|
67
|
+
* @property {boolean} btHeadphonesEnabled - Bluetooth headphones enabled
|
|
68
|
+
* @property {string} clockFace - Clock face style
|
|
69
|
+
* @property {number | null} dayDisplayBrightness - Day brightness (0-100), null when auto
|
|
70
|
+
* @property {boolean} dayDisplayBrightnessAuto - Whether day brightness is auto
|
|
71
|
+
* @property {string} dayTime - Day mode start time
|
|
72
|
+
* @property {string} dayYotoDaily - Day mode Yoto Daily card path
|
|
73
|
+
* @property {string} dayYotoRadio - Day mode Yoto Radio card path
|
|
74
|
+
* @property {boolean} daySoundsOff - Day sounds off
|
|
75
|
+
* @property {number} displayDimBrightness - Display dim brightness (0-100)
|
|
76
|
+
* @property {number} displayDimTimeout - Display dim timeout in seconds
|
|
77
|
+
* @property {boolean} headphonesVolumeLimited - Whether headphones volume is limited
|
|
78
|
+
* @property {12 | 24} hourFormat - Hour format
|
|
79
|
+
* @property {string} locale - Device locale
|
|
80
|
+
* @property {string} logLevel - Log level
|
|
81
|
+
* @property {number} maxVolumeLimit - Max volume limit (0-16)
|
|
82
|
+
* @property {string} nightAmbientColour - Night ambient light color (hex code)
|
|
83
|
+
* @property {number | null} nightDisplayBrightness - Night brightness (0-100), null when auto
|
|
84
|
+
* @property {boolean} nightDisplayBrightnessAuto - Whether night brightness is auto
|
|
85
|
+
* @property {number} nightMaxVolumeLimit - Night max volume limit (0-16)
|
|
86
|
+
* @property {string} nightTime - Night mode start time
|
|
87
|
+
* @property {string} nightYotoDaily - Night mode Yoto Daily card path
|
|
88
|
+
* @property {string | null} nightYotoRadio - Night mode Yoto Radio card path
|
|
89
|
+
* @property {boolean} nightYotoRadioEnabled - Whether night Yoto Radio is enabled
|
|
90
|
+
* @property {boolean} nightSoundsOff - Night sounds off
|
|
91
|
+
* @property {boolean} pausePowerButton - Pause on power button press
|
|
92
|
+
* @property {boolean} pauseVolumeDown - Pause on volume down press
|
|
93
|
+
* @property {boolean} repeatAll - Repeat all tracks
|
|
94
|
+
* @property {boolean} showDiagnostics - Show diagnostics
|
|
95
|
+
* @property {number} shutdownTimeout - Shutdown timeout in seconds
|
|
96
|
+
* @property {number} systemVolume - System volume level (0-100 percent)
|
|
97
|
+
* @property {string} timezone - Timezone setting (empty string if not set)
|
|
98
|
+
* @property {string} volumeLevel - Volume level preset
|
|
99
|
+
*/
|
|
100
|
+
export const YotoDeviceModelConfigType: {};
|
|
61
101
|
/**
|
|
62
102
|
* Playback state from MQTT events
|
|
63
103
|
* @typedef {Object} YotoPlaybackState
|
|
64
104
|
* @property {string | null} cardId - Currently playing card ID TODO: Figure out name of card
|
|
65
105
|
* @property {string | null} source - Playback source (e.g., 'card', 'remote', 'MQTT') TODO: Figure out what 'mqtt' source means. Card means card, remote means remotly played card.
|
|
66
|
-
* @property {
|
|
106
|
+
* @property {PlaybackStatus | null} playbackStatus - Playback status
|
|
67
107
|
* @property {string | null} trackTitle - Current track title
|
|
68
108
|
* @property {string | null} trackKey - Current track key
|
|
69
109
|
* @property {string | null} chapterTitle - Current chapter title
|
|
@@ -80,7 +120,7 @@ export const YotoPlaybackStateType: {};
|
|
|
80
120
|
* Complete device client state
|
|
81
121
|
* @typedef {Object} YotoDeviceClientState
|
|
82
122
|
* @property {YotoDevice} device - Basic device information
|
|
83
|
-
* @property {
|
|
123
|
+
* @property {YotoDeviceModelConfig} config - Device configuration (always initialized)
|
|
84
124
|
* @property {YotoDeviceShortcuts} shortcuts - Button shortcuts (always initialized)
|
|
85
125
|
* @property {YotoDeviceStatus} status - Current device status (always initialized)
|
|
86
126
|
* @property {YotoPlaybackState} playback - Current playback state (always initialized)
|
|
@@ -110,7 +150,7 @@ export const YotoPlaybackStateType: {};
|
|
|
110
150
|
/**
|
|
111
151
|
* Device client initialization options
|
|
112
152
|
* @typedef {Object} YotoDeviceModelOptions
|
|
113
|
-
* @property {
|
|
153
|
+
* @property {Omit<YotoMqttOptions, 'deviceId' | 'token' >} [yotoDeviceMqttOptions] - MQTT.js client options to pass through to factory
|
|
114
154
|
* @property {number} [httpPollIntervalMs=600000] - Background HTTP polling interval for config+status sync (default: 10 minutes)
|
|
115
155
|
*/
|
|
116
156
|
/**
|
|
@@ -127,11 +167,23 @@ export const YotoPlaybackStateType: {};
|
|
|
127
167
|
* @property {number | null} [timeSinceLastSeen] - Time since last seen in ms (only present for 'timeout' reason)
|
|
128
168
|
* @property {string} [source] - Source of status update (only present for 'http-status' reason)
|
|
129
169
|
*/
|
|
170
|
+
/**
|
|
171
|
+
* MQTT disconnect event metadata (from MQTT disconnect packet)
|
|
172
|
+
* @typedef {YotoMqttClientDisconnectMetadata} YotoMqttDisconnectMetadata
|
|
173
|
+
*/
|
|
174
|
+
/**
|
|
175
|
+
* MQTT connect event metadata (from MQTT CONNACK)
|
|
176
|
+
* @typedef {IConnackPacket} YotoMqttConnectMetadata
|
|
177
|
+
*/
|
|
178
|
+
/**
|
|
179
|
+
* MQTT close event metadata (from connection close)
|
|
180
|
+
* @typedef {YotoMqttClientCloseMetadata} YotoMqttCloseMetadata
|
|
181
|
+
*/
|
|
130
182
|
/**
|
|
131
183
|
* Started event metadata
|
|
132
184
|
* @typedef {Object} YotoDeviceStartedMetadata
|
|
133
185
|
* @property {YotoDevice} device - Device information
|
|
134
|
-
* @property {
|
|
186
|
+
* @property {YotoDeviceModelConfig} config - Device configuration
|
|
135
187
|
* @property {YotoDeviceShortcuts} shortcuts - Device shortcuts
|
|
136
188
|
* @property {YotoDeviceStatus} status - Device status
|
|
137
189
|
* @property {YotoPlaybackState} playback - Playback state
|
|
@@ -144,12 +196,21 @@ export const YotoPlaybackStateType: {};
|
|
|
144
196
|
* 'started': [YotoDeviceStartedMetadata],
|
|
145
197
|
* 'stopped': [],
|
|
146
198
|
* 'statusUpdate': [YotoDeviceStatus, string, Set<keyof YotoDeviceStatus>],
|
|
147
|
-
* 'configUpdate': [
|
|
199
|
+
* 'configUpdate': [YotoDeviceModelConfig, Set<keyof YotoDeviceModelConfig>],
|
|
148
200
|
* 'playbackUpdate': [YotoPlaybackState, Set<keyof YotoPlaybackState>],
|
|
149
201
|
* 'online': [YotoDeviceOnlineMetadata],
|
|
150
202
|
* 'offline': [YotoDeviceOfflineMetadata],
|
|
151
|
-
* '
|
|
152
|
-
* '
|
|
203
|
+
* 'mqttConnect': [YotoMqttConnectMetadata],
|
|
204
|
+
* 'mqttDisconnect': [YotoMqttDisconnectMetadata],
|
|
205
|
+
* 'mqttClose': [YotoMqttCloseMetadata],
|
|
206
|
+
* 'mqttReconnect': [],
|
|
207
|
+
* 'mqttOffline': [],
|
|
208
|
+
* 'mqttEnd': [],
|
|
209
|
+
* 'mqttStatus': [string, YotoStatusMessage],
|
|
210
|
+
* 'mqttEvents': [string, YotoEventsMessage],
|
|
211
|
+
* 'mqttStatusLegacy': [string, YotoStatusLegacyMessage],
|
|
212
|
+
* 'mqttResponse': [string, YotoResponseMessage],
|
|
213
|
+
* 'mqttUnknown': [string, unknown],
|
|
153
214
|
* 'error': [Error]
|
|
154
215
|
* }} YotoDeviceModelEventMap
|
|
155
216
|
*/
|
|
@@ -171,8 +232,17 @@ export const YotoPlaybackStateType: {};
|
|
|
171
232
|
* - 'playbackUpdate' - Emitted when playback state changes, passes (playback, changedFields)
|
|
172
233
|
* - 'online' - Emitted when device comes online, passes metadata with reason and optional upTime
|
|
173
234
|
* - 'offline' - Emitted when device goes offline, passes metadata with reason and optional shutDownReason or timeSinceLastSeen
|
|
174
|
-
* - '
|
|
175
|
-
* - '
|
|
235
|
+
* - 'mqttConnect' - Emitted when MQTT client connects, passes CONNACK metadata
|
|
236
|
+
* - 'mqttDisconnect' - Emitted when MQTT disconnect packet received, passes metadata with disconnect packet
|
|
237
|
+
* - 'mqttClose' - Emitted when MQTT connection closes, passes metadata with close reason
|
|
238
|
+
* - 'mqttReconnect' - Emitted when MQTT client is reconnecting
|
|
239
|
+
* - 'mqttOffline' - Emitted when MQTT client goes offline
|
|
240
|
+
* - 'mqttEnd' - Emitted when MQTT client end is called
|
|
241
|
+
* - 'mqttStatus' - Emitted with raw MQTT status messages, passes (topic, message)
|
|
242
|
+
* - 'mqttEvents' - Emitted with raw MQTT events messages, passes (topic, message)
|
|
243
|
+
* - 'mqttStatusLegacy' - Emitted with raw legacy MQTT status messages, passes (topic, message)
|
|
244
|
+
* - 'mqttResponse' - Emitted with raw MQTT response messages, passes (topic, message)
|
|
245
|
+
* - 'mqttUnknown' - Emitted with unknown MQTT messages, passes (topic, message)
|
|
176
246
|
* - 'error' - Emitted when an error occurs, passes error
|
|
177
247
|
*
|
|
178
248
|
* @extends {EventEmitter<YotoDeviceModelEventMap>}
|
|
@@ -210,9 +280,9 @@ export class YotoDeviceModel extends EventEmitter<YotoDeviceModelEventMap> {
|
|
|
210
280
|
get status(): YotoDeviceStatus;
|
|
211
281
|
/**
|
|
212
282
|
* Get device configuration
|
|
213
|
-
* @returns {
|
|
283
|
+
* @returns {YotoDeviceModelConfig}
|
|
214
284
|
*/
|
|
215
|
-
get config():
|
|
285
|
+
get config(): YotoDeviceModelConfig;
|
|
216
286
|
/**
|
|
217
287
|
* Get device shortcuts
|
|
218
288
|
* @returns {YotoDeviceShortcuts }
|
|
@@ -274,6 +344,148 @@ export class YotoDeviceModel extends EventEmitter<YotoDeviceModelEventMap> {
|
|
|
274
344
|
* @returns {YotoMqttClient | null}
|
|
275
345
|
*/
|
|
276
346
|
get mqttClient(): YotoMqttClient | null;
|
|
347
|
+
/**
|
|
348
|
+
* Request current events from device over MQTT
|
|
349
|
+
* @param {string} [body=''] - Optional request body for tracking/identification
|
|
350
|
+
* @returns {Promise<void>}
|
|
351
|
+
*/
|
|
352
|
+
requestEvents(body?: string): Promise<void>;
|
|
353
|
+
/**
|
|
354
|
+
* Request current status from device over MQTT
|
|
355
|
+
* @param {string} [body=''] - Optional request body for tracking/identification
|
|
356
|
+
* @returns {Promise<void>}
|
|
357
|
+
*/
|
|
358
|
+
requestStatus(body?: string): Promise<void>;
|
|
359
|
+
/**
|
|
360
|
+
* Set device volume over MQTT
|
|
361
|
+
* @param {number} volume - Volume level integer [0-16]
|
|
362
|
+
* @returns {Promise<void>}
|
|
363
|
+
*/
|
|
364
|
+
setVolume(volume: number): Promise<void>;
|
|
365
|
+
/**
|
|
366
|
+
* Set ambient light color over MQTT
|
|
367
|
+
* @param {number} r - Red intensity [0-255]
|
|
368
|
+
* @param {number} g - Green intensity [0-255]
|
|
369
|
+
* @param {number} b - Blue intensity [0-255]
|
|
370
|
+
* @returns {Promise<void>}
|
|
371
|
+
*/
|
|
372
|
+
setAmbient(r: number, g: number, b: number): Promise<void>;
|
|
373
|
+
/**
|
|
374
|
+
* Set ambient light color from hex over MQTT
|
|
375
|
+
* @param {string} hexColor - Hex color string (e.g., "#FF0000")
|
|
376
|
+
* @returns {Promise<void>}
|
|
377
|
+
*/
|
|
378
|
+
setAmbientHex(hexColor: string): Promise<void>;
|
|
379
|
+
/**
|
|
380
|
+
* Set sleep timer over MQTT
|
|
381
|
+
* @param {number} seconds - Timer duration in seconds (0 to disable)
|
|
382
|
+
* @returns {Promise<void>}
|
|
383
|
+
*/
|
|
384
|
+
setSleepTimer(seconds: number): Promise<void>;
|
|
385
|
+
/**
|
|
386
|
+
* Reboot device over MQTT
|
|
387
|
+
* @returns {Promise<void>}
|
|
388
|
+
*/
|
|
389
|
+
reboot(): Promise<void>;
|
|
390
|
+
/**
|
|
391
|
+
* Start card playback over MQTT
|
|
392
|
+
* @param {Object} options - Card start options
|
|
393
|
+
* @param {string} options.uri - Card URI (e.g., "https://yoto.io/<cardID>")
|
|
394
|
+
* @param {string} [options.chapterKey] - Chapter to start from
|
|
395
|
+
* @param {string} [options.trackKey] - Track to start from
|
|
396
|
+
* @param {number} [options.secondsIn] - Playback start offset in seconds
|
|
397
|
+
* @param {number} [options.cutOff] - Playback stop offset in seconds
|
|
398
|
+
* @param {boolean} [options.anyButtonStop] - Whether button press stops playback
|
|
399
|
+
* @returns {Promise<void>}
|
|
400
|
+
*/
|
|
401
|
+
startCard(options: {
|
|
402
|
+
uri: string;
|
|
403
|
+
chapterKey?: string | undefined;
|
|
404
|
+
trackKey?: string | undefined;
|
|
405
|
+
secondsIn?: number | undefined;
|
|
406
|
+
cutOff?: number | undefined;
|
|
407
|
+
anyButtonStop?: boolean | undefined;
|
|
408
|
+
}): Promise<void>;
|
|
409
|
+
/**
|
|
410
|
+
* Stop card playback over MQTT
|
|
411
|
+
* @returns {Promise<void>}
|
|
412
|
+
*/
|
|
413
|
+
stopCard(): Promise<void>;
|
|
414
|
+
/**
|
|
415
|
+
* Pause card playback over MQTT
|
|
416
|
+
* @returns {Promise<void>}
|
|
417
|
+
*/
|
|
418
|
+
pauseCard(): Promise<void>;
|
|
419
|
+
/**
|
|
420
|
+
* Resume card playback over MQTT
|
|
421
|
+
* @returns {Promise<void>}
|
|
422
|
+
*/
|
|
423
|
+
resumeCard(): Promise<void>;
|
|
424
|
+
/**
|
|
425
|
+
* Turn Bluetooth on over MQTT
|
|
426
|
+
* @param {Object} [options] - Bluetooth options
|
|
427
|
+
* @param {string} [options.action] - Bluetooth action
|
|
428
|
+
* @param {boolean | string} [options.mode] - Bluetooth mode
|
|
429
|
+
* @param {number} [options.rssi] - RSSI threshold
|
|
430
|
+
* @param {string} [options.name] - Target device name
|
|
431
|
+
* @param {string} [options.mac] - Target device MAC
|
|
432
|
+
* @returns {Promise<void>}
|
|
433
|
+
*/
|
|
434
|
+
bluetoothOn(options?: {
|
|
435
|
+
action?: string | undefined;
|
|
436
|
+
mode?: string | boolean | undefined;
|
|
437
|
+
rssi?: number | undefined;
|
|
438
|
+
name?: string | undefined;
|
|
439
|
+
mac?: string | undefined;
|
|
440
|
+
}): Promise<void>;
|
|
441
|
+
/**
|
|
442
|
+
* Turn Bluetooth off over MQTT
|
|
443
|
+
* @returns {Promise<void>}
|
|
444
|
+
*/
|
|
445
|
+
bluetoothOff(): Promise<void>;
|
|
446
|
+
/**
|
|
447
|
+
* Enable Bluetooth speaker mode over MQTT
|
|
448
|
+
* @returns {Promise<void>}
|
|
449
|
+
*/
|
|
450
|
+
bluetoothSpeakerMode(): Promise<void>;
|
|
451
|
+
/**
|
|
452
|
+
* Enable Bluetooth audio source mode over MQTT
|
|
453
|
+
* @returns {Promise<void>}
|
|
454
|
+
*/
|
|
455
|
+
bluetoothAudioSourceMode(): Promise<void>;
|
|
456
|
+
/**
|
|
457
|
+
* Delete all Bluetooth bonds over MQTT
|
|
458
|
+
* @returns {Promise<void>}
|
|
459
|
+
*/
|
|
460
|
+
bluetoothDeleteBonds(): Promise<void>;
|
|
461
|
+
/**
|
|
462
|
+
* Connect to Bluetooth device over MQTT
|
|
463
|
+
* @returns {Promise<void>}
|
|
464
|
+
*/
|
|
465
|
+
bluetoothConnect(): Promise<void>;
|
|
466
|
+
/**
|
|
467
|
+
* Disconnect Bluetooth device over MQTT
|
|
468
|
+
* @returns {Promise<void>}
|
|
469
|
+
*/
|
|
470
|
+
bluetoothDisconnect(): Promise<void>;
|
|
471
|
+
/**
|
|
472
|
+
* Get Bluetooth state over MQTT
|
|
473
|
+
* @returns {Promise<void>}
|
|
474
|
+
*/
|
|
475
|
+
bluetoothGetState(): Promise<void>;
|
|
476
|
+
/**
|
|
477
|
+
* Preview display icon over MQTT
|
|
478
|
+
* @param {Object} options - Display preview options
|
|
479
|
+
* @param {string} options.uri - Icon URI
|
|
480
|
+
* @param {number} options.timeout - Display duration in seconds
|
|
481
|
+
* @param {boolean} options.animated - Whether icon is animated
|
|
482
|
+
* @returns {Promise<void>}
|
|
483
|
+
*/
|
|
484
|
+
displayPreview(options: {
|
|
485
|
+
uri: string;
|
|
486
|
+
timeout: number;
|
|
487
|
+
animated: boolean;
|
|
488
|
+
}): Promise<void>;
|
|
277
489
|
/**
|
|
278
490
|
* Refresh device status from HTTP API
|
|
279
491
|
* This is primarily used as a fallback when device is offline
|
|
@@ -281,15 +493,15 @@ export class YotoDeviceModel extends EventEmitter<YotoDeviceModelEventMap> {
|
|
|
281
493
|
*/
|
|
282
494
|
/**
|
|
283
495
|
* Refresh device config from HTTP API
|
|
284
|
-
* @returns {Promise<
|
|
496
|
+
* @returns {Promise<YotoDeviceModelConfig>}
|
|
285
497
|
*/
|
|
286
|
-
refreshConfig(): Promise<
|
|
498
|
+
refreshConfig(): Promise<YotoDeviceModelConfig>;
|
|
287
499
|
/**
|
|
288
500
|
* Update device configuration
|
|
289
|
-
* @param {Partial<
|
|
501
|
+
* @param {Partial<YotoDeviceModelConfig>} configUpdate - Configuration changes
|
|
290
502
|
* @returns {Promise<void>}
|
|
291
503
|
*/
|
|
292
|
-
updateConfig(configUpdate: Partial<
|
|
504
|
+
updateConfig(configUpdate: Partial<YotoDeviceModelConfig>): Promise<void>;
|
|
293
505
|
/**
|
|
294
506
|
* Send a device command via HTTP API
|
|
295
507
|
* @param {YotoDeviceCommand} command - Command to send
|
|
@@ -340,7 +552,7 @@ export type YotoDeviceStatus = {
|
|
|
340
552
|
*/
|
|
341
553
|
volume: number;
|
|
342
554
|
/**
|
|
343
|
-
* - Maximum volume limit (0-16 scale)
|
|
555
|
+
* - Active Maximum volume (depending on day or night) limit (0-16 scale)
|
|
344
556
|
*/
|
|
345
557
|
maxVolume: number;
|
|
346
558
|
/**
|
|
@@ -412,6 +624,154 @@ export type YotoDeviceStatus = {
|
|
|
412
624
|
*/
|
|
413
625
|
source: string;
|
|
414
626
|
};
|
|
627
|
+
/**
|
|
628
|
+
* Canonical device config - normalized format for HTTP config payloads
|
|
629
|
+
*
|
|
630
|
+
* String booleans and numeric strings are normalized. Brightness "auto" values
|
|
631
|
+
* are split into value + boolean flag.
|
|
632
|
+
*/
|
|
633
|
+
export type YotoDeviceModelConfig = {
|
|
634
|
+
/**
|
|
635
|
+
* - Alarm list entries
|
|
636
|
+
*/
|
|
637
|
+
alarms: string[];
|
|
638
|
+
/**
|
|
639
|
+
* - Ambient light color (hex code)
|
|
640
|
+
*/
|
|
641
|
+
ambientColour: string;
|
|
642
|
+
/**
|
|
643
|
+
* - Bluetooth enabled state
|
|
644
|
+
*/
|
|
645
|
+
bluetoothEnabled: boolean;
|
|
646
|
+
/**
|
|
647
|
+
* - Bluetooth headphones enabled
|
|
648
|
+
*/
|
|
649
|
+
btHeadphonesEnabled: boolean;
|
|
650
|
+
/**
|
|
651
|
+
* - Clock face style
|
|
652
|
+
*/
|
|
653
|
+
clockFace: string;
|
|
654
|
+
/**
|
|
655
|
+
* - Day brightness (0-100), null when auto
|
|
656
|
+
*/
|
|
657
|
+
dayDisplayBrightness: number | null;
|
|
658
|
+
/**
|
|
659
|
+
* - Whether day brightness is auto
|
|
660
|
+
*/
|
|
661
|
+
dayDisplayBrightnessAuto: boolean;
|
|
662
|
+
/**
|
|
663
|
+
* - Day mode start time
|
|
664
|
+
*/
|
|
665
|
+
dayTime: string;
|
|
666
|
+
/**
|
|
667
|
+
* - Day mode Yoto Daily card path
|
|
668
|
+
*/
|
|
669
|
+
dayYotoDaily: string;
|
|
670
|
+
/**
|
|
671
|
+
* - Day mode Yoto Radio card path
|
|
672
|
+
*/
|
|
673
|
+
dayYotoRadio: string;
|
|
674
|
+
/**
|
|
675
|
+
* - Day sounds off
|
|
676
|
+
*/
|
|
677
|
+
daySoundsOff: boolean;
|
|
678
|
+
/**
|
|
679
|
+
* - Display dim brightness (0-100)
|
|
680
|
+
*/
|
|
681
|
+
displayDimBrightness: number;
|
|
682
|
+
/**
|
|
683
|
+
* - Display dim timeout in seconds
|
|
684
|
+
*/
|
|
685
|
+
displayDimTimeout: number;
|
|
686
|
+
/**
|
|
687
|
+
* - Whether headphones volume is limited
|
|
688
|
+
*/
|
|
689
|
+
headphonesVolumeLimited: boolean;
|
|
690
|
+
/**
|
|
691
|
+
* - Hour format
|
|
692
|
+
*/
|
|
693
|
+
hourFormat: 12 | 24;
|
|
694
|
+
/**
|
|
695
|
+
* - Device locale
|
|
696
|
+
*/
|
|
697
|
+
locale: string;
|
|
698
|
+
/**
|
|
699
|
+
* - Log level
|
|
700
|
+
*/
|
|
701
|
+
logLevel: string;
|
|
702
|
+
/**
|
|
703
|
+
* - Max volume limit (0-16)
|
|
704
|
+
*/
|
|
705
|
+
maxVolumeLimit: number;
|
|
706
|
+
/**
|
|
707
|
+
* - Night ambient light color (hex code)
|
|
708
|
+
*/
|
|
709
|
+
nightAmbientColour: string;
|
|
710
|
+
/**
|
|
711
|
+
* - Night brightness (0-100), null when auto
|
|
712
|
+
*/
|
|
713
|
+
nightDisplayBrightness: number | null;
|
|
714
|
+
/**
|
|
715
|
+
* - Whether night brightness is auto
|
|
716
|
+
*/
|
|
717
|
+
nightDisplayBrightnessAuto: boolean;
|
|
718
|
+
/**
|
|
719
|
+
* - Night max volume limit (0-16)
|
|
720
|
+
*/
|
|
721
|
+
nightMaxVolumeLimit: number;
|
|
722
|
+
/**
|
|
723
|
+
* - Night mode start time
|
|
724
|
+
*/
|
|
725
|
+
nightTime: string;
|
|
726
|
+
/**
|
|
727
|
+
* - Night mode Yoto Daily card path
|
|
728
|
+
*/
|
|
729
|
+
nightYotoDaily: string;
|
|
730
|
+
/**
|
|
731
|
+
* - Night mode Yoto Radio card path
|
|
732
|
+
*/
|
|
733
|
+
nightYotoRadio: string | null;
|
|
734
|
+
/**
|
|
735
|
+
* - Whether night Yoto Radio is enabled
|
|
736
|
+
*/
|
|
737
|
+
nightYotoRadioEnabled: boolean;
|
|
738
|
+
/**
|
|
739
|
+
* - Night sounds off
|
|
740
|
+
*/
|
|
741
|
+
nightSoundsOff: boolean;
|
|
742
|
+
/**
|
|
743
|
+
* - Pause on power button press
|
|
744
|
+
*/
|
|
745
|
+
pausePowerButton: boolean;
|
|
746
|
+
/**
|
|
747
|
+
* - Pause on volume down press
|
|
748
|
+
*/
|
|
749
|
+
pauseVolumeDown: boolean;
|
|
750
|
+
/**
|
|
751
|
+
* - Repeat all tracks
|
|
752
|
+
*/
|
|
753
|
+
repeatAll: boolean;
|
|
754
|
+
/**
|
|
755
|
+
* - Show diagnostics
|
|
756
|
+
*/
|
|
757
|
+
showDiagnostics: boolean;
|
|
758
|
+
/**
|
|
759
|
+
* - Shutdown timeout in seconds
|
|
760
|
+
*/
|
|
761
|
+
shutdownTimeout: number;
|
|
762
|
+
/**
|
|
763
|
+
* - System volume level (0-100 percent)
|
|
764
|
+
*/
|
|
765
|
+
systemVolume: number;
|
|
766
|
+
/**
|
|
767
|
+
* - Timezone setting (empty string if not set)
|
|
768
|
+
*/
|
|
769
|
+
timezone: string;
|
|
770
|
+
/**
|
|
771
|
+
* - Volume level preset
|
|
772
|
+
*/
|
|
773
|
+
volumeLevel: string;
|
|
774
|
+
};
|
|
415
775
|
/**
|
|
416
776
|
* Playback state from MQTT events
|
|
417
777
|
*/
|
|
@@ -427,7 +787,7 @@ export type YotoPlaybackState = {
|
|
|
427
787
|
/**
|
|
428
788
|
* - Playback status
|
|
429
789
|
*/
|
|
430
|
-
playbackStatus:
|
|
790
|
+
playbackStatus: PlaybackStatus | null;
|
|
431
791
|
/**
|
|
432
792
|
* - Current track title
|
|
433
793
|
*/
|
|
@@ -480,7 +840,7 @@ export type YotoDeviceClientState = {
|
|
|
480
840
|
/**
|
|
481
841
|
* - Device configuration (always initialized)
|
|
482
842
|
*/
|
|
483
|
-
config:
|
|
843
|
+
config: YotoDeviceModelConfig;
|
|
484
844
|
/**
|
|
485
845
|
* - Button shortcuts (always initialized)
|
|
486
846
|
*/
|
|
@@ -556,7 +916,7 @@ export type YotoDeviceModelOptions = {
|
|
|
556
916
|
/**
|
|
557
917
|
* - MQTT.js client options to pass through to factory
|
|
558
918
|
*/
|
|
559
|
-
|
|
919
|
+
yotoDeviceMqttOptions?: Omit<YotoMqttOptions, "deviceId" | "token">;
|
|
560
920
|
/**
|
|
561
921
|
* - Background HTTP polling interval for config+status sync (default: 10 minutes)
|
|
562
922
|
*/
|
|
@@ -596,6 +956,18 @@ export type YotoDeviceOfflineMetadata = {
|
|
|
596
956
|
*/
|
|
597
957
|
source?: string;
|
|
598
958
|
};
|
|
959
|
+
/**
|
|
960
|
+
* MQTT disconnect event metadata (from MQTT disconnect packet)
|
|
961
|
+
*/
|
|
962
|
+
export type YotoMqttDisconnectMetadata = YotoMqttClientDisconnectMetadata;
|
|
963
|
+
/**
|
|
964
|
+
* MQTT connect event metadata (from MQTT CONNACK)
|
|
965
|
+
*/
|
|
966
|
+
export type YotoMqttConnectMetadata = IConnackPacket;
|
|
967
|
+
/**
|
|
968
|
+
* MQTT close event metadata (from connection close)
|
|
969
|
+
*/
|
|
970
|
+
export type YotoMqttCloseMetadata = YotoMqttClientCloseMetadata;
|
|
599
971
|
/**
|
|
600
972
|
* Started event metadata
|
|
601
973
|
*/
|
|
@@ -607,7 +979,7 @@ export type YotoDeviceStartedMetadata = {
|
|
|
607
979
|
/**
|
|
608
980
|
* - Device configuration
|
|
609
981
|
*/
|
|
610
|
-
config:
|
|
982
|
+
config: YotoDeviceModelConfig;
|
|
611
983
|
/**
|
|
612
984
|
* - Device shortcuts
|
|
613
985
|
*/
|
|
@@ -636,21 +1008,37 @@ export type YotoDeviceModelEventMap = {
|
|
|
636
1008
|
"started": [YotoDeviceStartedMetadata];
|
|
637
1009
|
"stopped": [];
|
|
638
1010
|
"statusUpdate": [YotoDeviceStatus, string, Set<keyof YotoDeviceStatus>];
|
|
639
|
-
"configUpdate": [
|
|
1011
|
+
"configUpdate": [YotoDeviceModelConfig, Set<keyof YotoDeviceModelConfig>];
|
|
640
1012
|
"playbackUpdate": [YotoPlaybackState, Set<keyof YotoPlaybackState>];
|
|
641
1013
|
"online": [YotoDeviceOnlineMetadata];
|
|
642
1014
|
"offline": [YotoDeviceOfflineMetadata];
|
|
643
|
-
"
|
|
644
|
-
"
|
|
1015
|
+
"mqttConnect": [YotoMqttConnectMetadata];
|
|
1016
|
+
"mqttDisconnect": [YotoMqttDisconnectMetadata];
|
|
1017
|
+
"mqttClose": [YotoMqttCloseMetadata];
|
|
1018
|
+
"mqttReconnect": [];
|
|
1019
|
+
"mqttOffline": [];
|
|
1020
|
+
"mqttEnd": [];
|
|
1021
|
+
"mqttStatus": [string, YotoStatusMessage];
|
|
1022
|
+
"mqttEvents": [string, YotoEventsMessage];
|
|
1023
|
+
"mqttStatusLegacy": [string, YotoStatusLegacyMessage];
|
|
1024
|
+
"mqttResponse": [string, YotoResponseMessage];
|
|
1025
|
+
"mqttUnknown": [string, unknown];
|
|
645
1026
|
"error": [Error];
|
|
646
1027
|
};
|
|
647
1028
|
import { EventEmitter } from 'events';
|
|
648
1029
|
import type { YotoDevice } from './api-endpoints/devices.js';
|
|
649
|
-
import type { YotoDeviceConfig } from './api-endpoints/devices.js';
|
|
650
1030
|
import type { YotoDeviceShortcuts } from './api-endpoints/devices.js';
|
|
651
1031
|
import type { YotoMqttClient } from './mqtt/client.js';
|
|
652
1032
|
import type { YotoDeviceCommand } from './api-endpoints/devices.js';
|
|
653
1033
|
import type { YotoDeviceCommandResponse } from './api-endpoints/devices.js';
|
|
654
1034
|
import type { YotoClient } from './api-client.js';
|
|
655
|
-
import type {
|
|
1035
|
+
import type { PlaybackStatus } from './mqtt/client.js';
|
|
1036
|
+
import type { YotoMqttOptions } from './mqtt/factory.js';
|
|
1037
|
+
import type { YotoMqttClientDisconnectMetadata } from './mqtt/client.js';
|
|
1038
|
+
import type { IConnackPacket } from 'mqtt';
|
|
1039
|
+
import type { YotoMqttClientCloseMetadata } from './mqtt/client.js';
|
|
1040
|
+
import type { YotoStatusMessage } from './mqtt/client.js';
|
|
1041
|
+
import type { YotoEventsMessage } from './mqtt/client.js';
|
|
1042
|
+
import type { YotoStatusLegacyMessage } from './mqtt/client.js';
|
|
1043
|
+
import type { YotoResponseMessage } from './mqtt/client.js';
|
|
656
1044
|
//# sourceMappingURL=yoto-device.d.ts.map
|
package/lib/yoto-device.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yoto-device.d.ts","sourceRoot":"","sources":["yoto-device.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"yoto-device.d.ts","sourceRoot":"","sources":["yoto-device.js"],"names":[],"mappings":"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"}
|