diff --git a/mytoyota/models/electric_status.py b/mytoyota/models/electric_status.py new file mode 100644 index 0000000..9e7fbc6 --- /dev/null +++ b/mytoyota/models/electric_status.py @@ -0,0 +1,120 @@ +"""models for vehicle electric status.""" +from datetime import date +from typing import Optional + +from mytoyota.models.endpoints.electric import ElectricStatusModel +from mytoyota.utils.conversions import convert_distance + + +class ElectricStatus: + """ElectricStatus.""" + + def __init__( + self, + electric_status: ElectricStatusModel = None, + metric: bool = True, + ): + """Initialise ElectricStatus.""" + self._electric_status: Optional[ElectricStatusModel] = ( + electric_status.payload if electric_status else None + ) + self._distance_unit: str = "km" if metric else "mi" + + def __repr__(self): + """Representation of the model.""" + return " ".join( + [ + f"{k}={getattr(self, k)!s}" + for k, v in type(self).__dict__.items() + if isinstance(v, property) + ], + ) + + @property + def battery_level(self) -> Optional[float]: + """Battery level of the vehicle. + + Returns + ------- + float: Battery level of the vehicle in percentage. + + """ + return self._electric_status.battery_level if self._electric_status else None + + @property + def charging_status(self) -> Optional[str]: + """Charging status of the vehicle. + + Returns + ------- + str: Charging status of the vehicle. + + """ + return self._electric_status.charging_status + + @property + def remaining_charge_time(self) -> Optional[int]: + """Remaining time to full charge in minutes. + + Returns + ------- + int: Remaining time to full charge in minutes. + + """ + return self._electric_status.remaining_charge_time + + @property + def ev_range(self) -> Optional[float]: + """Electric vehicle range. + + Returns + ------- + float: Electric vehicle range in the current selected units. + + """ + if self._electric_status: + return convert_distance( + self._distance_unit, + self._electric_status.ev_range.unit, + self._electric_status.ev_range.value, + ) + return None + + @property + def ev_range_with_ac(self) -> Optional[float]: + """Electric vehicle range with AC. + + Returns + ------- + float: Electric vehicle range with AC in the current selected units. + + """ + if self._electric_status: + return convert_distance( + self._distance_unit, + self._electric_status.ev_range_with_ac.unit, + self._electric_status.ev_range_with_ac.value, + ) + return None + + @property + def can_set_next_charging_event(self) -> Optional[bool]: + """Can set next charging event. + + Returns + ------- + bool: Can set next charging event. + + """ + return self._electric_status.can_set_next_charging_event if self._electric_status else None + + @property + def last_update_timestamp(self) -> Optional[date]: + """Last update timestamp. + + Returns + ------- + date: Last update timestamp. + + """ + return self._electric_status.last_update_timestamp if self._electric_status else None diff --git a/mytoyota/models/vehicle.py b/mytoyota/models/vehicle.py index 538b3ab..41189d5 100644 --- a/mytoyota/models/vehicle.py +++ b/mytoyota/models/vehicle.py @@ -12,6 +12,7 @@ from mytoyota.api import Api from mytoyota.models.dashboard import Dashboard +from mytoyota.models.electric_status import ElectricStatus from mytoyota.models.endpoints.vehicle_guid import VehicleGuidModel from mytoyota.models.location import Location from mytoyota.models.lock_status import LockStatus @@ -170,6 +171,21 @@ def dashboard(self) -> Optional[Dashboard]: self._metric, ) + @property + def electric_status(self) -> Optional[ElectricStatus]: + """Returns the Electric Status of the vehicle. + + Returns + ------- + Electric Status + + """ + return ( + ElectricStatus(self._endpoint_data["electric_status"]) + if "electric_status" in self._endpoint_data + else None + ) + @property def location(self) -> Optional[Location]: """Return the vehicles latest reported Location. diff --git a/simple_client_example.py b/simple_client_example.py index 461d44c..e7e3653 100644 --- a/simple_client_example.py +++ b/simple_client_example.py @@ -51,6 +51,8 @@ async def get_information(): # Dashboard Information pp.pprint(f"Dashboard: {car.dashboard}") + # Electric Status Information + pp.pprint(f"Electric Status: {car.electric_status}") # Location Information pp.pprint(f"Location: {car.location}") # Lock Status