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.
Files changed (52) hide show
  1. package/README.md +73 -40
  2. package/bin/auth.js +4 -3
  3. package/bin/device-model.js +25 -5
  4. package/bin/device-tui.js +25 -3
  5. package/bin/devices.js +25 -9
  6. package/bin/lib/cli-helpers.d.ts.map +1 -1
  7. package/bin/lib/cli-helpers.js +3 -1
  8. package/bin/lib/token-helpers.d.ts +4 -2
  9. package/bin/lib/token-helpers.d.ts.map +1 -1
  10. package/bin/lib/token-helpers.js +9 -8
  11. package/bin/refresh-token.js +4 -2
  12. package/bin/token-info.js +2 -2
  13. package/lib/api-client.d.ts +11 -10
  14. package/lib/api-client.d.ts.map +1 -1
  15. package/lib/api-client.js +12 -14
  16. package/lib/api-endpoints/auth.test.js +4 -4
  17. package/lib/api-endpoints/content.test.js +32 -32
  18. package/lib/api-endpoints/devices.d.ts +4 -4
  19. package/lib/api-endpoints/devices.js +2 -2
  20. package/lib/api-endpoints/devices.test.js +45 -45
  21. package/lib/api-endpoints/endpoint-test-helpers.d.ts +3 -4
  22. package/lib/api-endpoints/endpoint-test-helpers.d.ts.map +1 -1
  23. package/lib/api-endpoints/endpoint-test-helpers.js +21 -5
  24. package/lib/api-endpoints/family-library-groups.d.ts +3 -3
  25. package/lib/api-endpoints/family-library-groups.d.ts.map +1 -1
  26. package/lib/api-endpoints/family-library-groups.js +3 -3
  27. package/lib/api-endpoints/family-library-groups.test.js +29 -29
  28. package/lib/api-endpoints/family.test.js +11 -11
  29. package/lib/api-endpoints/icons.test.js +14 -14
  30. package/lib/mqtt/client.d.ts +123 -48
  31. package/lib/mqtt/client.d.ts.map +1 -1
  32. package/lib/mqtt/client.js +131 -49
  33. package/lib/mqtt/factory.d.ts +12 -5
  34. package/lib/mqtt/factory.d.ts.map +1 -1
  35. package/lib/mqtt/factory.js +39 -11
  36. package/lib/mqtt/index.js +2 -1
  37. package/lib/mqtt/mqtt.test.js +25 -22
  38. package/lib/test-helpers/device-model-test-helpers.d.ts +29 -0
  39. package/lib/test-helpers/device-model-test-helpers.d.ts.map +1 -0
  40. package/lib/test-helpers/device-model-test-helpers.js +116 -0
  41. package/lib/token.d.ts +44 -2
  42. package/lib/token.d.ts.map +1 -1
  43. package/lib/token.js +142 -2
  44. package/lib/yoto-account.d.ts +339 -9
  45. package/lib/yoto-account.d.ts.map +1 -1
  46. package/lib/yoto-account.js +411 -39
  47. package/lib/yoto-account.test.js +139 -0
  48. package/lib/yoto-device.d.ts +418 -30
  49. package/lib/yoto-device.d.ts.map +1 -1
  50. package/lib/yoto-device.js +670 -104
  51. package/lib/yoto-device.test.js +88 -0
  52. package/package.json +1 -1
@@ -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 {'playing' | 'paused' | 'stopped' | 'loading' | string | null} playbackStatus - Playback status
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 {YotoDeviceConfig} config - Device configuration (always initialized)
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 {MqttClientOptions} [mqttOptions] - MQTT.js client options to pass through to factory
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 {YotoDeviceConfig} config - Device configuration
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': [YotoDeviceConfig, Set<keyof YotoDeviceConfig>],
199
+ * 'configUpdate': [YotoDeviceModelConfig, Set<keyof YotoDeviceModelConfig>],
148
200
  * 'playbackUpdate': [YotoPlaybackState, Set<keyof YotoPlaybackState>],
149
201
  * 'online': [YotoDeviceOnlineMetadata],
150
202
  * 'offline': [YotoDeviceOfflineMetadata],
151
- * 'mqttConnected': [],
152
- * 'mqttDisconnected': [],
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
- * - 'mqttConnected' - Emitted when MQTT client connects
175
- * - 'mqttDisconnected' - Emitted when MQTT client disconnects
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 {YotoDeviceConfig}
283
+ * @returns {YotoDeviceModelConfig}
214
284
  */
215
- get config(): YotoDeviceConfig;
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<YotoDeviceConfig>}
496
+ * @returns {Promise<YotoDeviceModelConfig>}
285
497
  */
286
- refreshConfig(): Promise<YotoDeviceConfig>;
498
+ refreshConfig(): Promise<YotoDeviceModelConfig>;
287
499
  /**
288
500
  * Update device configuration
289
- * @param {Partial<YotoDeviceConfig>} configUpdate - Configuration changes
501
+ * @param {Partial<YotoDeviceModelConfig>} configUpdate - Configuration changes
290
502
  * @returns {Promise<void>}
291
503
  */
292
- updateConfig(configUpdate: Partial<YotoDeviceConfig>): Promise<void>;
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: "playing" | "paused" | "stopped" | "loading" | string | null;
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: YotoDeviceConfig;
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
- mqttOptions?: MqttClientOptions;
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: YotoDeviceConfig;
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": [YotoDeviceConfig, Set<keyof YotoDeviceConfig>];
1011
+ "configUpdate": [YotoDeviceModelConfig, Set<keyof YotoDeviceModelConfig>];
640
1012
  "playbackUpdate": [YotoPlaybackState, Set<keyof YotoPlaybackState>];
641
1013
  "online": [YotoDeviceOnlineMetadata];
642
1014
  "offline": [YotoDeviceOfflineMetadata];
643
- "mqttConnected": [];
644
- "mqttDisconnected": [];
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 { MqttClientOptions } from './mqtt/factory.js';
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
@@ -1 +1 @@
1
- {"version":3,"file":"yoto-device.d.ts","sourceRoot":"","sources":["yoto-device.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"yoto-device.d.ts","sourceRoot":"","sources":["yoto-device.js"],"names":[],"mappings":"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"}