{ "cells": [ { "cell_type": "markdown", "id": "542f0b2d-0afa-4816-977c-17e9862ff957", "metadata": {}, "source": [ "# PV+Storage Example with Subhourly Inputs" ] }, { "cell_type": "code", "execution_count": 1, "id": "eacbe96a-a39e-444d-92ab-0bf7a5ddfde1", "metadata": { "tags": [] }, "outputs": [], "source": [ "import time\n", "import os\n", "from generation_models import (BatteryParams, PVSystemDesign, PVGenerationModel, DCExternalGenerationModel,\n", " PVStorageModel, MultiStorageInputs, SingleAxisTracking, TableCapDegradationModel,\n", " DARTPrices, StorageCoupling, TermUnits, SolarResource, SolarResourceTimeSeries,\n", " DCProductionProfile)\n", "from tyba_client.client import Client\n", "import numpy as np\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 2, "id": "e90a5e2f-15af-4ef5-a34c-fcf3bb94d4cb", "metadata": { "tags": [] }, "outputs": [], "source": [ "PAT = os.environ[\"TYBA_PAT\"]\n", "client = Client(PAT, host=os.getenv(\"HOST\", \"https://dev.tybaenergy.com\"))" ] }, { "cell_type": "markdown", "id": "816cfd76-7fae-462b-a783-7bf7e8813b98", "metadata": { "tags": [] }, "source": [ "## Example 1: Subhourly irradiance and prices" ] }, { "cell_type": "markdown", "id": "69624ab0-7e13-4aa6-b2ea-025a787d6672", "metadata": {}, "source": [ "### Build model" ] }, { "cell_type": "code", "execution_count": 19, "id": "710a3263-e012-4e56-acba-0fa3d30eb3c9", "metadata": { "tags": [] }, "outputs": [], "source": [ "solar_resource = SolarResource(\n", " typical=False,\n", " latitude=40.0,\n", " longitude=-80.0,\n", " time_zone_offset=-7.0,\n", " elevation=354,\n", " monthly_albedo=12 * [0.6],\n", " data=SolarResourceTimeSeries(\n", " **pd.read_csv(\"tgy-30min-06-01-to-06-07.csv\").to_dict(orient=\"list\")\n", " )\n", ")\n", "\n", "pv = PVGenerationModel(\n", " project_term=168,\n", " project_term_units=TermUnits.hours,\n", " time_interval_mins=30,\n", " solar_resource=solar_resource,\n", " inverter=\"Delta Electronics: M80U_XXX [480V]\",\n", " pv_module=\"Boviet Solar Technology Co._ Ltd. BVM6612M-315\",\n", " system_design=PVSystemDesign(\n", " dc_capacity=2000.0,\n", " ac_capacity=1500.0,\n", " poi_limit=15000.0,\n", " gcr=0.38,\n", " tracking=SingleAxisTracking(rotation_limit=45.0,\n", " backtrack=True)\n", " ),\n", " array_degradation_mode=None\n", ")\n", "\n", "battery = BatteryParams(\n", " power_capacity=2000.0,\n", " energy_capacity=4000.0,\n", " charge_efficiency=0.93,\n", " discharge_efficiency=0.93,\n", " capacity_degradation_model=TableCapDegradationModel(annual_capacity_derates=[1.0, 0.]),\n", " term=1\n", ")\n", "\n", "storage_inputs = MultiStorageInputs(batteries=[battery])\n", "\n", "prices = DARTPrices(\n", " rtm=np.random.random(336).tolist(),\n", " dam=np.random.random(168).tolist()\n", ")\n", "\n", "import_limit = (-np.random.random(336) * 2000).tolist()\n", "\n", "model = PVStorageModel(\n", " energy_prices=prices,\n", " time_interval_mins=30,\n", " import_limit=import_limit,\n", " storage_inputs=storage_inputs,\n", " storage_coupling=StorageCoupling.dc,\n", " pv_inputs=pv,\n", ")" ] }, { "cell_type": "markdown", "id": "bb7503df-7bb3-4315-b614-58f01ed64e6a", "metadata": { "tags": [] }, "source": [ "### Run model" ] }, { "cell_type": "code", "execution_count": 20, "id": "4af04b8b-dd56-48cd-920b-07e2298d0dc7", "metadata": { "tags": [] }, "outputs": [], "source": [ "res = client.schedule(model)" ] }, { "cell_type": "code", "execution_count": 21, "id": "9b7d5af8-1832-42fe-ace7-eeb490b1770b", "metadata": { "tags": [] }, "outputs": [], "source": [ "id_ = res.json()[\"id\"]" ] }, { "cell_type": "code", "execution_count": 22, "id": "f5285c4c-e6e0-4f81-9517-d6b4f5545d3c", "metadata": { "tags": [] }, "outputs": [], "source": [ "res = client.wait_on_result_v1(id_)" ] }, { "cell_type": "code", "execution_count": 24, "id": "a74d6862-a178-4a40-9886-a433c2963e02", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "197144.83167240454" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "res[\"hourly\"][\"poi\"][\"power_kW\"].sum()" ] }, { "cell_type": "markdown", "id": "288cee36-43b7-4c79-97ed-f410d07e1ced", "metadata": { "tags": [] }, "source": [ "## Example 2: Subhourly external generation and prices" ] }, { "cell_type": "markdown", "id": "b98d1bc2-21ef-48fb-bbbd-b2a152f79322", "metadata": {}, "source": [ "### Build model" ] }, { "cell_type": "code", "execution_count": 25, "id": "dc2d88a8-f79a-451d-807c-549b8b4c1ca1", "metadata": { "tags": [] }, "outputs": [], "source": [ "pv = DCExternalGenerationModel(\n", " project_term=24,\n", " project_term_units=TermUnits.hours,\n", " time_interval_mins=15,\n", " system_design=model.pv_inputs.system_design,\n", " inverter=model.pv_inputs.inverter,\n", " production_override=DCProductionProfile(\n", " **(pd.read_csv(\"dc-external-generation-15min-06-01.csv\").\n", " rename(columns={\"array_dc_power\": \"power\", \"array_dc_voltage\": \"voltage\"}).\n", " to_dict(orient=\"list\"))\n", " )\n", ")\n", "\n", "prices = DARTPrices(\n", " rtm=np.random.random(96).tolist(),\n", " dam=np.random.random(24).tolist()\n", ")\n", "\n", "import_limit = (-np.random.random(96) * 2000).tolist()\n", "\n", "model = PVStorageModel(\n", " energy_prices=prices,\n", " time_interval_mins=15,\n", " import_limit=import_limit,\n", " storage_inputs=storage_inputs,\n", " storage_coupling=StorageCoupling.dc,\n", " pv_inputs=pv,\n", ")" ] }, { "cell_type": "markdown", "id": "c283e678-39ba-4c81-94b2-91fed031de81", "metadata": { "tags": [] }, "source": [ "### Run model" ] }, { "cell_type": "code", "execution_count": 26, "id": "61580bdc-fdbf-4332-9ea2-6d2855794284", "metadata": { "tags": [] }, "outputs": [], "source": [ "res = client.schedule(model)" ] }, { "cell_type": "code", "execution_count": 27, "id": "507d31e2-3ee0-481c-8420-0a7d2e297167", "metadata": { "tags": [] }, "outputs": [], "source": [ "id_ = res.json()[\"id\"]" ] }, { "cell_type": "code", "execution_count": 28, "id": "6361166b-b665-47fe-9ae9-ddae52433c4b", "metadata": { "tags": [] }, "outputs": [], "source": [ "res = client.wait_on_result_v1(id_)" ] }, { "cell_type": "code", "execution_count": 30, "id": "17966f93-d451-4fdd-817e-6fd5f5f4196c", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "88357.40427243654" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "res[\"hourly\"][\"poi\"][\"power_kW\"].sum()" ] }, { "cell_type": "markdown", "id": "9c3a0329-2413-49c8-b001-b51fdd20c64b", "metadata": { "tags": [] }, "source": [ "## Example 3: Hourly irradiance and subhourly prices" ] }, { "cell_type": "markdown", "id": "acd8d19b-ac4d-479f-b389-fb42aa4ce3bd", "metadata": {}, "source": [ "### Build model" ] }, { "cell_type": "code", "execution_count": 31, "id": "9552b2ca-9e19-4bfa-a699-40613a21795b", "metadata": { "tags": [] }, "outputs": [], "source": [ "irradiance_30min = pd.read_csv(\"tgy-30min-06-01-to-06-07.csv\")\n", "irradiance_30min.index = pd.date_range(start=\"1990-06-01T00:00:00\", periods=336, freq=\"30T\")\n", "irradiance_hourly = irradiance_30min.resample(\"H\").mean()\n", "\n", "solar_resource = SolarResource(\n", " typical=False,\n", " latitude=40.0,\n", " longitude=-80.0,\n", " time_zone_offset=-7.0,\n", " elevation=354,\n", " monthly_albedo=12 * [0.6],\n", " data=SolarResourceTimeSeries(\n", " **irradiance_hourly.to_dict(orient=\"list\")\n", " )\n", ")\n", "\n", "pv = PVGenerationModel(\n", " project_term=168,\n", " project_term_units=TermUnits.hours,\n", " time_interval_mins=60, # this is where we indicate that it is an hourly solar resource\n", " solar_resource=solar_resource,\n", " inverter=\"Delta Electronics: M80U_XXX [480V]\",\n", " pv_module=\"Boviet Solar Technology Co._ Ltd. BVM6612M-315\",\n", " system_design=PVSystemDesign(\n", " dc_capacity=2000.0,\n", " ac_capacity=1500.0,\n", " poi_limit=15000.0,\n", " gcr=0.38,\n", " tracking=SingleAxisTracking(rotation_limit=45.0,\n", " backtrack=True)\n", " ),\n", " array_degradation_mode=None\n", ")\n", "\n", "prices = DARTPrices(\n", " rtm=np.random.random(672).tolist(),\n", " dam=np.random.random(168).tolist()\n", ")\n", "\n", "import_limit = (-np.random.random(672) * 2000).tolist()\n", "\n", "model = PVStorageModel(\n", " energy_prices=prices,\n", " time_interval_mins=15, # this is where we indicate that our prices are subhourly\n", " import_limit=import_limit,\n", " storage_inputs=storage_inputs,\n", " storage_coupling=StorageCoupling.dc,\n", " pv_inputs=pv,\n", ")" ] }, { "cell_type": "markdown", "id": "7a9213da-8cac-48f5-ab30-c4ac25d6ba01", "metadata": {}, "source": [ "### Run model" ] }, { "cell_type": "code", "execution_count": 32, "id": "bb9b1a17-f37d-482b-8375-1fc3d46143ae", "metadata": { "tags": [] }, "outputs": [], "source": [ "res = client.schedule(model)" ] }, { "cell_type": "code", "execution_count": 33, "id": "fa55d6c1-70c8-46b4-8374-35b1cf585f3a", "metadata": {}, "outputs": [], "source": [ "_id = res.json()[\"id\"]" ] }, { "cell_type": "code", "execution_count": 36, "id": "afdc8ab8-9f65-4883-8c8d-d7c60bd225e4", "metadata": {}, "outputs": [], "source": [ "res = client.wait_on_result_v1(id_)" ] }, { "cell_type": "code", "execution_count": 37, "id": "6f6d546d-ca7b-4896-b8d6-4924bb2714c4", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "88357.40427243654" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "res[\"hourly\"][\"poi\"][\"power_kW\"].sum()" ] }, { "cell_type": "code", "execution_count": null, "id": "d934ff56-63f9-4031-b612-a542c3b278a1", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.12" } }, "nbformat": 4, "nbformat_minor": 5 }