Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 10 additions & 9 deletions custom_components/petlibro/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -1223,24 +1223,25 @@ async def set_desiccant_reset(self, serial: str) -> JSON:
})

# Granary smart feeder quirk: response can be None on success
if response is None:
if response is None or response == {}:
_LOGGER.debug("Desiccant reset set successfully, got no extra data")
return

# Check if response is already parsed (since response is an integer here)
if isinstance(response, int):
_LOGGER.debug(f"Desiccant reset set successfully, returned code: {response}")
return response

# Check if response code indicates success
if response.code == 200 or response.code == 0:
_LOGGER.debug(f"Desiccant reset set successfully, returned code: {response.status}")
return response

# If response is a dictionary (JSON), handle it
response_data = await response.json()
_LOGGER.debug(f"Desiccant reset response data: {response_data}")
# If not response 200 assume failure
else:
raise PetLibroAPIError(f"Failed to trigger desiccant reset: {response.msg}")

# Check if the response indicates success
if response.status != 200 or response_data.get("code") != 0:
raise PetLibroAPIError(f"Failed to trigger desiccant reset: {response_data.get('msg')}")

return response_data
return response

except aiohttp.ClientError as err:
_LOGGER.error(f"Failed to trigger desiccant reset for device {serial}: {err}")
Expand Down
6 changes: 6 additions & 0 deletions custom_components/petlibro/button.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,12 @@ class PetLibroButtonEntityDescription(ButtonEntityDescription, PetLibroEntityDes
set_fn=lambda device: device.set_light_off(),
name="Turn Off Indicator"
),
PetLibroButtonEntityDescription[GranarySmartCameraFeeder](
key="desiccant_reset",
translation_key="desiccant_reset",
set_fn=lambda device: device.set_desiccant_reset(),
name="Desiccant Replaced"
),
],
OneRFIDSmartFeeder: [
PetLibroButtonEntityDescription[OneRFIDSmartFeeder](
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,11 @@ def manual_feed_quantity(self):
_LOGGER.warning(f"manual_feed_quantity is None for {self.serial}, setting default to 1.")
self._manual_feed_quantity = 1 # Default value
return self._manual_feed_quantity

@property
def desiccant_frequency(self) -> float:
frequency = self._data.get("realInfo", {}).get("changeDesiccantFrequency")
return frequency if isinstance(frequency, (float, int)) else 0

# Error-handling updated for set_feeding_plan
async def set_feeding_plan(self, value: bool) -> None:
Expand Down Expand Up @@ -492,3 +497,22 @@ def update_progress(self) -> float:

progress = upgrade_data.get("progress")
return float(progress) if progress is not None else 0.0

async def set_desiccant_cycle(self, value: float) -> None:
_LOGGER.debug(f"Setting desiccant frequency to {value} for {self.serial}")
try:
key = "DESICCANT"
await self.api.set_desiccant_cycle(self.serial, value, key)
await self.refresh() # Refresh the state after the action
except aiohttp.ClientError as err:
_LOGGER.error(f"Failed to set desiccant cycle for {self.serial}: {err}")
raise PetLibroAPIError(f"Error setting desiccant cycle: {err}")

async def set_desiccant_reset(self) -> None:
_LOGGER.debug(f"Triggering desiccant reset for {self.serial}")
try:
await self.api.set_desiccant_reset(self.serial)
await self.refresh() # Refresh the state after the action
except aiohttp.ClientError as err:
_LOGGER.error(f"Failed to trigger desiccant reset for {self.serial}: {err}")
raise PetLibroAPIError(f"Error triggering desiccant reset: {err}")
Original file line number Diff line number Diff line change
Expand Up @@ -477,7 +477,8 @@ async def set_light_off(self) -> None:
async def set_desiccant_cycle(self, value: float) -> None:
_LOGGER.debug(f"Setting desiccant frequency to {value} for {self.serial}")
try:
await self.api.set_desiccant_cycle(self.serial, value)
key = "DESICCANT"
await self.api.set_desiccant_cycle(self.serial, value, key)
await self.refresh() # Refresh the state after the action
except aiohttp.ClientError as err:
_LOGGER.error(f"Failed to set desiccant cycle for {self.serial}: {err}")
Expand Down
15 changes: 14 additions & 1 deletion custom_components/petlibro/number.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ def _handle_coordinator_update(self) -> None:
native_min_value=1,
native_step=1,
value_fn=lambda device: device.desiccant_frequency,
method=lambda device, value: device.set_desiccant_frequency(value),
method=lambda device, value: device.set_desiccant_cycle(value),
name="Desiccant Frequency",
),
],
Expand All @@ -234,6 +234,19 @@ def _handle_coordinator_update(self) -> None:
mode=NumberMode.SLIDER,
petlibro_unit=APIKey.FEED_UNIT,
),
PetLibroNumberEntityDescription[GranarySmartCameraFeeder](
key="desiccant_frequency",
translation_key="desiccant_frequency",
icon="mdi:calendar-alert",
native_unit_of_measurement="Days",
mode=NumberMode.BOX,
native_max_value=60,
native_min_value=1,
native_step=1,
value_fn=lambda device: device.desiccant_frequency,
method=lambda device, value: device.set_desiccant_cycle(value),
name="Desiccant Frequency",
),
],
OneRFIDSmartFeeder: [
PetLibroNumberEntityDescription[OneRFIDSmartFeeder](
Expand Down
Loading