""" Options: Date: 2025-09-10 19:54:20 Version: 8.30 Tip: To override a DTO option, remove "#" prefix before updating BaseUrl: https://dev-optimization.power.dev #GlobalNamespace: #AddServiceStackTypes: True #AddResponseStatus: False #AddImplicitVersion: #AddDescriptionAsComments: True IncludeTypes: CommonOptimizerYearlyRequest.* #ExcludeTypes: #DefaultImports: datetime,decimal,marshmallow.fields:*,servicestack:*,typing:*,dataclasses:dataclass/field,dataclasses_json:dataclass_json/LetterCase/Undefined/config,enum:Enum/IntEnum #DataClass: #DataClassJson: """ import datetime import decimal from marshmallow.fields import * from servicestack import * from typing import * from dataclasses import dataclass, field from dataclasses_json import dataclass_json, LetterCase, Undefined, config from enum import Enum, IntEnum class DataProvider(IntEnum): UNDEFINED = 0 SPP = 1 ERCOT = 2 MISO = 3 CAISO = 4 PJM = 5 ISONE = 6 NYISO = 7 NW = 8 SW = 9 SE = 10 AESO = 11 IESO = 12 CENACE = 20 NONISO = 99 EIA = 100 PNM = 150 NREL = 200 NOAA = 210 ENTSOE = 1000 EPIAS = 1010 SELF = 10000 class PowerPlantType(str, Enum): UNDEFINED = 'Undefined' SOLAR = 'Solar' WIND = 'Wind' HYBRID = 'Hybrid' @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class BatteryScenarioKeyGroup: key_id: int = 0 year: int = 0 node_id: int = 0 provider: Optional[DataProvider] = None zone_id: int = 0 plant_type: Optional[PowerPlantType] = None solar_id: int = 0 wind_id: int = 0 is_serverless: bool = False class BatteryScenarioType(str, Enum): UNDEFINED = 'Undefined' OPTIMIZATION = 'Optimization' SUM = 'Sum' OPTI_SUM = 'OptiSum' FULL_TOD = 'FullTod' CAPACITY_TOD = 'CapacityTod' class PriceMarketType(IntEnum): UNDEFINED = 0 REALTIME = 1 DAY_AHEAD = 10 DART = 101 @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class BatteryScenarioKeyItem: project_id: Optional[str] = None key_id: int = 0 key_type: Optional[BatteryScenarioType] = None record_key: Optional[str] = None job_status: int = 0 status: int = 0 min_date: datetime.datetime = datetime.datetime(1, 1, 1) max_date: datetime.datetime = datetime.datetime(1, 1, 1) year: int = 0 yoy_status: int = 0 usable_capacity: Decimal = decimal.Decimal(0) usable_capacity_factor: Decimal = decimal.Decimal(0) solar_usable_capacity: Decimal = decimal.Decimal(0) solar_usable_capacity_factor: Decimal = decimal.Decimal(0) base_market: Optional[PriceMarketType] = None base_capacity_rate: Decimal = decimal.Decimal(0) capacity_rate: Decimal = decimal.Decimal(0) solar_capacity_rate: Decimal = decimal.Decimal(0) wind_capacity_rate: Decimal = decimal.Decimal(0) charge_efficinecy: Decimal = decimal.Decimal(0) discharge_efficinecy: Decimal = decimal.Decimal(0) node_id: int = 0 provider: Optional[DataProvider] = None zone_id: int = 0 lmp_file_id: int = 0 production_file_id: int = 0 load_file_id: int = 0 capacity_file_id: int = 0 plant_type: Optional[PowerPlantType] = None solar_id: int = 0 wind_id: int = 0 ancillary_increment_factor: Decimal = decimal.Decimal(0) energy_increment_factor: Decimal = decimal.Decimal(0) capacity_increment_factor: Decimal = decimal.Decimal(0) class BatteryProjectGroup(str, Enum): UNDEFINED = 'Undefined' STAND_ALONE = 'StandAlone' FTM = 'FTM' BTM = 'BTM' class BooleanValue(str, Enum): UNDEFINED = 'Undefined' YES = 'Yes' NO = 'No' CUSTOM = 'Custom' @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class BatteryProjectTodItem: month: int = 0 week_day: int = 0 hour: int = 0 price: Decimal = decimal.Decimal(0) # @Ignore() id: Optional[str] = None class RevenueStackingMode(str, Enum): SOLVE_WITHOUT_ANCILLARY = 'SolveWithoutAncillary' SOLVE_WITH_ANCILLARY = 'SolveWithAncillary' @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class MonthlyRequestBase: project_id: Optional[str] = None node_alt_id: int = 0 iso: Optional[DataProvider] = None use_energy: Optional[BooleanValue] = None use_ancillary: Optional[BooleanValue] = None use_capacity_tod: bool = False base_market: Optional[PriceMarketType] = None capacity_t_o_ds: Optional[List[BatteryProjectTodItem]] = None use_regup: Decimal = decimal.Decimal(0) use_regdown: Decimal = decimal.Decimal(0) use_spinning: Decimal = decimal.Decimal(0) use_non_spinning: Decimal = decimal.Decimal(0) paracitic_losses_operation: Decimal = decimal.Decimal(0) paracitic_losses_resting: Decimal = decimal.Decimal(0) hvac_losses: Decimal = decimal.Decimal(0) ac_cabling_losses: Decimal = decimal.Decimal(0) transformator_losses: Decimal = decimal.Decimal(0) other_losses: Decimal = decimal.Decimal(0) representative_year: int = 0 increment_referance_year: int = 0 use_future_data: int = 0 max_daily_cycle: Decimal = decimal.Decimal(0) min_daily_profit_per_mw: Decimal = decimal.Decimal(0) ancillary_file_id: int = 0 lmp_file_id: int = 0 max_charging_price_cap: Decimal = decimal.Decimal(0) max_discharging_price_cap: Decimal = decimal.Decimal(0) max_ancillary_price_cap: Decimal = decimal.Decimal(0) revenue_stacking_mode: Optional[RevenueStackingMode] = None optimization_quality: int = 0 ensure_exlusive: int = 0 node_ref_id: int = 0 use_internal_solver: bool = False @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class YearlyApiStatusResponse: failed_count: int = 0 message: Optional[str] = None # @Route("/optimizer/yearly", "POST") @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class CommonOptimizerYearlyRequest(MonthlyRequestBase, IReturn[YearlyApiStatusResponse]): month: int = 0 group: Optional[BatteryScenarioKeyGroup] = None key: Optional[BatteryScenarioKeyItem] = None project_group: Optional[BatteryProjectGroup] = None