@ledvance/ui-biz-bundle 1.1.105 → 1.1.106

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/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "name": "@ledvance/ui-biz-bundle",
5
5
  "pid": [],
6
6
  "uiid": "",
7
- "version": "1.1.105",
7
+ "version": "1.1.106",
8
8
  "scripts": {},
9
9
  "dependencies": {
10
10
  "@ledvance/base": "^1.x",
@@ -29,7 +29,6 @@ const useFormateProgress: (dp: dpItem) => FormateProgressType = (dp) => {
29
29
  interval: 1000,
30
30
  onEnd: () => {
31
31
  initTimerFn()
32
- setCountdown(0)
33
32
  },
34
33
  })
35
34
  const devId = useDeviceId()
@@ -44,5 +44,7 @@ export const ui_biz_routerKey = {
44
44
  'ui_biz_overcharge_switch': 'ui_biz_overcharge_switch',
45
45
  'ui_biz_child_lock': 'ui_biz_child_lock',
46
46
  'ui_biz_remote_control': 'ui_biz_remote_control',
47
- 'ui_biz_switch_gradient': 'ui_biz_switch_gradient'
47
+ 'ui_biz_switch_gradient': 'ui_biz_switch_gradient',
48
+ 'ui_biz_diy_scene_page': 'ui_biz_diy_scene_page',
49
+ 'ui_biz_diy_scene_edit_page': 'ui_biz_diy_scene_edit_page',
48
50
  }
