Source code for evnrg.common.powertrain

import enum
from typing import NamedTuple

from .fuel import Fuel, E10
from .plug import DCPlug

__all__ = [
    'PType',
    'Powertrain'
]

[docs]class PType(enum.IntEnum): """Constants that refer to the type of drive. Valid values are: * `ICEV`: Conventional combustion and hybrids (i.e. Honda Civic, Toyota Prius) * `PHEV`: Plug-in hybrids (i.e. Chevrolet Volt) * `BEV`: Battery electric vehicles (i.e. Tesla Model 3) """ ICEV = enum.auto() PHEV = enum.auto() BEV = enum.auto()
[docs]class Powertrain(NamedTuple): """A `NamedTuple` that contains information about the powertrain of a vehicle. Since the powertrain technical info is all that's needed for the simulation; make and model information don't really matter. However, a code (optional) is useful to keep track of what powertrain has been used. Attrributes: id (str): A short code useful for looking up the object in a database. ice_eff (float): Fuel efficiency of the powertrain in km/L. ev_eff (float): Electric efficiency in km/kWh. batt_cap (float): Energy capacity of the battery in kWh. ac_power (float): Maximum input AC power in kW. dc_power (float): Maximum input DC power in kW. dc_plug (int): Connector type for DCFC. ptype (int): Type of powertrain as represented by a PType. Values may be of `PType.ICEV`, `PType.PHEV`, or `PType.BEV`. fuel (Fuel): The fuel that this powertrain uses. May be `None` if `ptype` is `PType.BEV`. """ id: str = '' ice_eff: float = 32. ev_eff: float = 0. batt_cap: float = 0. ac_power: float = 0. dc_power: float = 0. dc_plug: int = DCPlug.NONE ptype: int = PType.ICEV fuel: Fuel = E10 @property def pev(self) -> bool: """Returns `True` if the powertrain is a plug-in(BEV or PHEV)""" return self.ptype in {PType.BEV, PType.PHEV} @property def bev(self) -> bool: """Returns `True` if the vehicle is a BEV""" return self.ptype == PType.BEV @property def has_ice(self) -> bool: """Returns `True` there's a fuel-powered engine (ICEV or PHEV)""" return self.ptype in [PType.ICEV, PType.PHEV] @property def phev(self) -> bool: """Returns `True` if the the powertrain is a PHEV.""" return self.ptype == PType.PHEV @property def icev(self) -> bool: """Returns `True` if the powertrain is a conventional ICEV/HEV""" return self.ptype == PType.ICEV @property def dc_capable(self) -> bool: """Returns `True` if the powertrain can accept AC conenctions.""" return self.dc_power > 0 @property def ac_capable(self) -> bool: """Returns `True` if the powertrain can accept DC connections.""" return self.ac_power > 0
[docs] def energy_at_soc(self, soc) -> float: """Returns how how much energy is in the battery at a given SoC.""" return self.batt_cap * max(0.0, min(soc, 1.0))