@@ -56,6 +56,7 @@ class PetLibroNumberEntityDescription(NumberEntityDescription, PetLibroEntityDes
5656 device_class : Optional [NumberDeviceClass ] = None
5757 entity_registry_visible_default_fn : Callable [[PetLibroNumberEntity ], bool | None ] = lambda _ : None
5858 entity_registry_enabled_default_fn : Callable [[PetLibroNumberEntity ], bool | None ] = lambda _ : None
59+ available_fn : Callable [[PetLibroNumberEntity ], bool | None ] = lambda _ : None
5960 petlibro_unit : APIKey | str | None = None
6061
6162class PetLibroNumberEntity (PetLibroEntity [_DeviceT ], NumberEntity ):
@@ -65,7 +66,7 @@ class PetLibroNumberEntity(PetLibroEntity[_DeviceT], NumberEntity):
6566 def __init__ (self , device , hub , description ):
6667 """Initialize the number."""
6768 super ().__init__ (device , hub , description )
68-
69+
6970 if (unit_type := self .entity_description .petlibro_unit ) and unit_type == APIKey .FEED_UNIT :
7071 self .hub .manual_feed_unique_ids [Platform .NUMBER ].append (self ._attr_unique_id )
7172
@@ -125,31 +126,38 @@ def native_step(self) -> float | None:
125126 if (native_step := self .entity_description .native_step_fn (self )) is not None :
126127 return native_step
127128 return super ().native_step
128-
129+
130+ @property
131+ def available (self ) -> bool :
132+ """Return True if entity is available."""
133+ if (available := self .entity_description .available_fn (self )) is not None :
134+ return available
135+ return super ().available
136+
129137 @property
130138 def entity_registry_visible_default (self ) -> bool :
131139 """Return if the entity should be visible when first added."""
132140 if (visible_default := self .entity_description .entity_registry_visible_default_fn (self )) is not None :
133141 return visible_default
134142 return super ().entity_registry_visible_default
135-
143+
136144 @property
137145 def entity_registry_enabled_default (self ) -> bool :
138146 """Return if the entity should be enabled when first added."""
139147 if (enabled_default := self .entity_description .entity_registry_enabled_default_fn (self )) is not None :
140148 return enabled_default
141149 return super ().entity_registry_enabled_default
142-
150+
143151 @property
144152 def portions_enabled (self ) -> bool :
145- """Return True if portions are enabled for setting manual feed."""
153+ """Return True if portions are enabled for setting manual feed."""
146154 return self .hub .entry .options .get (MANUAL_FEED_PORTIONS , False )
147-
155+
148156 @property
149157 def enable_for_manual_feed (self ) -> bool :
150- """Return True if the platform should be enabled for setting manual feed."""
158+ """Return True if the platform should be enabled for setting manual feed."""
151159 return self .member .feedUnitType is not Unit .CUPS or self .portions_enabled
152-
160+
153161 @callback
154162 def _handle_coordinator_update (self ) -> None :
155163 """Handle updated data from the coordinator."""
@@ -161,7 +169,7 @@ def _handle_coordinator_update(self) -> None:
161169
162170 if self .enabled :
163171 super ()._handle_coordinator_update ()
164-
172+
165173
166174DEVICE_NUMBER_MAP : dict [type [Device ], list [PetLibroNumberEntityDescription ]] = {
167175 Feeder : [],
@@ -173,16 +181,17 @@ def _handle_coordinator_update(self) -> None:
173181 icon = "mdi:scale" ,
174182 mode = NumberMode .SLIDER ,
175183 native_unit_of_measurement_fn = lambda s : s .member .feedUnitType .symbol if not s .portions_enabled else "portions" ,
176- native_max_value_fn = lambda s : Unit .round (s .member .feedUnitType .factor * MAX_FEED_PORTIONS , s .member .feedUnitType )
184+ native_max_value_fn = lambda s : Unit .round (s .member .feedUnitType .factor * MAX_FEED_PORTIONS , s .member .feedUnitType )
177185 if not s .portions_enabled else MAX_FEED_PORTIONS ,
178186 native_min_value_fn = lambda s : round (s .member .feedUnitType .factor , 16 ) if not s .portions_enabled else 1 ,
179187 native_step_fn = lambda s : s .member .feedUnitType .factor if not s .portions_enabled else 1 ,
180- method = lambda s , d , v : d .set_manual_feed_quantity (Unit .convert_feed (v , s .member .feedUnitType , None )
188+ method = lambda s , d , v : d .set_manual_feed_quantity (Unit .convert_feed (v , s .member .feedUnitType , None )
181189 if not s .portions_enabled else v ),
182- value_fn = lambda s , d : Unit .convert_feed (d .manual_feed_quantity , None , s .member .feedUnitType , True )
190+ value_fn = lambda s , d : Unit .convert_feed (d .manual_feed_quantity , None , s .member .feedUnitType , True )
183191 if not s .portions_enabled else d .manual_feed_quantity ,
184192 entity_registry_visible_default_fn = lambda self : self .enable_for_manual_feed ,
185193 entity_registry_enabled_default_fn = lambda self : self .enable_for_manual_feed ,
194+ available_fn = lambda self : self .enable_for_manual_feed ,
186195 petlibro_unit = APIKey .FEED_UNIT ,
187196 ),
188197 ],
@@ -194,16 +203,17 @@ def _handle_coordinator_update(self) -> None:
194203 icon = "mdi:scale" ,
195204 mode = NumberMode .SLIDER ,
196205 native_unit_of_measurement_fn = lambda s : s .member .feedUnitType .symbol if not s .portions_enabled else "portions" ,
197- native_max_value_fn = lambda s : Unit .round (s .member .feedUnitType .factor * MAX_FEED_PORTIONS , s .member .feedUnitType )
206+ native_max_value_fn = lambda s : Unit .round (s .member .feedUnitType .factor * MAX_FEED_PORTIONS , s .member .feedUnitType )
198207 if not s .portions_enabled else MAX_FEED_PORTIONS ,
199208 native_min_value_fn = lambda s : round (s .member .feedUnitType .factor , 16 ) if not s .portions_enabled else 1 ,
200209 native_step_fn = lambda s : s .member .feedUnitType .factor if not s .portions_enabled else 1 ,
201- method = lambda s , d , v : d .set_manual_feed_quantity (Unit .convert_feed (v , s .member .feedUnitType , None )
210+ method = lambda s , d , v : d .set_manual_feed_quantity (Unit .convert_feed (v , s .member .feedUnitType , None )
202211 if not s .portions_enabled else v ),
203- value_fn = lambda s , d : Unit .convert_feed (d .manual_feed_quantity , None , s .member .feedUnitType , True )
212+ value_fn = lambda s , d : Unit .convert_feed (d .manual_feed_quantity , None , s .member .feedUnitType , True )
204213 if not s .portions_enabled else d .manual_feed_quantity ,
205214 entity_registry_visible_default_fn = lambda self : self .enable_for_manual_feed ,
206215 entity_registry_enabled_default_fn = lambda self : self .enable_for_manual_feed ,
216+ available_fn = lambda self : self .enable_for_manual_feed ,
207217 petlibro_unit = APIKey .FEED_UNIT ,
208218 ),
209219 PetLibroNumberEntityDescription [GranarySmartFeeder ](
@@ -228,16 +238,17 @@ def _handle_coordinator_update(self) -> None:
228238 icon = "mdi:scale" ,
229239 mode = NumberMode .SLIDER ,
230240 native_unit_of_measurement_fn = lambda s : s .member .feedUnitType .symbol if not s .portions_enabled else "portions" ,
231- native_max_value_fn = lambda s : Unit .round (s .member .feedUnitType .factor * MAX_FEED_PORTIONS , s .member .feedUnitType )
241+ native_max_value_fn = lambda s : Unit .round (s .member .feedUnitType .factor * MAX_FEED_PORTIONS , s .member .feedUnitType )
232242 if not s .portions_enabled else MAX_FEED_PORTIONS ,
233243 native_min_value_fn = lambda s : round (s .member .feedUnitType .factor , 16 ) if not s .portions_enabled else 1 ,
234244 native_step_fn = lambda s : s .member .feedUnitType .factor if not s .portions_enabled else 1 ,
235- method = lambda s , d , v : d .set_manual_feed_quantity (Unit .convert_feed (v , s .member .feedUnitType , None )
245+ method = lambda s , d , v : d .set_manual_feed_quantity (Unit .convert_feed (v , s .member .feedUnitType , None )
236246 if not s .portions_enabled else v ),
237- value_fn = lambda s , d : Unit .convert_feed (d .manual_feed_quantity , None , s .member .feedUnitType , True )
247+ value_fn = lambda s , d : Unit .convert_feed (d .manual_feed_quantity , None , s .member .feedUnitType , True )
238248 if not s .portions_enabled else d .manual_feed_quantity ,
239249 entity_registry_visible_default_fn = lambda self : self .enable_for_manual_feed ,
240250 entity_registry_enabled_default_fn = lambda self : self .enable_for_manual_feed ,
251+ available_fn = lambda self : self .enable_for_manual_feed ,
241252 petlibro_unit = APIKey .FEED_UNIT ,
242253 ),
243254 ],
@@ -286,16 +297,17 @@ def _handle_coordinator_update(self) -> None:
286297 icon = "mdi:scale" ,
287298 mode = NumberMode .SLIDER ,
288299 native_unit_of_measurement_fn = lambda s : s .member .feedUnitType .symbol if not s .portions_enabled else "portions" ,
289- native_max_value_fn = lambda s : Unit .round (s .member .feedUnitType .factor * MAX_FEED_PORTIONS , s .member .feedUnitType )
300+ native_max_value_fn = lambda s : Unit .round (s .member .feedUnitType .factor * MAX_FEED_PORTIONS , s .member .feedUnitType )
290301 if not s .portions_enabled else MAX_FEED_PORTIONS ,
291302 native_min_value_fn = lambda s : round (s .member .feedUnitType .factor , 16 ) if not s .portions_enabled else 1 ,
292303 native_step_fn = lambda s : s .member .feedUnitType .factor if not s .portions_enabled else 1 ,
293- method = lambda s , d , v : d .set_manual_feed_quantity (Unit .convert_feed (v , s .member .feedUnitType , None )
304+ method = lambda s , d , v : d .set_manual_feed_quantity (Unit .convert_feed (v , s .member .feedUnitType , None )
294305 if not s .portions_enabled else v ),
295- value_fn = lambda s , d : Unit .convert_feed (d .manual_feed_quantity , None , s .member .feedUnitType , True )
306+ value_fn = lambda s , d : Unit .convert_feed (d .manual_feed_quantity , None , s .member .feedUnitType , True )
296307 if not s .portions_enabled else d .manual_feed_quantity ,
297308 entity_registry_visible_default_fn = lambda self : self .enable_for_manual_feed ,
298309 entity_registry_enabled_default_fn = lambda self : self .enable_for_manual_feed ,
310+ available_fn = lambda self : self .enable_for_manual_feed ,
299311 petlibro_unit = APIKey .FEED_UNIT ,
300312 ),
301313 ],
@@ -308,16 +320,17 @@ def _handle_coordinator_update(self) -> None:
308320 icon = "mdi:scale" ,
309321 mode = NumberMode .SLIDER ,
310322 native_unit_of_measurement_fn = lambda s : s .member .feedUnitType .symbol if not s .portions_enabled else "portions" ,
311- native_max_value_fn = lambda s : Unit .round (s .member .feedUnitType .factor * MAX_FEED_PORTIONS , s .member .feedUnitType )
323+ native_max_value_fn = lambda s : Unit .round (s .member .feedUnitType .factor * MAX_FEED_PORTIONS , s .member .feedUnitType )
312324 if not s .portions_enabled else MAX_FEED_PORTIONS ,
313325 native_min_value_fn = lambda s : round (s .member .feedUnitType .factor , 16 ) if not s .portions_enabled else 1 ,
314326 native_step_fn = lambda s : s .member .feedUnitType .factor if not s .portions_enabled else 1 ,
315- method = lambda s , d , v : d .set_manual_feed_quantity (Unit .convert_feed (v , s .member .feedUnitType , None )
327+ method = lambda s , d , v : d .set_manual_feed_quantity (Unit .convert_feed (v , s .member .feedUnitType , None )
316328 if not s .portions_enabled else v ),
317- value_fn = lambda s , d : Unit .convert_feed (d .manual_feed_quantity , None , s .member .feedUnitType , True )
329+ value_fn = lambda s , d : Unit .convert_feed (d .manual_feed_quantity , None , s .member .feedUnitType , True )
318330 if not s .portions_enabled else d .manual_feed_quantity ,
319331 entity_registry_visible_default_fn = lambda self : self .enable_for_manual_feed ,
320332 entity_registry_enabled_default_fn = lambda self : self .enable_for_manual_feed ,
333+ available_fn = lambda self : self .enable_for_manual_feed ,
321334 petlibro_unit = APIKey .FEED_UNIT ,
322335 ),
323336 PetLibroNumberEntityDescription [SpaceSmartFeeder ](
0 commit comments