Skip to main content
Version: 4.2 (beta)

BACnet Utility

The BACnet Utility application allows you to find all BACnet devices available on the network, to show all objects of a device, and all properties and values of any object instance. It also supports writing values to writable properties, and configuring the periodic polling of objects and properties. Whenever a BACNet I/O server is defined in HSYCO, the BACnet Utility will appear among the applications of the manager.

The utility works with both the BACnet/IP and the BACnet/SC datalinks, and browses the devices reachable through the selected I/O Server.

Selecting the I/O Server

When more than one BACnet I/O Server is defined, select the one to browse in the I/O Server ID field. The device, object and property lists always refer to the selected I/O Server.

Discovering the devices

To discover the BACnet devices, press the Discover button. This sends a Who-Is request, and every device answering with an I-Am is listed in the left column, with its device ID.

BACnet Devices Discovery

The information icon at the end of each row shows the vendor ID and the network address of the device.

If a device does not answer to the Who-Is request, for example because it is on a different network, you can add it manually: add a row to the devices list and enter its device ID. HSYCO will send a new Who-Is request, and the row is shown with vendor ID and address undefined, and struck through, until the device answers. Devices that don't answer within 30 seconds are removed from the list.

Browsing objects and properties

Select a device row, and the utility will show all object instances of that device, with the Device object always listed first.

Select any object instance to show all properties and values of that object, read with the ReadPropertyMultiple service. Segmented responses are supported, so the object list and the property list of devices with a large number of objects are browsed correctly.

You can enter a refresh interval in seconds, in the Properties Refresh Interval field, to automatically poll the selected object instance, or set it to Off to only read the values when the object is selected.

Writing a value

Properties that are writable are highlighted in bold, and have an Edit icon at the end of the row. Press the Edit icon to open the write box, enter the new value, and the priority and the array index if needed, then confirm to write the new value to the device with the WriteProperty service.

Using the datapoints in EVENTS

The Copy DTP button of the properties list copies the full HSYCO datapoint name of that property, ready to be pasted in an EVENTS program or in a Java application.

Polling

Devices that don't support change of value notification can be read periodically instead, so that their HSYCO datapoints stay up to date without writing any EVENTS logic. The Polling button of the main page opens the Polling page, where the polls of the selected I/O Server are configured, one row per object or property.

The Polling page

The Polling page, scoped by the I/O Server selector like the other pages, lists one row per configured poll and lets you insert, edit and delete rows:

ColumnEditableDescription
enabledyesswitch: when off the row is kept in the table and in the file, but is never polled
deviceyesdevice instance number, 0 … 4194303
objectyesobject type and instance, <objecttype>.<instance> (e.g. analoginput.0)
propertyyesproperty name (or number); leave empty to poll all properties of the object
everyyespoll interval in seconds, 1 … 86400
variableyesgating EVENTS variable name: the row only polls while that variable holds 1 or true; leave empty to always poll
pollsnostatistics, see the Statistics table below
deltanostatistics, see the Statistics table below
minnostatistics, see the Statistics table below
maxnostatistics, see the Statistics table below
errorsnostatistics, see the Statistics table below

The add/edit popup guides the device, object and property fields instead of asking for free text: the device field lists the devices the I/O Server has discovered; picking a device fills the object field from that device's object list, read from the device when the Polling page opens and again on demand — if the cache is still cold the field shows a "loading objects - reselect the device" placeholder until the read completes and the device is reselected; picking an object then fills the property field from the same per-type property list used by the properties view. The property field's clear button means "poll all properties of the object". Clearing the device field resets the object and property fields, and clearing the object field resets the property field, so a partial reselection never leaves stale choices behind. Editing an existing row pre-seeds all three fields from its current values. Devices or objects that the I/O Server hasn't discovered, and proprietary numeric properties outside the per-type list, aren't selectable from these pickers — add those rows by editing the bacnet-poll.txt file directly, as described below.

Rows can be deleted one at a time, or in bulk selecting them with the selection column. The Reset Stats button clears the statistics of every row of the selected I/O Server.

Adding an object or a property from the browse page

The Poll button at the end of each row of the objects and properties lists adds that object or property to the polling table of the selected I/O Server, without opening the popup. The button on the properties list adds the single property, the button on the objects list adds all properties of the object.

Rows added this way are always inserted disabled, with an interval of 60 seconds: review them on the Polling page, set the interval you need, and switch them on. Adding an object or property that is already in the polling table is refused with a message.

Statistics

Statistics are kept in memory only, for the running session: they are reset whenever the file is reloaded, whether the reload was triggered by a hand edit or by an edit made from the page, and also on demand with the page's Reset Stats button.

Statistics correlate responses by object identity, not by request: a manual readproperty: command or a browse of the same object can complete an outstanding poll, in which case its Delta measures that response instead of the polling engine's own request.

StatisticDescription
Pollsnumber of requests sent for this row; cycles skipped because the row is disabled or gated off don't count
Deltaround-trip time of the last completed poll for this row, in milliseconds
Minsmallest round-trip time observed for this row since the last reset, in milliseconds
Maxlargest round-trip time observed for this row since the last reset, in milliseconds
Errorspolls that received no matching response by the row's next cycle, including an unreachable device, a lost response, or an Error/Reject/Abort answer; the driver doesn't correlate an Error/Reject/Abort by invoke id, so it's counted as an Error at the row's next polling cycle rather than the instant it arrives

The bacnet-poll.txt file

Polling rows for all BACnet I/O Servers are kept in a single bacnet-poll.txt file, in the HSYCO root directory, keyed by I/O Server name in the first segment of each row. Each I/O Server loads only its own rows, matching its name case-insensitively. The file is plain text, and each row has the following syntax:

# <ioserver>.<device>.<objecttype>.<instance>[.<property>] = <seconds>[, <variable>]
bacnetip.123.analogoutput.1.presentvalue = 10
bacnetip.123.analogoutput.1 = 60
bacnetip.77.binaryinput.4.presentvalue = 5, pollhvac
# bacnetip.77.binaryinput.5.presentvalue = 5
  • A row with 5 dot-separated segments on the left side (I/O server name, device, object type, object instance, property) polls a single property. A row with 4 segments (no property) polls all properties of the object, using the same per-type property list as the properties view, as one ReadPropertyMultiple request.
  • <seconds> is the poll interval, from 1 to 86400.
  • <variable> is optional: when set, the row only polls while that EVENTS variable holds 1 or true (case-insensitive); leave it empty to always poll. While gated off, the row neither polls nor accumulates errors.
  • Object types and properties accept the same lowercase names used for the BACnet Datapoints, or the raw numeric identifier.
  • A row commented out with a leading #, like the last one in the example above, is a disabled row: it is still listed on the Polling page, with its Enabled switch off, but it is never polled and accumulates no statistics. Toggling the switch on the page adds or removes the #. A # line that doesn't parse as a poll row is treated as an ordinary comment and ignored.
  • The file supports both hand edits and edits from the Polling page. Editing from the page rewrites the entire file from its own row model: only the one-line syntax header is regenerated, so ordinary comments and invalid lines are lost. Hand edits are honored as long as they're not overwritten by a subsequent page edit.
  • Edits made from the Polling page are applied immediately: the page always shows the reloaded rows right after an insert, edit or delete. Hand edits to the file are picked up within 1 second. Either way, reloading replaces the whole row set and resets all statistics.

See Polling in the BACnet I/O Server documentation for how the due rows of a device are batched into ReadPropertyMultiple requests.