""" Options: Date: 2025-09-10 18:59:01 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: CommonOptimizerRequest.* #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 @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class CommonOptimizerPortalRequestBase: project_id: Optional[str] = None is_batch_simulation: bool = False force: bool = False disable_e_b_s_spot: bool = False is_serverless: bool = False api_action_id: Optional[str] = None node_id: int = 0 parallel_project: int = 0 parallel_years: int = 0 ensure_exlusive: int = 0 class BatteryProjectGroup(str, Enum): UNDEFINED = 'Undefined' STAND_ALONE = 'StandAlone' FTM = 'FTM' BTM = 'BTM' 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 BooleanValue(str, Enum): UNDEFINED = 'Undefined' YES = 'Yes' NO = 'No' CUSTOM = 'Custom' class PriceMarketType(IntEnum): UNDEFINED = 0 REALTIME = 1 DAY_AHEAD = 10 DART = 101 class RevenueStackingMode(str, Enum): SOLVE_WITHOUT_ANCILLARY = 'SolveWithoutAncillary' SOLVE_WITH_ANCILLARY = 'SolveWithAncillary' class ApiResponseStatus(IntEnum): UNDEFINED = 0 SUCCESS = 1 PENDING = 10 FAILED = 100 class BatterySimulationType(IntEnum): UNDEFINED = 0 SINGLE_RUN = 1 BATCH_SIMULATION = 2 BATCH_SUB = 21 SITING = 100 class BatteryProjectAction(str, Enum): UNDEFINED = 'Undefined' ARBITRAGE = 'Arbitrage' PEAK_SHAVING = 'PeakShaving' SMOOTING = 'Smooting' FIRMING = 'Firming' class BatteryDataSoruce(str, Enum): UNDEFINED = 'Undefined' MERCHANT = 'Merchant' FUTURE = 'Future' TOD = 'TOD' class TimeGranularity(IntEnum): UNDEFINED = 0 HOURLY = 1 DAILY = 2 WEEKLY = 3 MONTHY = 4 YEARLY = 5 FIVEMIN = 10 TENMIN = 11 FIFTEENMIN = 12 HALFHOUR = 13 QUARTERLY = 14 TWOHOURS = 21 THREEHOURS = 22 FOURHOURS = 24 SIXHOURS = 26 EIGHTHOURS = 28 TWELVEHOURS = 32 IRREGULAR = 100 class CapacityMethod(str, Enum): UNDEFINED = 'Undefined' ANNUAL = 'Annual' TOD = 'Tod' SCHEDULE = 'Schedule' class BatteryProductionDataSource(str, Enum): UNDEFINED = 'Undefined' SET_CLOSEST = 'SetClosest' UPLOADED_FILE = 'UploadedFile' class PowerPlantType(str, Enum): UNDEFINED = 'Undefined' SOLAR = 'Solar' WIND = 'Wind' HYBRID = 'Hybrid' @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class BatteryProjectForOptimizer: project_id: Optional[str] = None version: Optional[str] = None base_id: Optional[str] = None alt_id: int = 0 simulation_type: Optional[BatterySimulationType] = None project_group: Optional[BatteryProjectGroup] = None project_action: Optional[BatteryProjectAction] = None iso: Optional[DataProvider] = None name: Optional[str] = None base_node_id: int = 0 org_node_id: int = 0 base_zone_id: int = 0 data_source: Optional[BatteryDataSoruce] = None base_market: Optional[PriceMarketType] = None price_granularity: Optional[TimeGranularity] = None start_date: datetime.datetime = datetime.datetime(1, 1, 1) end_date: datetime.datetime = datetime.datetime(1, 1, 1) battery_capacity: Decimal = decimal.Decimal(0) interconnection_limit: Decimal = decimal.Decimal(0) namepalet_capacity: Decimal = decimal.Decimal(0) # @Ignore() charge_discharge_limit: Decimal = decimal.Decimal(0) # @Ignore() base_capacity_rate: Decimal = decimal.Decimal(0) # @Ignore() capacity_rate: Decimal = decimal.Decimal(0) charge_efficiency: Decimal = decimal.Decimal(0) dis_charge_efficiency: 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) thermal_losses: Decimal = decimal.Decimal(0) other_losses: Decimal = decimal.Decimal(0) use_energy: Optional[BooleanValue] = None use_capacity: Optional[BooleanValue] = None capacity_basis: Optional[CapacityMethod] = None capacity_payment: Decimal = decimal.Decimal(0) net_capacity_factor: Decimal = decimal.Decimal(0) use_ancillary: Optional[BooleanValue] = None production_data_source: Optional[BatteryProductionDataSource] = None power_plant_type: Optional[PowerPlantType] = None solar_ac_capacity: Decimal = decimal.Decimal(0) solar_dc_capacity: Decimal = decimal.Decimal(0) wind_ac_capacity: Decimal = decimal.Decimal(0) # @Ignore() solar_capacity_rate: Decimal = decimal.Decimal(0) # @Ignore() wind_capacity_rate: Decimal = decimal.Decimal(0) status: int = 0 simulation_status: int = 0 last_simulation_date: datetime.datetime = datetime.datetime(1, 1, 1) data_start_date: datetime.datetime = datetime.datetime(1, 1, 1) data_end_date: datetime.datetime = datetime.datetime(1, 1, 1) solar_id: int = 0 wind_id: int = 0 lmp_file_id: int = 0 production_file_id: int = 0 load_file_id: int = 0 capacity_file_id: int = 0 node_alt_id: int = 0 node_ref_id: int = 0 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) solar_degredation: Decimal = decimal.Decimal(0) battery_degredation: Decimal = decimal.Decimal(0) augmentation: Decimal = decimal.Decimal(0) augmentation_frequency: Decimal = decimal.Decimal(0) energy_increment: Decimal = decimal.Decimal(0) ancillary_increment: Decimal = decimal.Decimal(0) enable_grid_arbitrage: int = 0 increment_referance_year: int = 0 representative_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 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 use_internal_solver: bool = False @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class CommonOptimizerResponse: status: Optional[ApiResponseStatus] = None message: Optional[str] = None api_action_id: Optional[str] = None detail: Optional[str] = None items: Optional[List[BatteryProjectForOptimizer]] = None # @Route("/optimizer/ftm", "POST") # @Route("/optimizer/common", "POST") @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class CommonOptimizerRequest(CommonOptimizerPortalRequestBase, IReturn[CommonOptimizerResponse]): pass