Skip to content

Commit

Permalink
Feat/fixes evse data (#442)
Browse files Browse the repository at this point in the history
* added fixes for handling update of the evse data

* reformated code

* Fixed max current setpoint for AC

* reformated the code

* fixed flake 8 issue

* bumped version to 0.30.0
  • Loading branch information
tropxy authored Feb 7, 2025
1 parent 81896a0 commit 8a41323
Show file tree
Hide file tree
Showing 7 changed files with 91 additions and 21 deletions.
2 changes: 1 addition & 1 deletion iso15118/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.29.0"
__version__ = "0.30.0"
2 changes: 1 addition & 1 deletion iso15118/secc/controller/ev_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -429,7 +429,7 @@ def update_ac_charge_parameters_v20(
else:
raise UnknownEnergyService(f"Unknown Service {energy_service}")
# Create the session limits based on the rated limits
self.session_limits.dc_limits.update(ac_rated_limits.as_dict())
self.session_limits.ac_limits.update(ac_rated_limits.as_dict())

def _update_common_ac_charge_parameters_v20(
self,
Expand Down
49 changes: 48 additions & 1 deletion iso15118/secc/controller/evse_data.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import logging
from dataclasses import dataclass
from enum import Enum
from typing import Optional, Union
Expand All @@ -18,6 +19,8 @@
DCChargeParameterDiscoveryResParams,
)

logger = logging.getLogger(__name__)


@dataclass
class EVSEACCPDLimits(Limits):
Expand Down Expand Up @@ -217,6 +220,12 @@ def update_ac_charge_parameters_v2(
self, ac_charge_parameter: ACEVSEChargeParameter
) -> None:
"""Update the EVSE data context with the AC charge parameters."""
logger.debug(
"Updating EVSE Data Context (Rated and Session Limits) with "
"ChargeParameterDiscoveryResponse"
)
logger.debug(f"Active Rated Limits {self.rated_limits.ac_limits}")
logger.debug(f"Active Session Limits {self.session_limits.ac_limits}")
self.current_type = CurrentType.AC
if self.rated_limits.ac_limits is None:
self.rated_limits.ac_limits = EVSEACCPDLimits()
Expand Down Expand Up @@ -248,11 +257,22 @@ def update_ac_charge_parameters_v2(
setattr(session_limits, value, rated_value)
except TypeError:
pass
logger.debug(
"Rated and Session Limits updated after " "ChargeParametersDiscovery"
)
logger.debug(f"New Rated Limits {self.rated_limits.ac_limits}")
logger.debug(f"New Session Limits {self.session_limits.ac_limits}")

def update_dc_charge_parameters(
self, dc_charge_parameter: DCEVSEChargeParameter
) -> None:
"""Update the EVSE data context with the DC charge parameters."""
logger.debug(
"Updating EVSE Data Context (Rated and Session Limits) with "
"ChargeParameterDiscoveryResponse"
)
logger.debug(f"Active Rated Limits {self.rated_limits.dc_limits}")
logger.debug(f"Active Session Limits {self.session_limits.dc_limits}")
self.current_type = CurrentType.DC
if not self.rated_limits.dc_limits:
self.rated_limits.dc_limits = EVSEDCCPDLimits()
Expand Down Expand Up @@ -297,6 +317,11 @@ def update_dc_charge_parameters(
setattr(self.session_limits.dc_limits, value, rated_value)
except TypeError:
pass
logger.debug(
"Rated and Session Limits updated after " "ChargeParametersDiscovery"
)
logger.debug(f"New Rated Limits {self.rated_limits.dc_limits}")
logger.debug(f"New Session Limits {self.session_limits.dc_limits}")

def update_ac_charge_parameters_v20(
self,
Expand All @@ -305,6 +330,12 @@ def update_ac_charge_parameters_v20(
) -> None:
"""Update the EVSE data context with the
ACChargeParameterDiscoveryRes parameters"""
logger.debug(
"Updating EVSE Data Context (Rated and Session Limits) with "
"ChargeParameterDiscoveryResponse"
)
logger.debug(f"Active Rated Limits {self.rated_limits.ac_limits}")
logger.debug(f"Active Session Limits {self.session_limits.ac_limits}")
self.current_type = CurrentType.AC
ac_rated_limits = self.rated_limits.ac_limits = EVSEACCPDLimits()
self.session_limits = EVSESessionLimits()
Expand All @@ -321,7 +352,12 @@ def update_ac_charge_parameters_v20(
else:
raise UnknownEnergyService(f"Unknown Service {energy_service}")
# Create the session limits based on the rated limits
self.session_limits.dc_limits.update(ac_rated_limits.as_dict())
self.session_limits.ac_limits.update(ac_rated_limits.as_dict())
logger.debug(
"Rated and Session Limits updated after " "ChargeParametersDiscovery"
)
logger.debug(f"New Rated Limits {self.rated_limits.ac_limits}")
logger.debug(f"New Session Limits {self.session_limits.ac_limits}")

def _update_common_ac_charge_parameters_v20(
self,
Expand Down Expand Up @@ -416,6 +452,12 @@ def update_dc_charge_parameters_v20(
) -> None:
"""Update the EVSE data context with the
DCChargeParameterDiscoveryRes parameters"""
logger.debug(
"Updating EVSE Data Context (Rated and Session Limits) with "
"ChargeParameterDiscoveryResponse"
)
logger.debug(f"Active Rated Limits {self.rated_limits.dc_limits}")
logger.debug(f"Active Session Limits {self.session_limits.dc_limits}")
self.current_type = CurrentType.DC
dc_rated_limits = self.rated_limits.dc_limits = EVSEDCCPDLimits()
self.session_limits = EVSESessionLimits()
Expand All @@ -433,6 +475,11 @@ def update_dc_charge_parameters_v20(
raise UnknownEnergyService(f"Unknown Service {energy_service}")
# Create the session limits based on the rated limits
self.session_limits.dc_limits.update(dc_rated_limits.as_dict())
logger.debug(
"Rated and Session Limits updated after " "ChargeParametersDiscovery"
)
logger.debug(f"New Rated Limits {self.rated_limits.dc_limits}")
logger.debug(f"New Session Limits {self.session_limits.dc_limits}")

def _update_common_dc_charge_parameters_v20(
self,
Expand Down
30 changes: 20 additions & 10 deletions iso15118/secc/controller/interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -907,36 +907,46 @@ async def get_evse_max_current_limit(
- ISO 15118-2
"""
# This is currently being used by -2 only.
logger.debug(
"Updating EVSE Data Context (Rated and Session Limits) with "
"ChargeParameterDiscoveryResponse"
)
session_limits = self.evse_data_context.session_limits
rated_limits = self.evse_data_context.rated_limits
if self.evse_data_context.current_type == CurrentType.AC:
logger.debug("Setting EVSE Max Current...")
logger.debug(f"Active Rated Limits: {rated_limits.ac_limits}")
logger.debug(f"Active Session Limits: {session_limits.ac_limits}")
ac_limits = session_limits.ac_limits
min_session_power_limit = ac_limits.max_charge_power
total_power_limit: float = ac_limits.max_charge_power
if ac_limits.max_charge_power_l2:
min_session_power_limit = min(
min_session_power_limit, ac_limits.max_charge_power_l2
)
total_power_limit += ac_limits.max_charge_power_l2
if ac_limits.max_charge_power_l3:
min_session_power_limit = min(
min_session_power_limit, ac_limits.max_charge_power_l3
)
total_power_limit += ac_limits.max_charge_power_l3
present_voltage = self.evse_data_context.present_voltage
if present_voltage == 0:
present_voltage = self.evse_data_context.nominal_voltage
if present_voltage == 0:
present_voltage = 230
present_voltage = 230.0
logger.warning(
"Present voltage and nominal voltage are 0,"
"using 230 Vrms as default"
"using 230.0 Vrms as default"
)
current_limit_phase = min_session_power_limit / present_voltage
logger.debug(f"Total Power Limit to Set: {total_power_limit}")
current_limit_phase = total_power_limit / present_voltage
logger.debug(f"New EVSEMaxCurrent limit: {current_limit_phase}")
exponent, value = PhysicalValue.get_exponent_value_repr(current_limit_phase)
return PVEVSEMaxCurrent(
multiplier=exponent,
value=value,
unit=UnitSymbol.AMPERE,
)
elif self.evse_data_context.current_type == CurrentType.DC:
logger.debug("Setting EVSE Max Current...")
logger.debug(f"Active Rated Limits: {rated_limits.dc_limits}")
logger.debug(f"Active Session Limits: {session_limits.dc_limits}")
current_limit = session_limits.dc_limits.max_charge_current
logger.debug(f"New EVSEMaxCurrentLimit: {current_limit}")
exponent, value = PhysicalValue.get_exponent_value_repr(current_limit)
return PVEVSEMaxCurrentLimit(
multiplier=exponent,
Expand Down
21 changes: 14 additions & 7 deletions iso15118/secc/states/iso15118_20_states.py
Original file line number Diff line number Diff line change
Expand Up @@ -1345,12 +1345,15 @@ async def process_message(
ac_params=params if energy_service == ServiceV20.AC else None,
bpt_ac_params=params if energy_service == ServiceV20.AC_BPT else None,
)
# Update EV/EVSE Data Context
self.charge_parameter_valid(ac_cpd_req.ac_params)
ev_data_context = self.comm_session.evse_controller.ev_data_context
ev_data_context.update_ac_charge_parameters_v20(energy_service, ac_cpd_req)
# Update EVSE Data Context
evse_data_context = self.comm_session.evse_controller.evse_data_context
evse_data_context.current_type = CurrentType.AC
evse_data_context.update_ac_charge_parameters_v20(
energy_service, ac_cpd_res
)
# Update EV Data Context
ev_data_context = self.comm_session.evse_controller.ev_data_context
ev_data_context.update_ac_charge_parameters_v20(energy_service, ac_cpd_req)
await self.comm_session.evse_controller.send_rated_limits()
except UnknownEnergyService:
self.stop_state_machine(
Expand Down Expand Up @@ -1542,11 +1545,15 @@ async def process_message(
dc_params=params if energy_service == ServiceV20.DC else None,
bpt_dc_params=params if energy_service == ServiceV20.DC_BPT else None,
)
# Update EV/EVSE Data Context
ev_data_context = self.comm_session.evse_controller.ev_data_context
ev_data_context.update_dc_charge_parameters_v20(energy_service, dc_cpd_req)
# Update EVSE Data Context
evse_data_context = self.comm_session.evse_controller.evse_data_context
evse_data_context.current_type = CurrentType.DC
evse_data_context.update_dc_charge_parameters_v20(
energy_service, dc_cpd_res
)
# Update EV Data Context
ev_data_context = self.comm_session.evse_controller.ev_data_context
ev_data_context.update_dc_charge_parameters_v20(energy_service, dc_cpd_req)
await self.comm_session.evse_controller.send_rated_limits()
except UnknownEnergyService:
self.stop_state_machine(
Expand Down
6 changes: 6 additions & 0 deletions iso15118/secc/states/iso15118_2_states.py
Original file line number Diff line number Diff line change
Expand Up @@ -1368,15 +1368,21 @@ async def process_message(
ac_evse_charge_params = (
await self.comm_session.evse_controller.get_ac_charge_params_v2()
)
# Update EVSE data context with the AC charge parameters
evse_data_context.update_ac_charge_parameters_v2(ac_evse_charge_params)
evse_data_context.current_type = CurrentType.AC
# Update EV data context with the DC charge parameters
ev_data_context.update_ac_charge_parameters_v2(
charge_params_req.ac_ev_charge_parameter
)
else:
dc_evse_charge_params = (
await self.comm_session.evse_controller.get_dc_charge_parameters_v2()
)
# Update EVSE data context with the DC charge parameters
evse_data_context.update_dc_charge_parameters(dc_evse_charge_params)
evse_data_context.current_type = CurrentType.DC
# Update EV data context with the DC charge parameters
ev_data_context.update_dc_charge_parameters(
charge_params_req.dc_ev_charge_parameter
)
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "iso15118"
version = "0.29.0"
version = "0.30.0"
description = "Implementation of DIN SPEC 70121, ISO 15118-2 and -20 specs for SECC"
authors = [
"André Duarte <[email protected]>",
Expand Down

0 comments on commit 8a41323

Please sign in to comment.