offdataai
Energy & Utilities · data model template

Renewable Energy Generation & PPA Analytics data model

Kimball warehouse for renewables generation, PPA settlement, and curtailment. Three facts: a 15-minute SCADA telemetry fact aligned to the ISO settlement interval, a PPA settlement fact at delivery-period × node grain with REC tracking, and a curtailment-event fact (with two date roles for start/end) carrying compensable loss measures. Conformed SCD2 site dimension preserves as-was installed capacity through repowering; weather-station dimension supports performance-ratio analysis vs irradiance and wind.

Renewable energy generation analytics for solar PV, onshore/offshore wind, battery storage, and hybrid sites. SCADA delivers 15-minute generation telemetry (energy, AC/DC power, capacity factor, availability, performance ratio) correlated to irradiance and wind weather; PPA settlement and REC inventory roll up to contract / counterparty / pricing-node grain; curtailment events are captured with compensable/non-compensable classification across ISOs (CAISO / ERCOT / PJM / MISO / NYISO) for NERC-CIP and GHG-Protocol reporting. It is a Kimball dimensional model: fact tables at a declared grain surrounded by conformed dimensions, ready for BI tools and a semantic layer.

KimballEnergy & UtilitiesNERC-CIPGHG Protocol
14
tables
132
columns
16
relationships
0
PII columns

Opening the template creates a project with the ERD, platform-native DDL, a dbt project and documentation already generated (recommended platform: Snowflake). Edit it in plain English or on the canvas, then ship it to any supported warehouse.

Subject areas

generation_telemetryppa_settlementcurtailmentconformed_dimensions

Design decisions

  • 15-minute telemetry-grain fact aligned to ISO settlement interval

    ISO markets settle on 15-minute (or sub-hourly) intervals; landing SCADA at that grain makes the generation fact directly joinable to PPA settlement and curtailment without re-bucketing, and preserves intra-hour capacity factor and ramp behaviour.

  • PPA settlement fact at delivery-period grain with REC tracking

    Power Purchase Agreements settle per delivery period × node and frequently bundle Renewable Energy Certificates; modelling the settlement at that grain with separate REC quantity / value columns supports contract performance, shortfall damages, and REC-inventory reporting from one fact.

  • Curtailment-event fact for compensable losses

    Curtailment is event-shaped (start, end, reason, ISO) rather than periodic; a dedicated event-grain fact with compensable / non-compensable classification by reason category enables lost-revenue and ISO-recovery reporting that a periodic fact would obscure.

  • SCD2 site to preserve as-was capacity through repowering

    Wind and solar sites are repowered (turbines replaced, modules augmented, BESS added) over their 20-30 year life; type-2 history on installed capacity, commissioning date, and technology type keeps historical capacity factors comparable to the configuration that produced them.

  • Weather-station dimension to correlate generation to irradiance / wind

    Performance ratio and P50/P90 require pairing generation with the resource (irradiance for PV, hub-height wind for turbines); modelling weather stations as a conformed dimension on the telemetry fact supports onsite-vs-satellite comparisons without fact-table bloat.

Tables in the Renewable Energy Generation & PPA Analytics model

Every table with its grain, columns, types and keys. PK marks a primary key, BK a business key and PII a column classified as personal data, which gets a masking strategy by default.

Fact tables (3)

fct_generation_interval

Grain: one row per generation asset per 15-minute interval (SCADA telemetry grain)

SCADA 15-minute telemetry fact aligned to ISO settlement period.

ColumnTypeKeys
generation_interval_keybigintPK
interval_start_keybigint
date_keybigint
site_keybigint
asset_keybigint
weather_station_keybigint
inverter_or_turbine_keybigint
energy_generated_kwhdecimal
ac_power_kwdecimal
dc_power_kwdecimal
capacity_factor_pctdecimal
availability_pctdecimal
performance_ratio_pctdecimal
irradiance_w_per_m2decimal
wind_speed_msdecimal
ambient_temperature_cdecimal
panel_or_blade_temperature_cdecimal
downtime_minutesdecimal

fct_ppa_settlement

Grain: one row per PPA × delivery period × pricing node (energy + REC settlement)

Delivery-period PPA settlement fact with REC tracking.

ColumnTypeKeys
ppa_settlement_keybigintPK
delivery_date_keybigint
ppa_contract_keybigint
counterparty_keybigint
site_keybigint
pricing_node_keybigint
contracted_volume_mwhdecimal
delivered_volume_mwhdecimal
settled_price_per_mwhdecimal
settled_revenuedecimal
shortfall_volume_mwhdecimal
liquidated_damagesdecimal
rec_quantitydecimal
rec_valuedecimal
curtailment_loss_mwhdecimal
currencyvarchar

fct_curtailment_event

Grain: one row per curtailment event at a site

Event-grain curtailment fact for compensable and non-compensable losses.

ColumnTypeKeys
curtailment_event_keybigintPK
event_start_date_keybigint
event_end_date_keybigint
site_keybigint
curtailment_reason_keybigint
iso_market_keybigint
event_idvarchar
duration_minutesdecimal
energy_lost_mwhdecimal
revenue_lostdecimal
is_compensatedsmallint
currencyvarchar
curtailment_typevarchar

