Power.Dev Optimization Services

<back to all web services

CommonOptimizerRequest

The following routes are available for this service:
POST/optimizer/ftm
POST/optimizer/common
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


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class CommonOptimizerRequest(CommonOptimizerPortalRequestBase):
    pass


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 BatteryProjectGroup(str, Enum):
    UNDEFINED = 'Undefined'
    STAND_ALONE = 'StandAlone'
    FTM = 'FTM'
    BTM = 'BTM'


class BatteryProjectAction(str, Enum):
    UNDEFINED = 'Undefined'
    ARBITRAGE = 'Arbitrage'
    PEAK_SHAVING = 'PeakShaving'
    SMOOTING = 'Smooting'
    FIRMING = 'Firming'


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 BatteryDataSoruce(str, Enum):
    UNDEFINED = 'Undefined'
    MERCHANT = 'Merchant'
    FUTURE = 'Future'
    TOD = 'TOD'


class PriceMarketType(IntEnum):
    UNDEFINED = 0
    REALTIME = 1
    DAY_AHEAD = 10
    DART = 101


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 BooleanValue(str, Enum):
    UNDEFINED = 'Undefined'
    YES = 'Yes'
    NO = 'No'
    CUSTOM = 'Custom'


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'


class RevenueStackingMode(str, Enum):
    SOLVE_WITHOUT_ANCILLARY = 'SolveWithoutAncillary'
    SOLVE_WITH_ANCILLARY = 'SolveWithAncillary'


@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

Python CommonOptimizerRequest DTOs

To override the Content-type in your clients, use the HTTP Accept Header, append the .csv suffix or ?format=csv

HTTP + CSV

The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.

POST /optimizer/ftm HTTP/1.1 
Host: dev-optimization.power.dev 
Accept: text/csv
Content-Type: text/csv
Content-Length: length

{"projectId":"00000000000000000000000000000000","isBatchSimulation":false,"force":false,"disableEBSSpot":false,"isServerless":false,"apiActionId":"00000000000000000000000000000000","nodeId":0,"parallelProject":0,"parallelYears":0,"ensureExlusive":0}
HTTP/1.1 200 OK
Content-Type: text/csv
Content-Length: length

{"status":"Undefined","message":"String","apiActionId":"00000000000000000000000000000000","detail":"String"}