offdataai
Energy & Utilities · data model template

EV Charging Network & Session Analytics data model

Kimball warehouse for an EV charging network: a session-grain CDR fact carrying duration, energy delivered, average / peak power, revenue and idle-fee measures with role-playing start/end date keys and roaming flags, plus a periodic-snapshot hourly utilisation fact per station × connector with uptime / in-use / fault minutes and utilisation %. SCD2 station preserves as-was power and ownership; tariff dimension carries OCPI price components; eMSP dimension supports OCPI roaming reconciliation.

Electric-vehicle charging network analytics for a CPO (charge point operator) running OCPP-managed stations and exchanging Sessions, CDRs, Locations and Tariffs over OCPI with eMSP roaming partners. Models charging sessions at OCPI CDR grain plus an hourly station × connector utilisation snapshot, over conformed station (SCD2), connector, driver, tariff, eMSP and session-status dimensions for utilisation, throughput, revenue and roaming-reconciliation 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 & UtilitiesGDPR
10
tables
104
columns
12
relationships
2
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

sessionsstation_utilizationconformed_dimensions

Design decisions

  • Session-grain CDR fact

    OCPI's Sessions and CDRs modules define the Charge Detail Record as the atomic billable artefact of a charging session; declaring the fact at one-row-per-session preserves duration, energy, power and cost measures and supports drill-anywhere session analytics.

  • Periodic-snapshot hourly utilisation fact

    Operational KPIs like uptime, availability, in-use vs idle vs fault minutes and peak concurrency are naturally additive over fixed time buckets; a station × connector × hour periodic snapshot avoids re-scanning the session fact for every utilisation question.

  • Dedicated eMSP dimension for OCPI roaming reconciliation

    OCPI sessions can be billed via a partner eMSP under roaming; carrying the eMSP party as a conformed dimension lets finance reconcile internal vs roaming CDRs by counterparty and country without re-deriving the OCPI party_id at query time.

  • SCD2 on station for as-was power and ownership

    Station max-power upgrades, owner-segment changes and operator transfers all happen mid-life; type-2 history on dim_station preserves the as-was attributes that drove a session's utilisation and revenue at the moment it was charged.

  • Tariff dimension over an embedded price

    OCPI Tariffs carry time-of-use, parking-time and per-kWh / per-minute components with validity windows; modelling tariffs as a dimension lets the same session fact be re-priced or audited against historical tariff versions without restating the CDR.

Tables in the EV Charging Network & Session 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 (2)

fct_charging_session

Grain: one row per charging session (OCPI Sessions / CDRs module, transaction grain)

Session-grain CDR fact — one row per OCPI session.

ColumnTypeKeys
charging_session_keybigintPK
start_date_keybigint
end_date_keybigint
station_keybigint
connector_keybigint
driver_keybigint
tariff_keybigint
emsp_keybigint
session_status_keybigint
session_idvarchar
authorization_idvarchar
duration_minutesdecimal
energy_delivered_kwhdecimal
average_power_kwdecimal
peak_power_kwdecimal
gross_revenuedecimal
idle_fee_amountdecimal
kwh_costdecimal
session_countinteger
currencyvarchar
is_roamingboolean
is_completedboolean
is_dc_fastboolean
has_errorboolean

fct_station_utilization_hourly

Grain: one row per station × connector × hour (periodic snapshot)

Hourly periodic-snapshot utilisation fact per station × connector.

ColumnTypeKeys
station_utilization_hourly_keybigintPK
hour_keybigint
date_keybigint
station_keybigint
connector_keybigint
uptime_minutesdecimal
in_use_minutesdecimal
idle_minutesdecimal
fault_minutesdecimal
session_startsinteger
session_completionsinteger
total_energy_kwhdecimal
max_concurrent_sessionsinteger
utilization_pctdecimal
availability_pctdecimal

Dimension tables (8)

dim_date

Grain: one row per calendar day

ColumnTypeKeys
date_keybigintPK
full_datedateBK
day_of_monthsmallint
month_numbersmallint
month_namevarchar
quartersmallint
yearsmallint
is_weekendboolean
is_holidayboolean

dim_hour

Grain: one row per calendar hour

ColumnTypeKeys
hour_keybigintPK
hour_datetimetimestampBK
hour_of_daysmallint
day_partvarchar
is_peak_hourboolean

dim_station

Grain: one row per charging station per SCD2 version (OCPI Locations module)

SCD type 2

ColumnTypeKeys
station_keybigintPK
station_idvarcharBK
station_namevarchar
operator_cpovarchar
countryvarchar
cityvarchar
latitudedecimal
longitudedecimal
station_typevarchar
total_connectorssmallint
max_power_kwdecimal
owner_segmentvarchar
is_24_7boolean

dim_connector

Grain: one row per physical connector on an EVSE (OCPI Locations.evses.connectors)

ColumnTypeKeys
connector_keybigintPK
connector_idvarcharBK
evse_uidvarchar
connector_standardvarchar
power_typevarchar
max_voltage_vinteger
max_amperage_ainteger
max_power_kwdecimal
is_activeboolean

dim_driver

Grain: one row per driver / account holder using the network

ColumnTypeKeys
driver_keybigintPK
driver_idvarcharBK
driver_namevarcharPII
account_typevarchar
home_countryvarchar
registration_datedate
license_plate_maskedvarcharPII
account_statusvarchar
is_activeboolean

dim_tariff

Grain: one row per tariff per validity window (OCPI Tariffs module)

ColumnTypeKeys
tariff_keybigintPK
tariff_idvarcharBK
tariff_namevarchar
tariff_typevarchar
currencyvarchar
price_per_kwhdecimal
price_per_minutedecimal
idle_fee_per_minutedecimal
valid_fromtimestamp
valid_totimestamp

dim_emsp

Grain: one row per eMSP (e-mobility service provider) — OCPI roaming counterparty

ColumnTypeKeys
emsp_keybigintPK
emsp_idvarcharBK
emsp_namevarchar
countryvarchar
partner_typevarchar
is_activeboolean

dim_session_status

Grain: one row per OCPI session status code

ColumnTypeKeys
session_status_keybigintPK
session_statusvarcharBK
descriptionvarchar
is_billableboolean

Relationships

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

  • fct_charging_session.start_date_key → dim_date (many-to-one)
  • fct_charging_session.end_date_key → dim_date (many-to-one)
  • fct_charging_session.station_key → dim_station (many-to-one)
  • fct_charging_session.connector_key → dim_connector (many-to-one)
  • fct_charging_session.driver_key → dim_driver (many-to-one)
  • fct_charging_session.tariff_key → dim_tariff (many-to-one)
  • fct_charging_session.emsp_key → dim_emsp (many-to-one)
  • fct_charging_session.session_status_key → dim_session_status (many-to-one)
  • fct_station_utilization_hourly.hour_key → dim_hour (many-to-one)
  • fct_station_utilization_hourly.date_key → dim_date (many-to-one)
  • fct_station_utilization_hourly.station_key → dim_station (many-to-one)
  • fct_station_utilization_hourly.connector_key → dim_connector (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