@@ -0,0 +1,438 @@
1
+ import {DiySceneInfo} from '@ledvance/base/src/utils/interface'
2
+ import I18n from "@ledvance/base/src/i18n";
3
+
4
+ export default [{
5
+ // 00650000000000000003e800000000
6
+ id: 101,
7
+ name: I18n.getLang('mood_strip_default_mood_focus'),
8
+ type: 'Static',
9
+ nodes: [],
10
+ speed: 0,
11
+ duration: 0,
12
+ mode: 0,
13
+ h: 0,
14
+ s: 0,
15
+ v: 1000,
16
+ colorTemp: 0,
17
+ brightness: 0,
18
+ }, {
19
+ // 00660000000000000003e800000000
20
+ id: 102,
21
+ name: I18n.getLang('mood_strip_default_mood_lavender'),
22
+ type: 'Static',
23
+ nodes: [],
24
+ speed: 0,
25
+ duration: 0,
26
+ mode: 0,
27
+ h: 0,
28
+ s: 0,
29
+ v: 1000,
30
+ colorTemp: 0,
31
+ brightness: 0,
32
+ }, {
33
+ // 00670000000000000003e800000000
34
+ id: 103,
35
+ name: I18n.getLang('mood_strip_default_mood_lavender_true_colors'),
36
+ type: 'Static',
37
+ nodes: [],
38
+ speed: 0,
39
+ duration: 0,
40
+ mode: 0,
41
+ h: 0,
42
+ s: 0,
43
+ v: 1000,
44
+ colorTemp: 0,
45
+ brightness: 0,
46
+ }, {
47
+ // 00680000000000000003e800000000
48
+ id: 104,
49
+ name: I18n.getLang('mood_strip_default_mood_night_light'),
50
+ type: 'Static',
51
+ nodes: [],
52
+ speed: 0,
53
+ duration: 0,
54
+ mode: 0,
55
+ h: 0,
56
+ s: 0,
57
+ v: 1000,
58
+ colorTemp: 0,
59
+ brightness: 0,
60
+ }, {
61
+ // 00690000000000000003e800000000
62
+ id: 105,
63
+ name: I18n.getLang('mood_strip_default_mood_cozy'),
64
+ type: 'Static',
65
+ nodes: [],
66
+ speed: 0,
67
+ duration: 0,
68
+ mode: 0,
69
+ h: 0,
70
+ s: 0,
71
+ v: 1000,
72
+ colorTemp: 0,
73
+ brightness: 0,
74
+ }, {
75
+ // 006a0000000000000003e800000000
76
+ id: 106,
77
+ name: I18n.getLang('mood_strip_default_mood_atmosphere'),
78
+ type: 'Static',
79
+ nodes: [],
80
+ speed: 0,
81
+ duration: 0,
82
+ mode: 0,
83
+ h: 0,
84
+ s: 0,
85
+ v: 1000,
86
+ colorTemp: 0,
87
+ brightness: 0,
88
+ }, {
89
+ // 006b0000000000000003e800000000
90
+ id: 107,
91
+ name: I18n.getLang('mood_strip_default_mood_relax'),
92
+ type: 'Static',
93
+ nodes: [],
94
+ speed: 0,
95
+ duration: 0,
96
+ mode: 0,
97
+ h: 0,
98
+ s: 0,
99
+ v: 1000,
100
+ colorTemp: 0,
101
+ brightness: 0,
102
+ }, {
103
+ // 006c00000000000000003e80000000
104
+ id: 108,
105
+ name: I18n.getLang('mood_strip_default_mood_sky'),
106
+ type: 'Static',
107
+ nodes: [],
108
+ speed: 0,
109
+ duration: 0,
110
+ mode: 0,
111
+ h: 0,
112
+ s: 0,
113
+ v: 1000,
114
+ colorTemp: 0,
115
+ brightness: 0,
116
+ }, {
117
+ // 00c93232000000000003e800000000
118
+ id: 201,
119
+ name: I18n.getLang('mood_strip_default_mood_ocean'),
120
+ type: 'Dynamic',
121
+ nodes: [],
122
+ speed: 50,
123
+ duration: 50,
124
+ mode: 0,
125
+ h: 0,
126
+ s: 0,
127
+ v: 1000,
128
+ colorTemp: 0,
129
+ brightness: 0,
130
+ }, {
131
+ // 00ca3232000000000003e800000000
132
+ id: 202,
133
+ name: I18n.getLang('mood_strip_default_mood_warmth'),
134
+ type: 'Dynamic',
135
+ nodes: [],
136
+ speed: 50,
137
+ duration: 50,
138
+ mode: 0,
139
+ h: 0,
140
+ s: 0,
141
+ v: 1000,
142
+ colorTemp: 0,
143
+ brightness: 0,
144
+ }, {
145
+ // 00cb3232000000000003e800000000
146
+ id: 203,
147
+ name: I18n.getLang('mood_strip_default_mood_romance'),
148
+ type: 'Dynamic',
149
+ nodes: [],
150
+ speed: 50,
151
+ duration: 50,
152
+ mode: 0,
153
+ h: 0,
154
+ s: 0,
155
+ v: 1000,
156
+ colorTemp: 0,
157
+ brightness: 0,
158
+ }, {
159
+ // 00cc3232000000000003e800000000
160
+ id: 204,
161
+ name: I18n.getLang('mood_strip_default_mood_jungle'),
162
+ type: 'Dynamic',
163
+ nodes: [],
164
+ speed: 50,
165
+ duration: 50,
166
+ mode: 0,
167
+ h: 0,
168
+ s: 0,
169
+ v: 1000,
170
+ colorTemp: 0,
171
+ brightness: 0,
172
+ }, {
173
+ // 00cd3232000000000003e800000000
174
+ id: 205,
175
+ name: I18n.getLang('mood_strip_default_mood_sunset'),
176
+ type: 'Dynamic',
177
+ nodes: [],
178
+ speed: 50,
179
+ duration: 50,
180
+ mode: 0,
181
+ h: 0,
182
+ s: 0,
183
+ v: 1000,
184
+ colorTemp: 0,
185
+ brightness: 0,
186
+ }, {
187
+ // 00ce3232000000000003e800000000
188
+ id: 206,
189
+ name: I18n.getLang('mood_strip_default_mood_missing'),
190
+ type: 'Dynamic',
191
+ nodes: [],
192
+ speed: 50,
193
+ duration: 50,
194
+ mode: 0,
195
+ h: 0,
196
+ s: 0,
197
+ v: 1000,
198
+ colorTemp: 0,
199
+ brightness: 0,
200
+ }, {
201
+ // 00cf3232000000000003e800000000
202
+ id: 207,
203
+ name: I18n.getLang('mood_strip_default_mood_party'),
204
+ type: 'Dynamic',
205
+ nodes: [],
206
+ speed: 50,
207
+ duration: 50,
208
+ mode: 0,
209
+ h: 0,
210
+ s: 0,
211
+ v: 1000,
212
+ colorTemp: 0,
213
+ brightness: 0,
214
+ }, {
215
+ // 00d03232000000000003e800000000
216
+ id: 208,
217
+ name: I18n.getLang('mood_strip_default_mood_rainbow'),
218
+ type: 'Dynamic',
219
+ nodes: [],
220
+ speed: 50,
221
+ duration: 50,
222
+ mode: 0,
223
+ h: 0,
224
+ s: 0,
225
+ v: 1000,
226
+ colorTemp: 0,
227
+ brightness: 0,
228
+ }, {
229
+ // 00d13232000000000003e800000000
230
+ id: 209,
231
+ name: I18n.getLang('mood_strip_default_mood_meditation'),
232
+ type: 'Dynamic',
233
+ nodes: [],
234
+ speed: 50,
235
+ duration: 50,
236
+ mode: 0,
237
+ h: 0,
238
+ s: 0,
239
+ v: 1000,
240
+ colorTemp: 0,
241
+ brightness: 0,
242
+ }, {
243
+ // 00d23232000000000003e800000000
244
+ id: 210,
245
+ name: I18n.getLang('mood_strip_default_mood_wake_time'),
246
+ type: 'Dynamic',
247
+ nodes: [],
248
+ speed: 50,
249
+ duration: 50,
250
+ mode: 0,
251
+ h: 0,
252
+ s: 0,
253
+ v: 1000,
254
+ colorTemp: 0,
255
+ brightness: 0,
256
+ }, {
257
+ // 00d33232000000000003e800000000
258
+ id: 211,
259
+ name: I18n.getLang('mood_strip_default_mood_spring'),
260
+ type: 'Dynamic',
261
+ nodes: [],
262
+ speed: 50,
263
+ duration: 50,
264
+ mode: 0,
265
+ h: 0,
266
+ s: 0,
267
+ v: 1000,
268
+ colorTemp: 0,
269
+ brightness: 0,
270
+ }, {
271
+ // 00d43232000000000003e800000000
272
+ id: 212,
273
+ name: I18n.getLang('mood_strip_default_mood_halloween'),
274
+ type: 'Dynamic',
275
+ nodes: [],
276
+ speed: 50,
277
+ duration: 50,
278
+ mode: 0,
279
+ h: 0,
280
+ s: 0,
281
+ v: 1000,
282
+ colorTemp: 0,
283
+ brightness: 0,
284
+ }, {
285
+ // 00d53232000000000003e800000000
286
+ id: 213,
287
+ name: I18n.getLang('mood_strip_default_mood_christmas'),
288
+ type: 'Dynamic',
289
+ nodes: [],
290
+ speed: 50,
291
+ duration: 50,
292
+ mode: 0,
293
+ h: 0,
294
+ s: 0,
295
+ v: 1000,
296
+ colorTemp: 0,
297
+ brightness: 0,
298
+ }, {
299
+ // 00d63232000000000003e800000000
300
+ id: 214,
301
+ name: I18n.getLang('mood_strip_default_mood_noble'),
302
+ type: 'Dynamic',
303
+ nodes: [],
304
+ speed: 50,
305
+ duration: 50,
306
+ mode: 0,
307
+ h: 0,
308
+ s: 0,
309
+ v: 1000,
310
+ colorTemp: 0,
311
+ brightness: 0,
312
+ }, {
313
+ // 00d73232000000000003e800000000
314
+ id: 215,
315
+ name: I18n.getLang('mood_strip_default_mood_energy'),
316
+ type: 'Dynamic',
317
+ nodes: [],
318
+ speed: 50,
319
+ duration: 50,
320
+ mode: 0,
321
+ h: 0,
322
+ s: 0,
323
+ v: 1000,
324
+ colorTemp: 0,
325
+ brightness: 0,
326
+ }, {
327
+ // 00d83232000000000003e800000000
328
+ id: 216,
329
+ name: I18n.getLang('mood_strip_default_mood_deep_dive'),
330
+ type: 'Dynamic',
331
+ nodes: [],
332
+ speed: 50,
333
+ duration: 50,
334
+ mode: 0,
335
+ h: 0,
336
+ s: 0,
337
+ v: 1000,
338
+ colorTemp: 0,
339
+ brightness: 0,
340
+ }, {
341
+ // 00d93232000000000003e800000000
342
+ id: 217,
343
+ name: I18n.getLang('mood_strip_default_mood_mojito'),
344
+ type: 'Dynamic',
345
+ nodes: [],
346
+ speed: 50,
347
+ duration: 50,
348
+ mode: 0,
349
+ h: 0,
350
+ s: 0,
351
+ v: 1000,
352
+ colorTemp: 0,
353
+ brightness: 0,
354
+ }, {
355
+ // 00da3232000000000003e800000000
356
+ id: 218,
357
+ name: I18n.getLang('mood_strip_default_mood_forest'),
358
+ type: 'Dynamic',
359
+ nodes: [],
360
+ speed: 50,
361
+ duration: 50,
362
+ mode: 0,
363
+ h: 0,
364
+ s: 0,
365
+ v: 1000,
366
+ colorTemp: 0,
367
+ brightness: 0,
368
+ }, {
369
+ // 00db3232000000000003e800000000
370
+ id: 219,
371
+ name: I18n.getLang('mood_strip_default_mood_cyberpunk'),
372
+ type: 'Dynamic',
373
+ nodes: [],
374
+ speed: 50,
375
+ duration: 50,
376
+ mode: 0,
377
+ h: 0,
378
+ s: 0,
379
+ v: 1000,
380
+ colorTemp: 0,
381
+ brightness: 0,
382
+ }, {
383
+ // 00dc3232000000000003e800000000
384
+ id: 220,
385
+ name: I18n.getLang('mood_strip_default_mood_summer'),
386
+ type: 'Dynamic',
387
+ nodes: [],
388
+ speed: 50,
389
+ duration: 50,
390
+ mode: 0,
391
+ h: 0,
392
+ s: 0,
393
+ v: 1000,
394
+ colorTemp: 0,
395
+ brightness: 0,
396
+ }, {
397
+ // 00dd3232000000000003e800000000
398
+ id: 221,
399
+ name: I18n.getLang('mood_strip_default_mood_fall'),
400
+ type: 'Dynamic',
401
+ nodes: [],
402
+ speed: 50,
403
+ duration: 50,
404
+ mode: 0,
405
+ h: 0,
406
+ s: 0,
407
+ v: 1000,
408
+ colorTemp: 0,
409
+ brightness: 0,
410
+ }, {
411
+ // 00de3232000000000003e800000000
412
+ id: 222,
413
+ name: I18n.getLang('mood_strip_default_mood_club'),
414
+ type: 'Dynamic',
415
+ nodes: [],
416
+ speed: 50,
417
+ duration: 50,
418
+ mode: 0,
419
+ h: 0,
420
+ s: 0,
421
+ v: 1000,
422
+ colorTemp: 0,
423
+ brightness: 0,
424
+ }, {
425
+ // 00df3232000000000003e800000000
426
+ id: 223,
427
+ name: I18n.getLang('mood_strip_default_mood_candlelight'),
428
+ type: 'Dynamic',
429
+ nodes: [],
430
+ speed: 50,
431
+ duration: 50,
432
+ mode: 0,
433
+ h: 0,
434
+ s: 0,
435
+ v: 1000,
436
+ colorTemp: 0,
437
+ brightness: 0,
438
+ }, ] as DiySceneInfo[]
@@ -0,0 +1,232 @@
1
+ import {useDeviceId, useDp} from "@ledvance/base/src/models/modules/NativePropsSlice";
2
+ import {getGlobalParamsDp} from "@ledvance/base/src/utils/common";
3
+ import {useCallback, useEffect, useState} from "react";
4
+ import {getFeature, putFeature} from "@ledvance/base/src/api/native";
5
+ import {DiySceneInfo, DiySceneNode, SceneStatusType, WorkMode} from "@ledvance/base/src/utils/interface";
6
+ import {Result} from "@ledvance/base/src/models/modules/Result";
7
+ import {getHexByHSV} from "@ledvance/base/src/utils";
8
+ import DefaultScenes from "./DefaultScenes";
9
+
10
+ export function useSwitchLed() {
11
+ return useDp<boolean, any>(getGlobalParamsDp('switch_led'));
12
+ }
13
+
14
+ export function useWorkMode() {
15
+ return useDp<WorkMode, any>(getGlobalParamsDp('work_mode'))
16
+ }
17
+
18
+ export function useLoveScenes(): [number[], (loveScenes: number[]) => Promise<Result<any>>] {
19
+ const [dpValue, setDpValue] = useDp<string, any>(getGlobalParamsDp('love_scene'))
20
+ const setLoveScenes = useCallback((loveScenes: number[]) => {
21
+ return setDpValue(encodeLoveScenes(loveScenes))
22
+ }, [])
23
+ return [decodeLoveScenes(dpValue), setLoveScenes]
24
+ }
25
+
26
+ export function useSceneData(): [(sceneInfo: DiySceneInfo) => Promise<Result<any>>] {
27
+ const [switchLed, setSwitchLed] = useSwitchLed()
28
+ const [workMode, setWorkMode] = useWorkMode()
29
+ const [, setSceneDpValue] = useDp<string, any>(getGlobalParamsDp('scene_data'))
30
+ const [, setDiySceneDpValue] = useDp<string, any>(getGlobalParamsDp('diy_scene_data'))
31
+ const setSceneData = useCallback((sceneInfo: DiySceneInfo) => {
32
+ if (!switchLed) {
33
+ setSwitchLed(true).then()
34
+ }
35
+ if (workMode !== WorkMode.Scene) {
36
+ setWorkMode(WorkMode.Scene).then()
37
+ }
38
+ if (sceneInfo.type === 'DIY') {
39
+ return setDiySceneDpValue(encodeDiyScene(sceneInfo))
40
+ } else {
41
+ return setSceneDpValue(encodeScene(sceneInfo))
42
+ }
43
+ }, [])
44
+ return [setSceneData]
45
+ }
46
+
47
+
48
+ export function useSceneStatus(): [number, (type: SceneStatusType, sceneId: number) => Promise<any>, SceneStatusType] {
49
+ const devId = useDeviceId();
50
+ const [sceneStatusId, setSceneStatusId] = useState(-1);
51
+ const [sceneType, setSceneType] = useState<SceneStatusType>(SceneStatusType.Scene);
52
+
53
+ useEffect(() => {
54
+ getFeature(devId, "SceneStatus").then((res) => {
55
+ if (res.data) {
56
+ setSceneStatusId(res.data.id)
57
+ setSceneType(res.data.type)
58
+ }
59
+ })
60
+ }, [])
61
+ const setSceneStatusRemote = useCallback((type: SceneStatusType, sceneId: number) => {
62
+ return new Promise<any>((resolve, _reject) => {
63
+ putFeature(devId, "SceneStatus", {type: type, id: sceneId}).then((res) => {
64
+ setSceneStatusId(sceneId);
65
+ resolve(res);
66
+ })
67
+ });
68
+ }, [])
69
+
70
+ return [sceneStatusId, setSceneStatusRemote, sceneType]
71
+ }
72
+
73
+ export function useSceneId() {
74
+ const [dpValue] = useDp<string, any>(getGlobalParamsDp('scene_data'))
75
+ let sceneId: number | undefined = undefined
76
+ if (dpValue) {
77
+ sceneId = parseInt(dpValue.substring(0, 4), 16)
78
+ }
79
+ return [sceneId]
80
+ }
81
+
82
+ export function useDiySceneId() {
83
+ const [dpValue] = useDp<string, any>(getGlobalParamsDp('diy_scene_data'))
84
+ let diySceneId: number | undefined = undefined
85
+ if (dpValue) {
86
+ diySceneId = parseInt(dpValue.substring(0, 2), 16)
87
+ }
88
+ return [diySceneId]
89
+ }
90
+
91
+ const MixSceneListFeatureId = 'MixSceneList';
92
+ export async function getMixSceneList(devId: string, isRefresh?: boolean) {
93
+ if (isRefresh) {
94
+ const res = await putFeature(devId, MixSceneListFeatureId, DefaultScenes);
95
+ if (res.result) {
96
+ return {
97
+ success: true,
98
+ data: DefaultScenes
99
+ }
100
+ }
101
+ } else {
102
+ const res = await getFeature(devId, MixSceneListFeatureId);
103
+ if (!res.result) {
104
+ return {success: false}
105
+ }
106
+ if (!res.data) {
107
+ const result = await putFeature(devId, MixSceneListFeatureId, DefaultScenes);
108
+ if (!result.result) {
109
+ return {success: false}
110
+ }
111
+ return {
112
+ success: true,
113
+ data: DefaultScenes,
114
+ }
115
+ }
116
+ return {
117
+ success: true,
118
+ data: res.data,
119
+ }
120
+ }
121
+ return {success: false}
122
+ }
123
+
124
+ export async function saveMixSceneList(devId: string, sceneList: DiySceneInfo[]) {
125
+ const res = await putFeature(devId, MixSceneListFeatureId, sceneList)
126
+ return {
127
+ success: res.result,
128
+ msg: res.msg,
129
+ data: res.data
130
+ }
131
+ }
132
+
133
+
134
+ function decodeLoveScenes(dpValue: string): number[] {
135
+ const loveScenes: number[] = [];
136
+ for (let i = 2; i < dpValue.length; i += 4) {
137
+ const groupHex = dpValue.slice(i, i + 4);
138
+ const groupDecimal = parseInt(groupHex, 16);
139
+ loveScenes.push(groupDecimal);
140
+ }
141
+ return loveScenes;
142
+ }
143
+
144
+ function encodeLoveScenes(loveScenes: number[]): string {
145
+ let dpValue = loveScenes.length.toString(16).padStart(2, '0');
146
+ for (const num of loveScenes) {
147
+ const groupHex = num.toString(16).padStart(4, '0');
148
+ dpValue += groupHex;
149
+ }
150
+ return dpValue;
151
+ }
152
+
153
+ export function encodeScene(sceneInfo: DiySceneInfo): string {
154
+ const idHex = sceneInfo.id.toString(16).padStart(4, '0')
155
+ const speedHex = sceneInfo.speed!.toString(16).padStart(2, '0')
156
+ const durationHex = sceneInfo.duration!.toString(16).padStart(2, '0')
157
+ const modeHex = sceneInfo.mode!.toString(16).padStart(2, '0')
158
+ const hsvHex = getHexByHSV({h: 0, s: 0, v: sceneInfo.v})
159
+ const brightnessHex = '0000'
160
+ const colorTempHex = '0000'
161
+ return `${idHex}${speedHex}${durationHex}${modeHex}${hsvHex}${brightnessHex}${colorTempHex}`
162
+ }
163
+
164
+ export function decodeScene(dpValue: string): DiySceneInfo {
165
+ const id = parseInt(dpValue.substring(0, 4), 16)
166
+ const speed = parseInt(dpValue.substring(4, 6), 16)
167
+ const duration = parseInt(dpValue.substring(6, 8), 16)
168
+ const mode = parseInt(dpValue.substring(8, 10), 16)
169
+ const hsvHex = dpValue.substring(10, 16)
170
+ const v = parseInt(hsvHex.substring(4, 8), 16) // Assuming the v value is embedded in the HSV hex value
171
+
172
+ return {
173
+ id,
174
+ name: '',
175
+ type: speed !== 0 ? 'Dynamic' : 'Static',
176
+ speed,
177
+ duration,
178
+ mode,
179
+ v,
180
+ nodes: []
181
+ }
182
+ }
183
+
184
+
185
+ export function encodeDiyScene(sceneInfo: DiySceneInfo): string {
186
+ const idHex = sceneInfo.id.toString(16).padStart(2, '0')
187
+ const sizeHex = sceneInfo.nodes.length.toString(16).padStart(2, '0')
188
+ const speedHex = sceneInfo.speed!.toString(16).padStart(2, '0')
189
+ const vHex = sceneInfo.v!.toString(16).padStart(4, '0')
190
+ let nodesHex = ''
191
+ sceneInfo.nodes.forEach((node) => {
192
+ nodesHex += node.top.h.toString(16).padStart(4, '0')
193
+ nodesHex += node.top.s.toString(16).padStart(4, '0')
194
+ nodesHex += node.bottom.h.toString(16).padStart(4, '0')
195
+ nodesHex += node.bottom.s.toString(16).padStart(4, '0')
196
+ })
197
+ return `${idHex}${sizeHex}${speedHex}${vHex}${nodesHex}`
198
+ }
199
+
200
+ export function decodeDiyScene(dpValue: string): DiySceneInfo {
201
+ const id = parseInt(dpValue.substring(0, 2), 16)
202
+ const size = parseInt(dpValue.substring(2, 4), 16)
203
+ const speed = parseInt(dpValue.substring(4, 6), 16)
204
+ const v = parseInt(dpValue.substring(6, 10), 16)
205
+
206
+ let nodes:DiySceneNode[] = []
207
+ let currentIndex = 10 // Start reading nodes after the first 10 characters (id + size + speed + v)
208
+
209
+ for (let i = 0; i < size; i++) {
210
+ const topH = parseInt(dpValue.substring(currentIndex, currentIndex + 4), 16)
211
+ currentIndex += 4
212
+ const topS = parseInt(dpValue.substring(currentIndex, currentIndex + 4), 16)
213
+ currentIndex += 4
214
+ const bottomH = parseInt(dpValue.substring(currentIndex, currentIndex + 4), 16)
215
+ currentIndex += 4
216
+ const bottomS = parseInt(dpValue.substring(currentIndex, currentIndex + 4), 16)
217
+ currentIndex += 4
218
+
219
+ nodes.push({
220
+ top: { h: topH, s: topS, v: 1000 },
221
+ bottom: { h: bottomH, s: bottomS, v: 1000 }
222
+ })
223
+ }
224
+ return {
225
+ id: id,
226
+ name: '',
227
+ type: 'DIY',
228
+ nodes: nodes,
229
+ speed: speed,
230
+ v: v
231
+ }
232
+ }