diff --git a/iso15118/__init__.py b/iso15118/__init__.py index f634f5ba..0bda2bd0 100644 --- a/iso15118/__init__.py +++ b/iso15118/__init__.py @@ -1 +1 @@ -__version__ = "0.29.0" +__version__ = "0.30.0" diff --git a/iso15118/secc/controller/ev_data.py b/iso15118/secc/controller/ev_data.py index 2156499d..0bce0d0d 100644 --- a/iso15118/secc/controller/ev_data.py +++ b/iso15118/secc/controller/ev_data.py @@ -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, diff --git a/iso15118/secc/controller/evse_data.py b/iso15118/secc/controller/evse_data.py index 37838fd9..dbe18859 100644 --- a/iso15118/secc/controller/evse_data.py +++ b/iso15118/secc/controller/evse_data.py @@ -1,3 +1,4 @@ +import logging from dataclasses import dataclass from enum import Enum from typing import Optional, Union @@ -18,6 +19,8 @@ DCChargeParameterDiscoveryResParams, ) +logger = logging.getLogger(__name__) + @dataclass class EVSEACCPDLimits(Limits): @@ -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() @@ -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() @@ -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, @@ -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() @@ -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, @@ -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() @@ -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, diff --git a/iso15118/secc/controller/interface.py b/iso15118/secc/controller/interface.py index e21d5c46..a9d8f4a2 100644 --- a/iso15118/secc/controller/interface.py +++ b/iso15118/secc/controller/interface.py @@ -907,28 +907,34 @@ 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, @@ -936,7 +942,11 @@ async def get_evse_max_current_limit( 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, diff --git a/iso15118/secc/states/iso15118_20_states.py b/iso15118/secc/states/iso15118_20_states.py index 78720275..381fc4e9 100644 --- a/iso15118/secc/states/iso15118_20_states.py +++ b/iso15118/secc/states/iso15118_20_states.py @@ -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( @@ -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( diff --git a/iso15118/secc/states/iso15118_2_states.py b/iso15118/secc/states/iso15118_2_states.py index 8a762e55..8728fcf9 100644 --- a/iso15118/secc/states/iso15118_2_states.py +++ b/iso15118/secc/states/iso15118_2_states.py @@ -1368,7 +1368,10 @@ 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 ) @@ -1376,7 +1379,10 @@ async def process_message( 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 ) diff --git a/pyproject.toml b/pyproject.toml index 0fbc10c5..c5e073c7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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 ",