Skip to content

Commit 759d7bd

Browse files
authored
Merge branch 'dev' into feature/pets-management
2 parents 4405596 + 9600c14 commit 759d7bd

5 files changed

Lines changed: 56 additions & 11 deletions

File tree

custom_components/petlibro/api.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1243,24 +1243,25 @@ async def set_desiccant_reset(self, serial: str) -> JSON:
12431243
})
12441244

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

12501250
# Check if response is already parsed (since response is an integer here)
12511251
if isinstance(response, int):
12521252
_LOGGER.debug(f"Desiccant reset set successfully, returned code: {response}")
12531253
return response
1254+
1255+
# Check if response code indicates success
1256+
if response.code == 200 or response.code == 0:
1257+
_LOGGER.debug(f"Desiccant reset set successfully, returned code: {response.status}")
1258+
return response
12541259

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

1259-
# Check if the response indicates success
1260-
if response.status != 200 or response_data.get("code") != 0:
1261-
raise PetLibroAPIError(f"Failed to trigger desiccant reset: {response_data.get('msg')}")
1262-
1263-
return response_data
1264+
return response
12641265

12651266
except aiohttp.ClientError as err:
12661267
_LOGGER.error(f"Failed to trigger desiccant reset for device {serial}: {err}")

custom_components/petlibro/button.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,12 @@ class PetLibroButtonEntityDescription(ButtonEntityDescription, PetLibroEntityDes
150150
set_fn=lambda device: device.set_light_off(),
151151
name="Turn Off Indicator"
152152
),
153+
PetLibroButtonEntityDescription[GranarySmartCameraFeeder](
154+
key="desiccant_reset",
155+
translation_key="desiccant_reset",
156+
set_fn=lambda device: device.set_desiccant_reset(),
157+
name="Desiccant Replaced"
158+
),
153159
],
154160
OneRFIDSmartFeeder: [
155161
PetLibroButtonEntityDescription[OneRFIDSmartFeeder](

custom_components/petlibro/devices/feeders/granary_smart_camera_feeder.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,11 @@ def manual_feed_quantity(self):
347347
_LOGGER.warning(f"manual_feed_quantity is None for {self.serial}, setting default to 1.")
348348
self._manual_feed_quantity = 1 # Default value
349349
return self._manual_feed_quantity
350+
351+
@property
352+
def desiccant_frequency(self) -> float:
353+
frequency = self._data.get("realInfo", {}).get("changeDesiccantFrequency")
354+
return frequency if isinstance(frequency, (float, int)) else 0
350355

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

493498
progress = upgrade_data.get("progress")
494499
return float(progress) if progress is not None else 0.0
500+
501+
async def set_desiccant_cycle(self, value: float) -> None:
502+
_LOGGER.debug(f"Setting desiccant frequency to {value} for {self.serial}")
503+
try:
504+
key = "DESICCANT"
505+
await self.api.set_desiccant_cycle(self.serial, value, key)
506+
await self.refresh() # Refresh the state after the action
507+
except aiohttp.ClientError as err:
508+
_LOGGER.error(f"Failed to set desiccant cycle for {self.serial}: {err}")
509+
raise PetLibroAPIError(f"Error setting desiccant cycle: {err}")
510+
511+
async def set_desiccant_reset(self) -> None:
512+
_LOGGER.debug(f"Triggering desiccant reset for {self.serial}")
513+
try:
514+
await self.api.set_desiccant_reset(self.serial)
515+
await self.refresh() # Refresh the state after the action
516+
except aiohttp.ClientError as err:
517+
_LOGGER.error(f"Failed to trigger desiccant reset for {self.serial}: {err}")
518+
raise PetLibroAPIError(f"Error triggering desiccant reset: {err}")

custom_components/petlibro/devices/feeders/granary_smart_feeder.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,8 @@ async def set_light_off(self) -> None:
477477
async def set_desiccant_cycle(self, value: float) -> None:
478478
_LOGGER.debug(f"Setting desiccant frequency to {value} for {self.serial}")
479479
try:
480-
await self.api.set_desiccant_cycle(self.serial, value)
480+
key = "DESICCANT"
481+
await self.api.set_desiccant_cycle(self.serial, value, key)
481482
await self.refresh() # Refresh the state after the action
482483
except aiohttp.ClientError as err:
483484
_LOGGER.error(f"Failed to set desiccant cycle for {self.serial}: {err}")

custom_components/petlibro/number.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ def _handle_coordinator_update(self) -> None:
224224
native_min_value=1,
225225
native_step=1,
226226
value_fn=lambda device: device.desiccant_frequency,
227-
method=lambda device, value: device.set_desiccant_frequency(value),
227+
method=lambda device, value: device.set_desiccant_cycle(value),
228228
name="Desiccant Frequency",
229229
),
230230
],
@@ -237,6 +237,19 @@ def _handle_coordinator_update(self) -> None:
237237
mode=NumberMode.SLIDER,
238238
petlibro_unit=APIKey.FEED_UNIT,
239239
),
240+
PetLibroNumberEntityDescription[GranarySmartCameraFeeder](
241+
key="desiccant_frequency",
242+
translation_key="desiccant_frequency",
243+
icon="mdi:calendar-alert",
244+
native_unit_of_measurement="Days",
245+
mode=NumberMode.BOX,
246+
native_max_value=60,
247+
native_min_value=1,
248+
native_step=1,
249+
value_fn=lambda device: device.desiccant_frequency,
250+
method=lambda device, value: device.set_desiccant_cycle(value),
251+
name="Desiccant Frequency",
252+
),
240253
],
241254
OneRFIDSmartFeeder: [
242255
PetLibroNumberEntityDescription[OneRFIDSmartFeeder](

0 commit comments

Comments
 (0)