Dimension tables (11)

dim_date

Grain: one row per calendar day

ColumnTypeKeys
date_keybigintPK
full_datedateBK
day_of_monthsmallint
month_numbersmallint
month_namevarchar
quartersmallint
yearsmallint
seasonvarchar
is_holidayboolean

dim_interval_15min

Grain: one row per 15-minute settlement interval (aligned to ISO settlement period)

ColumnTypeKeys
interval_keybigintPK
interval_datetimetimestampBK
hour_of_daysmallint
day_partvarchar
settlement_periodsmallint

dim_site

Grain: one row per generation site per SCD2 version (solar farm / wind farm / BESS / hybrid)

SCD type 2

ColumnTypeKeys
site_keybigintPK
site_idvarcharBK
site_namevarchar
technology_typevarchar
installed_capacity_mwdecimal
commissioning_datedate
countryvarchar
regionvarchar
iso_balancing_authorityvarchar
latitudedecimal
longitudedecimal
is_activeboolean

dim_asset

Grain: one row per individual asset (module/inverter/turbine/transformer/battery-module)

ColumnTypeKeys
asset_keybigintPK
asset_idvarcharBK
asset_namevarchar
asset_typevarchar
manufacturervarchar
modelvarchar
nameplate_capacity_kwdecimal
installation_datedate
warranty_end_datedate
is_activeboolean

dim_inverter_or_turbine

Grain: one row per power-conversion unit (string/central inverter, wind turbine, BESS block)

ColumnTypeKeys
inverter_or_turbine_keybigintPK
unit_idvarcharBK
unit_labelvarchar
unit_typevarchar
manufacturervarchar
modelvarchar
capacity_kwdecimal
site_idvarchar
is_activeboolean

dim_weather_station

Grain: one row per weather station providing irradiance / wind / temperature telemetry

ColumnTypeKeys
weather_station_keybigintPK
station_idvarcharBK
station_namevarchar
latitudedecimal
longitudedecimal
sensor_setvarchar
is_onsiteboolean

dim_ppa_contract

Grain: one row per Power Purchase Agreement contract

ColumnTypeKeys
ppa_contract_keybigintPK
ppa_idvarcharBK
contract_namevarchar
contract_typevarchar
term_startdate
term_enddate
contracted_capacity_mwdecimal
contracted_volume_mwhdecimal
price_basisvarchar
includes_recsboolean

dim_counterparty

Grain: one row per PPA counterparty (offtaker)

ColumnTypeKeys
counterparty_keybigintPK
counterparty_idvarcharBK
counterparty_namevarchar
countryvarchar
counterparty_typevarchar
credit_ratingvarchar

dim_pricing_node

Grain: one row per ISO pricing node (LMP node or zone)

ColumnTypeKeys
pricing_node_keybigintPK
node_idvarcharBK
node_namevarchar
isovarchar
node_typevarchar
latitudedecimal
longitudedecimal

dim_iso_market

Grain: one row per ISO market (CAISO / ERCOT / PJM / MISO / NYISO across day-ahead/real-time/capacity)

ColumnTypeKeys
iso_market_keybigintPK
iso_marketvarcharBK
countryvarchar
market_typevarchar
time_zonevarchar

dim_curtailment_reason

Grain: one row per curtailment reason code

ColumnTypeKeys
curtailment_reason_keybigintPK
curtailment_reasonvarcharBK
descriptionvarchar
reason_categoryvarchar
is_compensableboolean

Relationships

Each relationship is a foreign key on the first table referencing the second.

  • fct_generation_interval.interval_start_key → dim_interval_15min (many-to-one)
  • fct_generation_interval.date_key → dim_date (many-to-one)
  • fct_generation_interval.site_key → dim_site (many-to-one)
  • fct_generation_interval.asset_key → dim_asset (many-to-one)
  • fct_generation_interval.weather_station_key → dim_weather_station (many-to-one)
  • fct_generation_interval.inverter_or_turbine_key → dim_inverter_or_turbine (many-to-one)
  • fct_ppa_settlement.delivery_date_key → dim_date (many-to-one)
  • fct_ppa_settlement.ppa_contract_key → dim_ppa_contract (many-to-one)
  • fct_ppa_settlement.counterparty_key → dim_counterparty (many-to-one)
  • fct_ppa_settlement.site_key → dim_site (many-to-one)
  • fct_ppa_settlement.pricing_node_key → dim_pricing_node (many-to-one)
  • fct_curtailment_event.event_start_date_key → dim_date (many-to-one)
  • fct_curtailment_event.event_end_date_key → dim_date (many-to-one)
  • fct_curtailment_event.site_key → dim_site (many-to-one)
  • fct_curtailment_event.curtailment_reason_key → dim_curtailment_reason (many-to-one)
  • fct_curtailment_event.iso_market_key → dim_iso_market (many-to-one)

Related templates

All templates →
Start for $1

From requirements to AI-ready context, in one platform.

Describe your business in a conversation, start from a template or connect your own database. Your first model is ready in minutes.

Get startedBook a demo

Plans from $1/month · cancel any time