diff --git a/gsy_framework/validators/ev_charger_validator.py b/gsy_framework/validators/ev_charger_validator.py index 37506bbf..c15556fe 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 UserProfileReader, 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 = UserProfileReader().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)." + ] + } + )