Most building energy-savings stories are quoted as a percentage with no methodology. Here is the worked example, with the schedule change, the actual occupancy data, the math, and an honest list of what went wrong in the first week.
01 · TL;DRTL;DR
28 days · April 2026 · RMIT Building 80 · Library Floor 4
- Energy avoided: 9,420 kWh
- AUD saved: $2,830
- tCO₂e avoided: 6.4 t
- Comfort complaints: 0
One configuration change. No new hardware. No firmware update. No code change on the BMS beyond the schedule itself. The library on Floor 4 of Building 80 went from being cooled for "the worst case Friday afternoon in March" to being cooled for "actually how the room is used right now".
The numbers also *under-*estimate annualised savings. April is a temperate month in Melbourne, with low cooling load. The same schedule applied across a January Melbourne week, or a July Brisbane week, would compound considerably.
02 · WHY THIS POST EXISTSWhy this post exists
Every smart-building vendor we know quotes "8–18% HVAC savings" in their deck. We do too. But the number is meaningless without the methodology what's the baseline, what changed, how is the saving measured, and what counts as "savings" versus "a freezing user typing a complaint into the BMS portal"?
So we wrote the worked example. If you're a head of property, a sustainability manager, or an engineer trying to make a case for occupancy-aware scheduling, this is the level of detail you can pull into an internal memo.
03 · THE SETUPThe setup
- Building: RMIT University · Building 80 · Swanston Street, Melbourne
- Floor: Level 4 · the main library reading room and adjacent quiet-study space
- Floor area: ~2,100 m² · capacity ~140 seats
- HVAC: 4× rooftop AHUs feeding VAV boxes per zone
- BMS: Tridium Niagara · existing
- Sensors: 6× Occivar edge sensors · ceiling-mount · PoE
- Period: 1–28 April 2026 (4 weeks)
The sensors had been live for the prior three weeks, generating an occupancy baseline. We knew, before the schedule change, how the room actually filled and emptied by hour and by day.
04 · WHAT THE FLOOR ACTUALLY SHOWEDWhat the floor actually showed
Two things jumped out, and they became the schedule change:
- Pre-cool was running for two hours against an empty room. 5am to 7am the floor had under 3% occupancy on every day of the week.
- The 7pm–9pm tail was hollow. Average occupancy from 7pm dropped under 15% in 30 minutes and stayed there. The HVAC kept running for two more hours anyway.
Weekends were worse. Saturday morning had effectively zero occupancy until 11am, and the pre-cool at 6am and the full schedule at 8am were running over a completely empty library.
05 · THE CHANGEThe change
We wrote three rules into the Niagara schedule. Not algorithms. Not ML. Rules a human can read in 30 seconds:
# /schedules/library-floor-4.yaml - 12 April 2026
version: 2
zone: "building-80.l4.library"
rules:
# 1 · Skip pre-cool on Sat/Sun. Trigger only if occupancy > 15% at 8am.
- id: "weekend-occupancy-gate"
when: "day in [SAT, SUN]"
condition: "occupancy(:08:00) > 0.15"
then: "start_cooling(:08:30)"
otherwise: "setback_continue"
# 2 · Setback 1h earlier on weeknights if occupancy < 20% at 19:30.
- id: "weeknight-early-setback"
when: "day in [MON..FRI] and time = :19:30"
condition: "occupancy < 0.20"
then: "setback(setpoint + 2.0)"
# 3 · East wing only opens when reading room > 30% capacity.
- id: "east-wing-occupancy-trigger"
when: "always"
condition: "occupancy(reading_room) > 0.30"
then: "engage(east_wing_ahu)"
otherwise: "setback(east_wing_ahu)"
guardrails:
comfort_threshold: "setpoint ± 2.0°C"
co2_max: 900
override: "facilities-team:duty"
Rule 3 did the most work. The "east wing" overflow space was running its dedicated AHU on the same schedule as the main reading room but rarely actually filling. Gating it on occupancy of the main room cut about 40% of its annual run-time without ever leaving anyone in a warm room.
06 · THE RESULTThe result
We ran the new schedule for 28 days, then pulled the BMS energy meter and compared against the same 28-day window in 2025, normalised to outdoor temperature using degree-day correction.
Reconciled, DDH-normalised: 9,420 kWh avoided · −14% vs baseline · $2,830 AUD saved · 6.4 tCO₂e avoided.
Of the 14% reduction, almost half came from the two weekend days. The Mon–Fri savings were more modest 8–11% but they were every weekday, every week.
"We've had the schedule in place for three years. No one ever questioned it. Of course no one ever measured the room properly, either."
07 · WHAT WE GOT WRONGWhat we got wrong
This is the section every other vendor leaves out. The first week had three problems:
- Saturday over-correction. The weekend occupancy gate didn't trigger pre-cool because 8am occupancy was below 15%. By 11am the room was 2.4°C above setpoint. We adjusted the trigger to use predicted occupancy from the prior four Saturdays.
- Sensor #3 calibration drift. A sensor near the entry over-counted by ~12% for five days due to swing-door geometry. A 30-minute manual ground-truth re-calibration dropped drift under 2%.
- Lecture-week underestimate. The model didn't account for the spike when a 200-seat lecture finishes. We added a "lecture-end" prior to soften the bursty effect.
None were dealbreakers. All were fixable in software in under a day.
08 · METHODOLOGYMethodology
- Baseline: Floor-4 sub-meter, 1–28 April 2025, Niagara historian, 5-min resolution.
- Normalisation: Degree-day-hours using BoM Melbourne CBD station. April 2026 was 6% milder; the 2025 baseline was rescaled by 1.062. Without normalisation, raw savings were ~17%.
- AUD rate: $0.30 / kWh blended retail.
- Emissions factor: 0.68 tCO₂e / MWh AEMO Victorian grid, March 2026 quarterly.
- Occupancy source: 6× Occivar edge sensors, on-device inference, anonymous count vectors only.
This worked because the sensor data was anonymous from day one. The library and the student union signed off in the same meeting there was no surveillance footprint to negotiate.
