Skip to main content

BACnet/IP object server

OmniBus can present itself as a single BACnet/IP device that aggregates the decoded points of every port — plus the gateway's own health — under one Device object. A supervisor (a Niagara JACE, a BMS front-end, or any BACnet client) discovers the appliance with Who-Is, then reads, writes, and subscribes to its points like any other BACnet device. It's the BACnet sibling of the Modbus/TCP server, configured the same way: a shared, device-wide service that ports opt into.

Enable it on the BACnet page, then turn on BACnet output for each port whose points you want exposed.

One BACnet role per UDP port

The object server and a BACnet MS/TP↔IP bridge can't share the BVLC UDP port (47808) — they're mutually exclusive. Run one or the other. OmniBus refuses to start the server with a clear message if an enabled MS/TP bridge already owns the port, rather than failing with a raw address-in-use error.

How points map to objects

Each decoded point becomes an object, with the type chosen by its value type and direction — numerics become Analog objects, booleans become Binary, and the read-only-vs-writable split decides Input (read-only) vs. Value (commandable):

PointBACnet objectAccess
numeric, read-onlyAnalog Input (AI)read-only present-value
numeric, writableAnalog Value (AV)commandable present-value (WriteProperty)
boolean, read-onlyBinary Input (BI)read-only present-value
boolean, writableBinary Value (BV)commandable present-value (WriteProperty)
stringnot exposed

Analog objects carry the point's engineering units (°C, %, kWh, …) when the adapter reports them, so a supervisor renders values with the right unit instead of a bare number. Each object's present-value tracks the latest decoded value.

Discovery and the object list

Unlike Modbus, BACnet is self-describing — you don't configure fixed addresses on the supervisor:

  • On a Who-Is, the server answers with I-Am (unicast to the asker), so a supervisor's discovery finds the device. (Unsolicited broadcast I-Am on startup is a later refinement; a directed Who-Is or reading the device by instance always works.)
  • It serves ReadProperty and ReadPropertyMultiple (batch reads), and exposes each object's property-list, so a BACnet explorer can enumerate the points and read their live values without a point list from you.
  • Object instance numbers are assigned automatically and are stable across restarts (persisted) — each port (and the built-in system group) gets its own contiguous block, so a port's points stay grouped and a supervisor's discovered references don't churn when the box reboots or you rename a port.

Device-status objects

With Publish device status objects on (the default), the gateway's own health is exposed as read-only AI/BI objects named System/<metric> — uptime, CPU temperature, memory, disk, NTP sync, throttling, and port counts — so a supervisor can monitor the appliance itself with no per-port configuration. This is the same canonical metric set the MQTT and Prometheus exporters publish.

Settings

On the BACnet page:

  • Enable BACnet/IP object server — master on/off for the service.
  • Publish device status objects — exposes the System/<metric> health objects described above. On by default.
  • BVLC port — the BACnet/IP UDP port (default 47808). Can't be shared with an MS/TP↔IP bridge (see the note above).
  • Device instance — the BACnet Device object instance; blank = derived automatically from the device id. Set it to fit your site's numbering plan.
  • Object name — the Device object name; blank = OmniBus-<id>.
  • Model name / Vendor name / Vendor ID — identity properties a supervisor displays. Vendor ID defaults to 0 until an ASHRAE-assigned ID is configured.

Writing back

Writing a Value object's present-value (AV / BV) with WriteProperty routes the command to the adapter, which actually drives the equipment — the adapter stays the source of truth and refreshes the present-value on its next poll. WriteProperty to anything that isn't a writable point's present-value returns a BACnet error. Many control paths default to dry-run; confirm a port's write path is live before expecting commands to take effect.

Change-of-value (COV)

The server accepts SubscribeCOV and pushes COV notifications when a subscribed object's value changes, so a supervisor can get event-driven updates instead of polling every point. (Modbus, by contrast, is poll-only.)

Limits

  • One Device object hosts the whole point set.
  • Can't coexist with an MS/TP↔IP bridge on the same BVLC UDP port — run one BACnet role per port.
  • Unsolicited broadcast I-Am on startup isn't sent yet; discovery relies on the supervisor's Who-Is (which is answered).
  • Strings aren't exposed as objects.
  • APDUs are unsegmented (max ~1476 bytes) — use ReadPropertyMultiple to batch large reads efficiently.