1919 MissingSerial ,
2020 ParseJSONError ,
2121 UnknownError ,
22+ UnsupportedFeature ,
2223)
2324from .websocket import (
2425 SIGNAL_CONNECTION_STATE ,
@@ -300,6 +301,9 @@ async def divert_mode(self, mode: str = "normal") -> None:
300301
301302 async def get_override (self ) -> None :
302303 """Get the manual override status."""
304+ if not self ._version_check ("4.0.0" ):
305+ _LOGGER .debug ("Feature not supported for older firmware." )
306+ raise UnsupportedFeature
303307 url = f"{ self .url } override"
304308
305309 _LOGGER .debug ("Getting data from %s" , url )
@@ -309,27 +313,37 @@ async def get_override(self) -> None:
309313 async def set_override (
310314 self ,
311315 state : str ,
312- charge_current : int ,
313- max_current : int ,
314- energy_limit : int ,
315- time_limit : int ,
316+ charge_current : int | None = None ,
317+ max_current : int | None = None ,
318+ energy_limit : int | None = None ,
319+ time_limit : int | None = None ,
316320 auto_release : bool = True ,
317- ) -> str :
321+ ) -> Any :
318322 """Set the manual override status."""
323+ if not self ._version_check ("4.0.0" ):
324+ _LOGGER .debug ("Feature not supported for older firmware." )
325+ raise UnsupportedFeature
319326 url = f"{ self .url } override"
320327
321328 if state not in ["active" , "disabled" ]:
329+ _LOGGER .error ("Invalid override state: %s" , state )
322330 raise ValueError
323331
324332 data = {
325333 "state" : state ,
326- "charge_current" : charge_current ,
327- "max_current" : max_current ,
328- "energy_limit" : energy_limit ,
329- "time_limit" : time_limit ,
330334 "auto_release" : auto_release ,
331335 }
332336
337+ if charge_current :
338+ data ["charge_current" ] = charge_current
339+ if max_current :
340+ data ["max_current" ] = max_current
341+ if energy_limit :
342+ data ["energy_limit" ] = energy_limit
343+ if time_limit :
344+ data ["time_limit" ] = time_limit
345+
346+ _LOGGER .debug ("Override data: %s" , data )
333347 _LOGGER .debug ("Setting override config on %s" , url )
334348 response = await self .process_request (
335349 url = url , method = "post" , data = data
@@ -340,22 +354,7 @@ async def toggle_override(self) -> None:
340354 """Toggle the manual override status."""
341355 # 3.x: use RAPI commands $FE (enable) and $FS (sleep)
342356 # 4.x: use HTTP API call
343-
344- cutoff = AwesomeVersion ("4.0.0" )
345- current = ""
346-
347- _LOGGER .debug ("Detected firmware: %s" , self ._config ["version" ])
348-
349- if "dev" in self ._config ["version" ]:
350- value = self ._config ["version" ]
351- _LOGGER .debug ("Stripping 'dev' from version." )
352- value = value .split ("." )
353- value = "." .join (value [0 :3 ])
354- current = AwesomeVersion (value )
355- else :
356- current = AwesomeVersion (self ._config ["version" ])
357-
358- if current >= cutoff :
357+ if self ._version_check ("4.0.0" ):
359358 url = f"{ self .url } override"
360359
361360 _LOGGER .debug ("Toggling manual override %s" , url )
@@ -370,6 +369,9 @@ async def toggle_override(self) -> None:
370369
371370 async def clear_override (self ) -> None :
372371 """Clear the manual override status."""
372+ if not self ._version_check ("4.0.0" ):
373+ _LOGGER .debug ("Feature not supported for older firmware." )
374+ raise UnsupportedFeature
373375 url = f"{ self .url } override"
374376
375377 _LOGGER .debug ("Clearing manual override %s" , url )
@@ -381,21 +383,8 @@ async def set_current(self, amps: int = 6) -> None:
381383 # 3.x - 4.1.0: use RAPI commands $SC <amps>
382384 # 4.1.2: use HTTP API call
383385 amps = int (amps )
384- cutoff = AwesomeVersion ("4.1.2" )
385- current = ""
386-
387- _LOGGER .debug ("Detected firmware: %s" , current )
388-
389- if "dev" in self ._config ["version" ]:
390- value = self ._config ["version" ]
391- _LOGGER .debug ("Stripping 'dev' from version." )
392- value = value .split ("." )
393- value = "." .join (value [0 :3 ])
394- current = AwesomeVersion (value )
395- else :
396- current = AwesomeVersion (self ._config ["version" ])
397386
398- if current >= cutoff :
387+ if self . _version_check ( "4.1.2" ) :
399388 url = f"{ self .url } config"
400389
401390 if (
@@ -488,6 +477,26 @@ async def firmware_check(self) -> dict | None:
488477 response ["release_url" ] = message ["html_url" ]
489478 return response
490479
480+ def _version_check (self , min_version : str ) -> bool :
481+ """Return bool if minimum version is met."""
482+ cutoff = AwesomeVersion (min_version )
483+ current = ""
484+
485+ _LOGGER .debug ("Detected firmware: %s" , self ._config ["version" ])
486+
487+ if "dev" in self ._config ["version" ]:
488+ value = self ._config ["version" ]
489+ _LOGGER .debug ("Stripping 'dev' from version." )
490+ value = value .split ("." )
491+ value = "." .join (value [0 :3 ])
492+ current = AwesomeVersion (value )
493+ else :
494+ current = AwesomeVersion (self ._config ["version" ])
495+
496+ if current >= cutoff :
497+ return True
498+ return False
499+
491500 @property
492501 def hostname (self ) -> str :
493502 """Return charger hostname."""
0 commit comments