From 0f4a23b294668d55805abe69707d990ee0fdeed4 Mon Sep 17 00:00:00 2001 From: Tiago Tavares Date: Mon, 3 Nov 2025 16:38:26 +0000 Subject: [PATCH 1/2] GSYE-886: validate ev charger preferred charging power --- .../validators/ev_charger_validator.py | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/gsy_framework/validators/ev_charger_validator.py b/gsy_framework/validators/ev_charger_validator.py index 37506bbf..bc176c19 100644 --- a/gsy_framework/validators/ev_charger_validator.py +++ b/gsy_framework/validators/ev_charger_validator.py @@ -3,6 +3,7 @@ from gsy_framework.validators.base_validator import BaseValidator from gsy_framework.enums import GridIntegrationType from gsy_framework.validators.utils import validate_range_limit +from gsy_framework.read_user_profile import read_arbitrary_profile, InputProfileTypes EVChargerSettings = ConstSettings.EVChargerSettings @@ -14,6 +15,7 @@ class EVChargerValidator(BaseValidator): def validate(cls, **kwargs): cls._validate_grid_integration(**kwargs) cls._validate_max_power(**kwargs) + cls._validate_preferred_charging_power(**kwargs) @staticmethod def _validate_grid_integration(**kwargs): @@ -49,3 +51,30 @@ def _validate_max_power(cls, **kwargs): max_limit, {"misconfiguration": [f"{name} should be between {min_limit} & {max_limit}."]}, ) + + @classmethod + def _validate_preferred_charging_power(cls, **kwargs): + """Validate preferred charging power parameter.""" + preferred_charging_power = kwargs.get("preferred_charging_power") + maximum_power_rating_kW = kwargs.get("maximum_power_rating_kW") + + if preferred_charging_power is None: + return + + # Convert to profile if needed + preferred_power_profile = read_arbitrary_profile( + InputProfileTypes.IDENTITY, preferred_charging_power + ) + + # Validate that all absolute values are within maximum power rating + for time_slot, power_value in preferred_power_profile.items(): + if maximum_power_rating_kW and abs(power_value) > maximum_power_rating_kW: + raise GSyDeviceException( + { + "misconfiguration": [ + f"Absolute value of preferred_charging_power ({abs(power_value)} kW " + f"at {time_slot}) cannot exceed maximum_power_rating_kW " + f"({maximum_power_rating_kW} kW)." + ] + } + ) From 3b4e97c120bfdf06aafe1f371d44f503b9d07121 Mon Sep 17 00:00:00 2001 From: Tiago Tavares Date: Mon, 3 Nov 2025 16:48:41 +0000 Subject: [PATCH 2/2] fix: profile reader --- gsy_framework/validators/ev_charger_validator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gsy_framework/validators/ev_charger_validator.py b/gsy_framework/validators/ev_charger_validator.py index bc176c19..c15556fe 100644 --- a/gsy_framework/validators/ev_charger_validator.py +++ b/gsy_framework/validators/ev_charger_validator.py @@ -3,7 +3,7 @@ from gsy_framework.validators.base_validator import BaseValidator from gsy_framework.enums import GridIntegrationType from gsy_framework.validators.utils import validate_range_limit -from gsy_framework.read_user_profile import read_arbitrary_profile, InputProfileTypes +from gsy_framework.read_user_profile import UserProfileReader, InputProfileTypes EVChargerSettings = ConstSettings.EVChargerSettings @@ -62,7 +62,7 @@ def _validate_preferred_charging_power(cls, **kwargs): return # Convert to profile if needed - preferred_power_profile = read_arbitrary_profile( + preferred_power_profile = UserProfileReader().read_arbitrary_profile( InputProfileTypes.IDENTITY, preferred_charging_power )