HVACTrend

A read-only BACnet trend logger, trend viewer and alarm system for building HVAC.

It sits on your building's BACnet network and records the points you choose every two minutes: temperatures, setpoints, fan speeds, valves, dampers, statuses. It keeps that history as long as you like, shows it in a fast trend viewer in your browser, and sends equipment that isn't doing what it's told to your phone. It never writes to a controller.

Free and open source (MIT). Getting started

The trend viewer: two and a half days of discharge air on two air handlers, with the setpoint and the outdoor air. AHU-2 runs about 9 degrees F warm every afternoon while AHU-1 holds its 55 degree setpoint

What it does

Trend logging

Polls the points you pick with ReadPropertyMultiple, falling back to single reads where a controller needs it. Every reading carries its quality, and 5-minute and hourly averages let a year of data chart instantly.

A viewer made for HVAC work

Zoom, pan, jump to a day, compare with the day or week before. Plot a reading against its setpoint, or against the other units. X-Y scatter, weather overlay, occupied-hours shading, notes, saved views, CSV. Works on a phone.

Realtime trends

Read chosen points every 5 seconds while you stroke a valve or watch a discharge temperature settle, with caps on how many run at once to protect the controllers.

Alarms on your phone

A separate watchdog checks every 5 minutes: data that stops, a controller that stops answering, equipment alarms that open, get worse or clear. A morning check-in, and a daily reminder of what's still wrong, through ntfy.

Overrides, seen

It reads (never writes) each commandable point's priority array, so you see when someone at the workstation is holding a setpoint by hand, and since when.

And the rest

A dashboard of every air handler and plant system, point coverage for the alarm rules, a one-button rescan after a programming change, verified weekly backups, and an optional AI summary of what the rules found, with your own API key.

Screens

Every unit on one screen: discharge, mixed and return air, fan speed, outdoor air damper and duct static, with an override badge on AHU-3
Every unit on one screen, with an operator override flagged on AHU-3.
AHU-2's readings grouped by kind, each with a sparkline
One unit's readings, grouped by kind, each with a sparkline.

From the demo: a made-up building with a week of readings.

Safe by design

Read-only BACnet

  • It only sends reads and discovery. Writes are refused in code, whatever the configuration says.
  • Disruptive services (reinitialize, communication control, file writes, create or delete object) are blocked outright.
  • None of this can be switched on from the web pages.

Local by default

  • Out of the box only the computer it runs on can open the pages.
  • Others you let in get the trend viewer and Realtime, and nothing else: no settings, no secrets, no backups.
  • API keys and the notification topic live in a separate file that is never committed or backed up.

Try it in a minute, without a BACnet network

git clone https://github.com/jamesccupps/HVACTrend.git
cd HVACTrend
python -m venv .venv
.venv/bin/pip install -e .          # Windows: .venv\Scripts\pip install -e .
.venv/bin/python scripts/demo.py    # Windows: .venv\Scripts\python scripts\demo.py

Then open http://localhost:8001: a made-up building with a week of readings, one unit that runs warm in the afternoons, and an operator override. Nothing is sent anywhere.

Install it for your building

Windows (the tested platform)

Install Python 3.11+ and download the release. Double-click install.bat: it makes a private Python environment and runs a setup wizard (building name, which network card is on BACnet, who may open the pages). Then find your controllers, map units to controllers, choose points on the Point Selection page, and install the service so it runs from boot.

The step-by-step walkthrough

What you need

A computerOn the building's BACnet/IP network; a small always-on PC is ideal
Python3.11 or newer
ControllersReachable over BACnet/IP; MS/TP behind a BACnet router is fine
DiskAbout 35 MB a day per 1,000 points at the 2-minute interval

In production in one building since July 2026, with more than 450 automated tests and no hardware needed to run them. Other buildings name points differently: if yours aren't recognized, open an issue with a few examples.

More tools from James Cupps