@@ -326,7 +326,7 @@ class State:
326326 nightlight : Nightlight
327327 on : bool
328328 playlist : int
329- preset : int
329+ preset : Preset | int | None
330330 segments : list [Segment ]
331331 sync : Sync
332332 transition : int
@@ -352,14 +352,18 @@ def preset_active(self) -> bool:
352352
353353 @staticmethod
354354 def from_dict (
355- data : dict [str , Any ], effects : list [Effect ], palettes : list [Palette ]
355+ data : dict [str , Any ],
356+ effects : list [Effect ],
357+ palettes : list [Palette ],
358+ presets : list [Preset ],
356359 ) -> State :
357360 """Return State object from WLED API response.
358361
359362 Args:
360363 data: The state response received from the WLED device API.
361364 effects: A list of effect objects.
362- palettes: A list of palette object.
365+ palettes: A list of palette objects.
366+ presets: A list of presets objects.
363367
364368 Returns:
365369 A State object.
@@ -380,25 +384,92 @@ def from_dict(
380384 for segment_id , segment in enumerate (data .get ("seg" , []))
381385 ]
382386
387+ preset = data .get ("ps" , - 1 )
388+ if presets :
389+ preset = next (
390+ (item for item in presets if item .preset_id == data .get ("ps" )),
391+ None ,
392+ )
393+
383394 return State (
384395 brightness = brightness ,
385396 nightlight = Nightlight .from_dict (data ),
386397 on = on ,
387398 playlist = data .get ("pl" , - 1 ),
388- preset = data . get ( "ps" , - 1 ) ,
399+ preset = preset ,
389400 segments = segments ,
390401 sync = Sync .from_dict (data ),
391402 transition = data .get ("transition" , 0 ),
392403 lor = Live (lor ),
393404 )
394405
395406
407+ @dataclass
408+ class Preset :
409+ """Object representing a WLED preset."""
410+
411+ preset_id : int
412+ name : str
413+ quick_label : str | None
414+
415+ on : bool
416+ transition : int
417+ main_segment : Segment | None
418+ segments : list [Segment ]
419+
420+ @staticmethod
421+ def from_dict (
422+ preset_id : int ,
423+ data : dict [str , Any ],
424+ effects : list [Effect ],
425+ palettes : list [Palette ],
426+ ) -> Preset :
427+ """Return Preset object from WLED API response.
428+
429+ Args:
430+ preset_id: The ID of the preset.
431+ data: The data from the WLED device API.
432+ effects: A list of effect objects.
433+ palettes: A list of palette object.
434+
435+ Returns:
436+ A Preset object.
437+ """
438+ segments = [
439+ Segment .from_dict (
440+ segment_id = segment_id ,
441+ data = segment ,
442+ effects = effects ,
443+ palettes = palettes ,
444+ state_on = False ,
445+ state_brightness = 0 ,
446+ )
447+ for segment_id , segment in enumerate (data .get ("seg" , []))
448+ ]
449+
450+ main_segment = next (
451+ (item for item in segments if item .segment_id == data .get ("mainseg" , 0 )),
452+ None ,
453+ )
454+
455+ return Preset (
456+ main_segment = main_segment ,
457+ name = data ["n" ],
458+ on = data .get ("on" , False ),
459+ preset_id = preset_id ,
460+ quick_label = data .get ("ql" ),
461+ segments = segments ,
462+ transition = data .get ("transition" , 0 ),
463+ )
464+
465+
396466class Device :
397467 """Object holding all information of WLED."""
398468
399469 effects : list [Effect ] = []
400470 info : Info
401471 palettes : list [Palette ] = []
472+ presets : list [Preset ] = []
402473 state : State
403474
404475 def __init__ (self , data : dict ) -> None :
@@ -445,11 +516,22 @@ def update_from_dict(self, data: dict) -> Device:
445516 palettes .sort (key = lambda x : x .name )
446517 self .palettes = palettes
447518
519+ if _presets := data .get ("presets" ):
520+ _presets .pop ("0" )
521+ presets = [
522+ Preset .from_dict (int (preset_id ), preset , self .effects , self .palettes )
523+ for preset_id , preset in _presets .items ()
524+ ]
525+ presets .sort (key = lambda x : x .name )
526+ self .presets = presets
527+
448528 if _info := data .get ("info" ):
449529 self .info = Info .from_dict (_info )
450530
451531 if _state := data .get ("state" ):
452- self .state = State .from_dict (_state , self .effects , self .palettes )
532+ self .state = State .from_dict (
533+ _state , self .effects , self .palettes , self .presets
534+ )
453535
454536 return self
455537
0 commit comments