Building energy and utility dashboards in Power BI from utility data
A practical guide for Canadian energy and facility teams: how to model meter and bill data, avoid the garbage-in problem, choose refresh options, and build Power BI measures that hold up.
If you run energy or facilities for a Canadian portfolio, someone above you probably already asked for a Power BI dashboard. It is the reporting tool most of your finance and operations colleagues already have, so it becomes the default home for energy numbers too. The hard part is almost never the visuals. It is the data feeding them: bills that arrive as PDFs, meters in different units, months that never showed up, and estimated reads mixed in with real ones. This guide walks through how to build a utility data model in Power BI that people trust, and where the effort actually pays off.
Why Power BI became a common home for energy reporting
Three practical reasons keep energy reporting inside Power BI. First, the license is already paid for. Many organizations bought Microsoft 365 and Power BI for finance and operations, so putting energy data there means no new tool to procure or train on. Second, it sits next to the rest of the business: you can show energy cost beside budget, occupancy, or production in the same report. Third, it refreshes on a schedule, so a monthly board deck can stop being a manual copy and paste exercise.
The scale of what you are reporting on is not small. In 2019 there were 555,951 commercial and institutional buildings across the Canadian provinces, occupying 709.0 million square metres and consuming 948.2 million gigajoules of energy, at an average intensity of 1.31 gigajoules per square metre. A portfolio of even a few dozen sites generates a steady stream of meter reads and invoices that no one wants to reconcile by hand every month.
What a good utility data model looks like
Power BI works best on a star schema: one central fact table surrounded by dimension tables. For energy reporting, the fact table is your normalized record of meter reads and bill line items. Keep it long and narrow, one row per meter per period per commodity, rather than a wide spreadsheet with a column per month.
The fact table
A clean energy fact table usually holds these fields per row: a date (or billing period start and end), a meter key, a commodity (electricity, natural gas, water, steam), usage in a single standard unit, cost, and a flag for whether the read was actual or estimated. Everything else belongs in a dimension you join to, not in the fact table itself.
| Field | Example | Why it matters |
|---|---|---|
| Date / period | 2026-06-01 to 2026-06-30 | Anchors every time based measure and lets you align billing periods to calendar months |
| Meter key | MTR-0142 | Joins to the meter and site dimensions; keeps the fact table thin |
| Commodity | Electricity | Lets one model report multiple fuels without separate reports |
| Usage | 48,200 kWh | Stored in one standard unit per commodity so totals are valid |
| Cost | 6,910.00 | Enables cost per square foot, cost per unit, and budget comparison |
| Read type | Actual / Estimated | Flags data you should not trust for tight variance analysis |
The dimensions around it
- Date dimension: a proper calendar table so you can do month over month, fiscal year, and same period last year comparisons.
- Site / building: floor area, building type, city, and climate zone. Floor area is what turns raw usage into intensity.
- Meter: commodity, unit, tariff class, and which site and account it belongs to.
- Weather: heating and cooling degree days by station and period, so you can normalize for a cold winter or a hot summer.
- Account / tariff: the supplier account and rate, useful when cost per unit swings and you need to explain why.
Convert every commodity to one canonical unit before the data reaches Power BI, and store the original unit as a separate field for reference. A measure that sums a column holding both kWh and GJ produces a number that looks fine and means nothing. Standardize on the way in, not with a tangle of conditional logic in DAX.
The garbage in problem
A Power BI energy dashboard is only ever as good as the utility data behind it. The visuals will render whatever you give them, which is exactly the danger: a clean looking chart built on dirty data is more misleading than no chart at all, because people act on it. These are the recurring problems energy teams hit.
- Mixed units: electricity in kWh, gas in cubic metres or GJ, water in cubic metres or gallons. Summed together they are meaningless.
- Missing months: a bill never arrived, or a meter was not read, and the trend line silently dips. Your year over year math is now wrong.
- Estimated reads: the utility estimated usage, then trued it up later. If you do not flag estimates, a correction shows up as a fake spike or a fake saving.
- PDF only bills: the numbers you need are locked in a scanned invoice. Manual re keying is slow and it introduces its own typos.
- Overlapping billing periods: bills rarely line up with calendar months, so a naive monthly sum double counts or drops days.
- Account and meter churn: a site changes suppliers or adds a meter, and history breaks unless the model tracks the change.
None of these are Power BI problems. They are data supply problems. You can paper over some of them with DAX, but the durable fix is to standardize, validate, and gap check the utility data before it ever reaches the model. That is upstream work, and it is where most of the value of a trustworthy dashboard is actually created.
Refresh options: getting data in and keeping it current
Power BI gives you two main storage modes, and the choice shapes how fresh your dashboard is and how much data it can hold.
Import vs DirectQuery
In Import mode, Power BI copies the data into the model, so reports are fast but you must refresh to pick up changes. In DirectQuery, the model holds only metadata and queries the source live, so users always see current data, but Microsoft notes DirectQuery carries a one million row limit on returned results and a query timeout, and it puts load on the source database. For most energy reporting, where data updates monthly or daily rather than by the second, Import mode with a scheduled refresh is the simpler and faster choice.
How often it can refresh
Refresh frequency depends on your license. Microsoft documents that Power BI Pro allows up to 8 scheduled refreshes per day, while Premium per user and Premium or Fabric capacity allow up to 48 scheduled refreshes per day. Model size matters too: a Pro semantic model is capped at 1 GB, which is plenty for years of monthly bill data but can be tight if you pull in high resolution interval reads for a large portfolio.
What to connect to
- CSV or Excel: the fastest way to start, and fine for a pilot, but manual file drops become the weak link once you have more than a handful of sites.
- An API or scheduled feed: a service delivers standardized rows on a cadence, so the refresh has something clean to pull without anyone touching a file.
- A data warehouse or lakehouse: the most durable pattern for a real portfolio. Land cleaned utility data in a database, point Power BI at it, and let scheduled refresh do the rest. This also lets other tools share the same numbers.
Example measures worth building
Once the model is clean, a small set of measures covers most of what energy and facility teams report on. Build these as reusable DAX measures, not as one off columns.
| Measure | What it answers | What it needs |
|---|---|---|
| Cost per square foot | Which sites are expensive to operate | Summed cost joined to floor area from the site dimension |
| Energy use intensity (EUI) | How efficient a building is, size aside | Total energy in one unit divided by gross floor area |
| Weather normalized trend | Whether usage changed after removing weather | Usage against heating and cooling degree days |
| Demand peaks | When and how high demand spiked | Interval or demand data, max by period and site |
| Cost per unit | Whether a rate or supplier change hit the bill | Cost divided by usage, tracked over time |
Energy use intensity is worth calling out because it is the standard way to compare buildings of different sizes. The US EPA, which runs ENERGY STAR Portfolio Manager, defines energy use intensity as a building's energy use divided by its floor area, expressed as energy per square foot per year. In Power BI, that is total usage from your fact table divided by floor area from the site dimension. It only produces an honest number when usage is in one unit and floor area is complete and current, which loops right back to the data quality point.
A drop in gas use over a mild winter is not necessarily a saving. To claim one, normalize against heating and cooling degree days for the site's location and period. That means degree day data has to live in the model alongside your reads, aligned to the same billing periods. Without it, you are reporting weather, not performance.
How MartinAI helps
MartinAI is a Canadian utility data platform that handles the upstream work a Power BI energy model depends on. It collects utility data from utility account connections, Green Button feeds, and scanned or PDF bills, then cleans and standardizes it: one unit per commodity, billing periods aligned, estimated reads flagged, and missing months surfaced instead of silently skipped. The result is a consistent fact table of meter reads and bill line items, with the site, meter, and account context already attached.
Because that clean data is delivered on a schedule, whether to a CSV feed, an API, or a warehouse table, your Power BI scheduled refresh always has trustworthy rows to pull. Your team stops re keying invoices and reconciling units, and spends its time on the measures and the decisions instead. The dashboard becomes something people act on because the numbers under it are sound.
Frequently asked questions
Import or DirectQuery for a utility data dashboard?
For most energy reporting, Import mode with a scheduled refresh is the better fit, because bill and meter data updates monthly or daily rather than by the second, and Import keeps reports fast. DirectQuery keeps data live but carries a one million row limit on returned results and a query timeout, and it loads the source database, so reserve it for cases that genuinely need real time source data.
How often can Power BI refresh my energy data?
Microsoft documents up to 8 scheduled refreshes per day on Power BI Pro and up to 48 per day on Premium per user or Premium and Fabric capacity. Monthly bill data rarely needs more than a daily refresh, so Pro limits are usually not the constraint. Model size can be: a Pro semantic model is capped at 1 GB, which matters more if you load high resolution interval data.
What is the minimum data model I need for an energy dashboard?
A star schema with one fact table of meter reads and bill line items (date, meter, commodity, usage in a standard unit, cost, and a read type flag), plus dimensions for date, site with floor area, meter, and weather. That is enough to build cost per square foot, energy use intensity, and weather normalized trends.
Why does my Power BI energy dashboard show wrong numbers?
Almost always a data supply problem rather than a Power BI problem: mixed units summed together, missing months that break year over year math, estimated reads that read as spikes, or overlapping billing periods that double count. Standardize units, flag estimates, and gap check the utility data before it reaches the model.
How do I calculate energy use intensity in Power BI?
Energy use intensity is total energy use divided by gross floor area, expressed per square foot per year, as defined by the US EPA ENERGY STAR program. In Power BI, that is a measure summing usage from your fact table (in one consistent unit) divided by floor area from the site dimension. It is only accurate when units are standardized and floor area is complete and current.
- 1Statistics Canada: Commercial and institutional buildings energy use, 2019
- 2Microsoft Learn: Configure scheduled refresh in Power BI
- 3Microsoft Learn: DirectQuery in Power BI (limitations)
- 4Microsoft Learn: Large semantic models in Power BI Premium (size limits)
- 5Microsoft Learn: Data refresh in Power BI
- 6US EPA ENERGY STAR: What is energy use intensity (EUI)?
Energy Dashboards That Drive Action, Not Just Charts
The dashboards people act on share a few habits: the right KPIs, audience-specific views, drill-down to the bill, and trustworthy data underneath.
Getting Clean Utility Data Into ESG Platforms and BI Tools
ESG platforms and BI tools are only as good as the utility data behind them. Here is how to deliver structured records with consistent units and periods through APIs and exports, and how to avoid the spreadsheet trap that quietly breaks reporting.
