Skip to content

Electric Vehicle Charging

Optimize an electric vehicle charging station using epl.EVs.

Control a number of EV chargers to charge a number of charge events.

Chargers are configured by their size given in charger_mws.

A charge_event is a time interval where an EV can be charged. This is given as a boolean 2D array, with one binary digit for each charge event, interval pairs.

Each charge event has a required amount of electricity charge_event_mwh, that can be delivered when the charge_event is 1. The model is constrained so that each charge event receives all of it's charge_event_mwh.

Optimize two 100 MWe chargers for 4 charge events over 5 intervals:

import energypylinear as epl

electricity_prices = [-100, 50, 30, 50, 40]
charge_events = [
    [1, 0, 0, 0, 0],
    [0, 1, 1, 1, 0],
    [0, 0, 0, 1, 1],
    [0, 1, 0, 0, 0],
]

#  2 100 MW EV chargers
asset = epl.EVs(
    chargers_power_mw=[100, 100],
    charge_events_capacity_mwh=[50, 100, 30, 40],
    charger_turndown=0.1,
    electricity_prices=electricity_prices,
    charge_events=charge_events,
)

simulation = asset.optimize()

assert all(
    simulation.results.columns
    == [
        "site-import_power_mwh",
        "site-export_power_mwh",
        "site-electricity_prices",
        "site-electricity_carbon_intensities",
        "site-high_temperature_load_mwh",
        "site-low_temperature_load_mwh",
        "site-low_temperature_generation_mwh",
        "site-gas_prices",
        "site-electric_load_mwh",
        "spill-electric_generation_mwh",
        "spill-electric_load_mwh",
        "spill-high_temperature_generation_mwh",
        "spill-low_temperature_generation_mwh",
        "spill-high_temperature_load_mwh",
        "spill-low_temperature_load_mwh",
        "spill-gas_consumption_mwh",
        "evs-charger-0-electric_charge_mwh",
        "evs-charger-0-electric_charge_binary",
        "evs-charger-0-electric_discharge_mwh",
        "evs-charger-0-electric_discharge_binary",
        "evs-charger-0-electric_loss_mwh",
        "evs-charger-1-electric_charge_mwh",
        "evs-charger-1-electric_charge_binary",
        "evs-charger-1-electric_discharge_mwh",
        "evs-charger-1-electric_discharge_binary",
        "evs-charger-1-electric_loss_mwh",
        "evs-charge-event-0-electric_charge_mwh",
        "evs-charge-event-0-electric_discharge_mwh",
        "evs-charge-event-0-electric_loss_mwh",
        "evs-charge-event-1-electric_charge_mwh",
        "evs-charge-event-1-electric_discharge_mwh",
        "evs-charge-event-1-electric_loss_mwh",
        "evs-charge-event-2-electric_charge_mwh",
        "evs-charge-event-2-electric_discharge_mwh",
        "evs-charge-event-2-electric_loss_mwh",
        "evs-charge-event-3-electric_charge_mwh",
        "evs-charge-event-3-electric_discharge_mwh",
        "evs-charge-event-3-electric_loss_mwh",
        "evs-charge-event-0-initial_soc_mwh",
        "evs-charge-event-1-initial_soc_mwh",
        "evs-charge-event-2-initial_soc_mwh",
        "evs-charge-event-3-initial_soc_mwh",
        "evs-charge-event-0-final_soc_mwh",
        "evs-charge-event-1-final_soc_mwh",
        "evs-charge-event-2-final_soc_mwh",
        "evs-charge-event-3-final_soc_mwh",
        "evs-charger-spill-evs-electric_charge_mwh",
        "evs-charger-spill-evs-electric_charge_binary",
        "evs-charger-spill-evs-electric_discharge_mwh",
        "evs-charger-spill-evs-electric_discharge_binary",
        "evs-charger-spill-evs-electric_loss_mwh",
        "total-electric_generation_mwh",
        "total-electric_load_mwh",
        "total-high_temperature_generation_mwh",
        "total-low_temperature_generation_mwh",
        "total-high_temperature_load_mwh",
        "total-low_temperature_load_mwh",
        "total-gas_consumption_mwh",
        "total-electric_charge_mwh",
        "total-electric_discharge_mwh",
        "total-spills_mwh",
        "total-electric_loss_mwh",
        "site-electricity_balance_mwh",
    ]
)

You can check the correctness of the electric vehicle model here.