Skip to content

Commit 12ca53d

Browse files
Merge pull request #42 from kingkong1946/main
Added integration for litterbox full sensitivity
2 parents 8bb88a4 + 37bbc67 commit 12ca53d

1 file changed

Lines changed: 89 additions & 0 deletions

File tree

custom_components/catlink/modules/litterbox.py

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)