Skip to content

Commit 673c0e5

Browse files
authored
Bug/Report-Day-Sensors-Float-Not-Str (#110)
* Convert str to float and apply corret device_class, state_class + unit_of_measurement to sensors. * remove native_value * Fix other device_class & state_class issues * Test Pump Selector * Undo Accidental Commit to wrong branch * Undo accidental commit on wrong branch * type error handling * Test * Undo commit on wrong branch
1 parent 138237a commit 673c0e5

8 files changed

Lines changed: 92 additions & 39 deletions

File tree

custom_components/petlibro/devices/feeders/air_smart_feeder.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,13 @@ def screen_display_switch(self) -> bool:
170170
return bool(self._data.get("realInfo", {}).get("screenDisplaySwitch", False))
171171

172172
@property
173-
def remaining_desiccant(self) -> str:
173+
def remaining_desiccant(self) -> float | None:
174174
"""Get the remaining desiccant days."""
175-
return cast(str, self._data.get("remainingDesiccantDays", "unknown"))
175+
value = self._data.get("remainingDesiccantDays")
176+
try:
177+
return float(value) if value is not None else None
178+
except (TypeError, ValueError):
179+
return None
176180

177181
@property
178182
def last_feed_time(self) -> str | None:
@@ -185,7 +189,7 @@ def last_feed_time(self) -> str | None:
185189

186190
if not raw or not isinstance(raw, list):
187191
return None
188-
192+
189193
for day_entry in raw:
190194
work_records = day_entry.get("workRecords", [])
191195
for record in work_records:
@@ -196,7 +200,6 @@ def last_feed_time(self) -> str | None:
196200
dt = datetime.fromtimestamp(timestamp_ms / 1000)
197201
_LOGGER.debug("Returning formatted time: %s", dt.strftime("%Y-%m-%d %H:%M:%S"))
198202
return dt.strftime("%Y-%m-%d %H:%M:%S")
199-
200203
return None
201204

202205
@property

custom_components/petlibro/devices/feeders/granary_smart_camera_feeder.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -192,10 +192,14 @@ def video_record_mode(self) -> str:
192192
return self._data.get("realInfo", {}).get("videoRecordMode", "unknown")
193193

194194
@property
195-
def remaining_desiccant(self) -> str:
195+
def remaining_desiccant(self) -> float | None:
196196
"""Get the remaining desiccant days."""
197-
return cast(str, self._data.get("remainingDesiccantDays", "unknown"))
198-
197+
value = self._data.get("remainingDesiccantDays")
198+
try:
199+
return float(value) if value is not None else None
200+
except (TypeError, ValueError):
201+
return None
202+
199203
@property
200204
def last_feed_time(self) -> str | None:
201205
"""Return the recordTime of the last successful grain output as a formatted string."""
@@ -207,7 +211,7 @@ def last_feed_time(self) -> str | None:
207211

208212
if not raw or not isinstance(raw, list):
209213
return None
210-
214+
211215
for day_entry in raw:
212216
work_records = day_entry.get("workRecords", [])
213217
for record in work_records:
@@ -218,7 +222,6 @@ def last_feed_time(self) -> str | None:
218222
dt = datetime.fromtimestamp(timestamp_ms / 1000)
219223
_LOGGER.debug("Returning formatted time: %s", dt.strftime("%Y-%m-%d %H:%M:%S"))
220224
return dt.strftime("%Y-%m-%d %H:%M:%S")
221-
222225
return None
223226

224227
@property

custom_components/petlibro/devices/feeders/granary_smart_feeder.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -171,10 +171,13 @@ def screen_display_switch(self) -> bool:
171171
return bool(self._data.get("realInfo", {}).get("screenDisplaySwitch", False))
172172

173173
@property
174-
def remaining_desiccant(self) -> str:
175-
"""Get the remaining desiccant days."""
176-
return cast(str, self._data.get("remainingDesiccantDays", "unknown"))
177-
174+
def remaining_desiccant(self) -> float | None:
175+
value = self._data.get("remainingDesiccantDays")
176+
try:
177+
return float(value) if value is not None else None
178+
except (TypeError, ValueError):
179+
return None
180+
178181
@property
179182
def last_feed_time(self) -> str | None:
180183
"""Return the recordTime of the last successful grain output as a formatted string."""
@@ -186,7 +189,7 @@ def last_feed_time(self) -> str | None:
186189

187190
if not raw or not isinstance(raw, list):
188191
return None
189-
192+
190193
for day_entry in raw:
191194
work_records = day_entry.get("workRecords", [])
192195
for record in work_records:
@@ -197,7 +200,6 @@ def last_feed_time(self) -> str | None:
197200
dt = datetime.fromtimestamp(timestamp_ms / 1000)
198201
_LOGGER.debug("Returning formatted time: %s", dt.strftime("%Y-%m-%d %H:%M:%S"))
199202
return dt.strftime("%Y-%m-%d %H:%M:%S")
200-
201203
return None
202204

203205
@property

custom_components/petlibro/devices/feeders/one_rfid_smart_feeder.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -195,9 +195,13 @@ def child_lock_switch(self) -> bool:
195195
return not self._data.get("realInfo", {}).get("childLockSwitch", False)
196196

197197
@property
198-
def remaining_desiccant(self) -> str:
198+
def remaining_desiccant(self) -> float | None:
199199
"""Get the remaining desiccant days."""
200-
return cast(str, self._data.get("remainingDesiccantDays", "unknown"))
200+
value = self._data.get("remainingDesiccantDays")
201+
try:
202+
return float(value) if value is not None else None
203+
except (TypeError, ValueError):
204+
return None
201205

202206
@property
203207
def desiccant_cycle(self) -> float:
@@ -214,7 +218,7 @@ def last_feed_time(self) -> str | None:
214218

215219
if not raw or not isinstance(raw, list):
216220
return None
217-
221+
218222
for day_entry in raw:
219223
work_records = day_entry.get("workRecords", [])
220224
for record in work_records:
@@ -225,7 +229,6 @@ def last_feed_time(self) -> str | None:
225229
dt = datetime.fromtimestamp(timestamp_ms / 1000)
226230
_LOGGER.debug("Returning formatted time: %s", dt.strftime("%Y-%m-%d %H:%M:%S"))
227231
return dt.strftime("%Y-%m-%d %H:%M:%S")
228-
229232
return None
230233

231234
@property

custom_components/petlibro/devices/feeders/space_smart_feeder.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,9 +167,13 @@ def screen_display_switch(self) -> bool:
167167
return bool(self._data.get("realInfo", {}).get("screenDisplaySwitch", False))
168168

169169
@property
170-
def remaining_desiccant(self) -> str:
170+
def remaining_desiccant(self) -> float | None:
171171
"""Get the remaining desiccant days."""
172-
return cast(str, self._data.get("remainingDesiccantDays", "unknown"))
172+
value = self._data.get("remainingDesiccantDays")
173+
try:
174+
return float(value) if value is not None else None
175+
except (TypeError, ValueError):
176+
return None
173177

174178
@property
175179
def last_feed_time(self) -> str | None:
@@ -182,7 +186,7 @@ def last_feed_time(self) -> str | None:
182186

183187
if not raw or not isinstance(raw, list):
184188
return None
185-
189+
186190
for day_entry in raw:
187191
work_records = day_entry.get("workRecords", [])
188192
for record in work_records:
@@ -193,7 +197,6 @@ def last_feed_time(self) -> str | None:
193197
dt = datetime.fromtimestamp(timestamp_ms / 1000)
194198
_LOGGER.debug("Returning formatted time: %s", dt.strftime("%Y-%m-%d %H:%M:%S"))
195199
return dt.strftime("%Y-%m-%d %H:%M:%S")
196-
197200
return None
198201

199202
@property

custom_components/petlibro/devices/fountains/dockstream_smart_fountain.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,22 @@ def weight_percent(self) -> int:
7171
return self._data.get("realInfo", {}).get("weightPercent", 0)
7272

7373
@property
74-
def remaining_filter_days(self) -> int:
75-
"""Get the number of days remaining for the filter replacement."""
76-
return self._data.get("realInfo", {}).get("remainingReplacementDays", 0)
74+
def remaining_filter_days(self) -> float | None:
75+
"""Get the remaining desiccant days."""
76+
value = self._data.get("realInfo", {}).get("remainingReplacementDays", 0)
77+
try:
78+
return float(value) if value is not None else None
79+
except (TypeError, ValueError):
80+
return None
7781

7882
@property
79-
def remaining_cleaning_days(self) -> int:
80-
"""Get the number of days remaining for machine cleaning."""
81-
return self._data.get("realInfo", {}).get("remainingCleaningDays", 0)
83+
def remaining_cleaning_days(self) -> float | None:
84+
"""Get the remaining desiccant days."""
85+
value = self._data.get("realInfo", {}).get("remainingCleaningDays", 0)
86+
try:
87+
return float(value) if value is not None else None
88+
except (TypeError, ValueError):
89+
return None
8290

8391
@property
8492
def vacuum_state(self) -> bool:

custom_components/petlibro/devices/fountains/dockstream_smart_rfid_fountain.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,22 @@ def weight_percent(self) -> int:
7171
return self._data.get("realInfo", {}).get("weightPercent", 0)
7272

7373
@property
74-
def remaining_filter_days(self) -> int:
75-
"""Get the number of days remaining for the filter replacement."""
76-
return self._data.get("realInfo", {}).get("remainingReplacementDays", 0)
74+
def remaining_filter_days(self) -> float | None:
75+
"""Get the remaining desiccant days."""
76+
value = self._data.get("realInfo", {}).get("remainingReplacementDays", 0)
77+
try:
78+
return float(value) if value is not None else None
79+
except (TypeError, ValueError):
80+
return None
7781

7882
@property
79-
def remaining_cleaning_days(self) -> int:
80-
"""Get the number of days remaining for machine cleaning."""
81-
return self._data.get("realInfo", {}).get("remainingCleaningDays", 0)
83+
def remaining_cleaning_days(self) -> float | None:
84+
"""Get the remaining desiccant days."""
85+
value = self._data.get("realInfo", {}).get("remainingCleaningDays", 0)
86+
try:
87+
return float(value) if value is not None else None
88+
except (TypeError, ValueError):
89+
return None
8290

8391
@property
8492
def vacuum_state(self) -> bool:

custom_components/petlibro/sensor.py

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,9 @@ def _format_state(self, state):
342342
key="remaining_desiccant",
343343
translation_key="remaining_desiccant",
344344
icon="mdi:package",
345+
native_unit_of_measurement="d",
346+
device_class=SensorDeviceClass.DURATION,
347+
state_class=SensorStateClass.MEASUREMENT,
345348
name="Remaining Desiccant Days"
346349
),
347350
PetLibroSensorEntityDescription[GranarySmartFeeder](
@@ -425,7 +428,9 @@ def _format_state(self, state):
425428
key="remaining_desiccant",
426429
translation_key="remaining_desiccant",
427430
icon="mdi:package",
428-
native_unit_of_measurement="days",
431+
native_unit_of_measurement="d",
432+
device_class=SensorDeviceClass.DURATION,
433+
state_class=SensorStateClass.MEASUREMENT,
429434
name="Remaining Desiccant Days"
430435
),
431436
PetLibroSensorEntityDescription[GranarySmartCameraFeeder](
@@ -544,6 +549,9 @@ def _format_state(self, state):
544549
key="remaining_desiccant",
545550
translation_key="remaining_desiccant",
546551
icon="mdi:package",
552+
native_unit_of_measurement="d",
553+
device_class=SensorDeviceClass.DURATION,
554+
state_class=SensorStateClass.MEASUREMENT,
547555
name="Remaining Desiccant Days"
548556
),
549557
PetLibroSensorEntityDescription[OneRFIDSmartFeeder](
@@ -595,7 +603,8 @@ def _format_state(self, state):
595603
key="today_eating_time",
596604
translation_key="today_eating_time",
597605
icon="mdi:history",
598-
name="Last Feed Time"
606+
state_class=SensorStateClass.TOTAL_INCREASING,
607+
name="Today's Total Eating Time"
599608
),
600609
PetLibroSensorEntityDescription[OneRFIDSmartFeeder](
601610
key="last_feed_time",
@@ -800,6 +809,9 @@ def _format_state(self, state):
800809
key="remaining_cleaning_days",
801810
translation_key="remaining_cleaning_days",
802811
icon="mdi:package",
812+
native_unit_of_measurement="d",
813+
device_class=SensorDeviceClass.DURATION,
814+
state_class=SensorStateClass.MEASUREMENT,
803815
name="Remaining Cleaning Days"
804816
),
805817
PetLibroSensorEntityDescription[DockstreamSmartFountain](
@@ -836,7 +848,9 @@ def _format_state(self, state):
836848
key="remaining_filter_days",
837849
translation_key="remaining_filter_days",
838850
icon="mdi:package",
839-
native_unit_of_measurement="days",
851+
native_unit_of_measurement="d",
852+
device_class=SensorDeviceClass.DURATION,
853+
state_class=SensorStateClass.MEASUREMENT,
840854
name="Remaining Filter Days"
841855
),
842856
],
@@ -870,6 +884,9 @@ def _format_state(self, state):
870884
key="remaining_cleaning_days",
871885
translation_key="remaining_cleaning_days",
872886
icon="mdi:package",
887+
native_unit_of_measurement="d",
888+
device_class=SensorDeviceClass.DURATION,
889+
state_class=SensorStateClass.MEASUREMENT,
873890
name="Remaining Cleaning Days"
874891
),
875892
PetLibroSensorEntityDescription[DockstreamSmartRFIDFountain](
@@ -893,13 +910,17 @@ def _format_state(self, state):
893910
translation_key="use_water_interval",
894911
icon="mdi:water",
895912
native_unit_of_measurement="min",
913+
device_class=SensorDeviceClass.DURATION,
914+
state_class=SensorStateClass.MEASUREMENT,
896915
name="Water Interval"
897916
),
898917
PetLibroSensorEntityDescription[DockstreamSmartRFIDFountain](
899918
key="use_water_duration",
900919
translation_key="use_water_duration",
901920
icon="mdi:water",
902921
native_unit_of_measurement="min",
922+
device_class=SensorDeviceClass.DURATION,
923+
state_class=SensorStateClass.MEASUREMENT,
903924
name="Water Time Duration"
904925
),
905926
# Does not work with multi pet tracking, but may use this code later once I have the API info for the RFID tags.
@@ -915,7 +936,9 @@ def _format_state(self, state):
915936
key="remaining_filter_days",
916937
translation_key="remaining_filter_days",
917938
icon="mdi:package",
918-
native_unit_of_measurement="days",
939+
native_unit_of_measurement="d",
940+
device_class=SensorDeviceClass.DURATION,
941+
state_class=SensorStateClass.MEASUREMENT,
919942
name="Remaining Filter Days"
920943
),
921944
]

0 commit comments

Comments
 (0)