@@ -72,6 +72,16 @@ def garbage_actions(self) -> dict:
7272 "01" : "Reset" ,
7373 }
7474
75+ @property
76+ def box_full_levels (self ) -> dict :
77+ """Return the box full sensitivity levels."""
78+ return {
79+ "LEVEL_01" : "Level 1" ,
80+ "LEVEL_02" : "Level 2" ,
81+ "LEVEL_03" : "Level 3" ,
82+ "LEVEL_04" : "Level 4" ,
83+ }
84+
7585 @property
7686 def _last_log (self ) -> dict :
7787 """Return the last log."""
@@ -300,6 +310,12 @@ def hass_select(self) -> dict:
300310 "async_select" : self .changeBag ,
301311 "delay_update" : 5 ,
302312 },
313+ "box_full_sensitivity" : {
314+ "icon" : "mdi:tune" ,
315+ "options" : list (self .box_full_levels .values ()),
316+ "state_attrs" : self .box_full_sensitivity_attrs ,
317+ "async_select" : self .select_box_full_sensitivity ,
318+ },
303319 }
304320
305321 # Additional Attributes
@@ -362,6 +378,53 @@ def error_attrs(self) -> list:
362378 _LOGGER .error ("Got error attributes failed: %s" , exc )
363379 return []
364380
381+ @property
382+ def box_full_sensitivity (self ) -> str :
383+ """Return the box full sensitivity."""
384+ sensitivity = self .detail .get ("boxFullSensitivity" , "" )
385+ # Try direct mapping first
386+ mapped_value = self .box_full_levels .get (sensitivity )
387+ if mapped_value :
388+ _LOGGER .debug (
389+ "Box full sensitivity mapped: %s -> %s" , sensitivity , mapped_value
390+ )
391+ return mapped_value
392+ # Try converting numeric format (e.g., "01" -> "LEVEL_01")
393+ if sensitivity and isinstance (sensitivity , (str , int )):
394+ try :
395+ # If it's a number or numeric string, convert to LEVEL_XX format
396+ if isinstance (sensitivity , str ) and sensitivity .isdigit ():
397+ level_key = f"LEVEL_{ sensitivity .zfill (2 )} "
398+ elif isinstance (sensitivity , int ):
399+ level_key = f"LEVEL_{ str (sensitivity ).zfill (2 )} "
400+ else :
401+ level_key = None
402+ if level_key :
403+ mapped_value = self .box_full_levels .get (level_key )
404+ if mapped_value :
405+ _LOGGER .debug (
406+ "Box full sensitivity mapped (converted): %s -> %s -> %s" ,
407+ sensitivity ,
408+ level_key ,
409+ mapped_value ,
410+ )
411+ return mapped_value
412+ except (ValueError , AttributeError ):
413+ pass
414+ _LOGGER .warning (
415+ "Box full sensitivity not found in mapping: %s (type: %s, available: %s)" ,
416+ sensitivity ,
417+ type (sensitivity ).__name__ ,
418+ list (self .box_full_levels .keys ()),
419+ )
420+ return None
421+
422+ def box_full_sensitivity_attrs (self ) -> dict :
423+ """Return the box full sensitivity attributes."""
424+ return {
425+ "raw_level" : self .detail .get ("boxFullSensitivity" ),
426+ }
427+
365428 # Actions
366429 async def update_logs (self ) -> list :
367430 """Update the logs."""
@@ -406,6 +469,32 @@ async def select_mode(self, mode, **kwargs) -> bool:
406469 _LOGGER .info ("Select mode: %s" , [rdt , pms ])
407470 return rdt
408471
472+ async def select_box_full_sensitivity (self , level , ** kwargs ) -> bool :
473+ """Select the box full sensitivity level."""
474+ api = "token/litterbox/boxFullSetting"
475+ lvl = None
476+ for k , v in self .box_full_levels .items ():
477+ if v == level :
478+ lvl = k
479+ break
480+ if lvl is None :
481+ _LOGGER .warning (
482+ "Select box full sensitivity failed for %s in %s" , level , self .box_full_levels
483+ )
484+ return False
485+ pms = {
486+ "deviceId" : self .id ,
487+ "level" : lvl ,
488+ }
489+ rdt = await self .account .request (api , pms , "POST" )
490+ eno = rdt .get ("returnCode" , 0 )
491+ if eno :
492+ _LOGGER .error ("Select box full sensitivity failed: %s" , [rdt , pms ])
493+ return False
494+ await self .update_device_detail ()
495+ _LOGGER .info ("Select box full sensitivity: %s" , [rdt , pms ])
496+ return rdt
497+
409498 async def update_device_detail (self ) -> dict :
410499 """Update the device detail."""
411500 api = "token/litterbox/info"
0 commit comments