DrvBACnet is a driver for Web Port for communication via the BACnet protocol. The driver supports BACnet via IP and BBMD. Addressing can take place both via object type and object name. Questions are polled, but COV will also be implemented.
Information
You can enable Shared connections by navigating to:
System settings/Communication/Drivers and click on DrvBACnet.
There you will find a checkbox to enable it.
NOTE!
All BACnet devices on the same network must have unique device IDs. DrvBACnet does not support connecting to multiple devices with the same ID. Ensure that each device ID is distinct to avoid connection issues.
Installation
The installation of DrvBACnet is done by selecting DrvBACnet when installing the Web Port. See "Installation" for more information on the installation process.
Device Configuration
To use, a DrvBACnet is created for an IO device according to "Create IO-device" in the "IO-Devices"-manual. In addition to general settings (see "General settings in the "IO-Devices"-manual), there are the following settings for an IO device of the DrvBACnet type:
| Setting: | Description: |
| End schedule events with NULL | If the default state '0' is not used, 'null' is returned |
| Extend schedule event over day shift | With local time schedule, an additional event is added at midnight for transitions between days. |
| Disable tag on fail | Tags will be disabled after five unsuccessful attempts to read one. |
| Port (Dropdown) | Select BACnet port, for example BAC0, BAC1 etc... |
| Default IP | Specifies the IP address of the network card BACnet queries are sent through. !NOTE! This IP belongs to the machine on which the Web Port is installed, not the BACnet device you wish to connect to. |
| Custom port | Define a custom port number. (Overides Port setting) |
| BBMD IP |
IP address of BBMD device. Ex. 10.0.0.22 |
| BBMD Port |
Port of BBMD device. Ex. 47808 |
| BBMD Mask |
Port of BBMD device. Ex. 255.255.255.255 |
| BACnet device | *See information box below |
| Reload configuration |
If this box is checked, the configuration of a BACnet device will be read again when the IO device is saved. This can be useful if the programming has changed in the control system. Configuration files are saved under /assets/import/drvbacnet/devices/ |
| Use alarmsync |
If checked, 2way sync of alarms is activated. A timer is enabled that checks every 10th seconds for alarms and syncs current status both in WebPort and on the device. |
| Objects loaded |
Objects Loaded count indicates how many BACnet objects were found in the configuration file. |
*Information BACnet device-setting
Device name of the device the IO device is to communicate with. This can also be omitted and instead specified in the tag by entering this according to devicename@technicaladdress.
BACnet devices can be addressed directly to the IP address instead of broadcasting.
This is then specified according to device-id@ip-address
Ex. 10111@10.0.0.11
BACnet devices can also be addressed by their device number.
This is then specified according to device:devicenumber.
Ex. device:10111
Device names and numbers can be found by selecting autoimport, IO device and BACnet device in the tag list.
For more information on how to create, edit and delete IO devices, see IO-Devices in the main manual.
Driver Configuration
There are some settings that can be made on the driver. These settings can be found under:
System settings -> Communication -> Drivers.
| Setting: | Description: |
| Timeout [ms] | Timeout time if no respond. |
| Retry count | How many times it tries to read. |
| WhoIs Interval | Who-Is is a BACnet service used to discover devices on the network. Who-Is Interval refers to the time interval between sending Who-Is requests on the network. This interval setting can be configured to reduce network traffic. |
| Foreign Device Time To Live (TTL) |
Foreign Device Time to Live (TTL) defines how long a Foreign Device registration remains active in the Foreign Device Table before it is discarded. After this period, the device is re-registered again to maintain communication. In multi-network setups where devices need to interact across different IP subnets, you would use Foreign Device TTL to ensure ongoing registration with the BBMD. Adjusting the TTL can help reduce unnecessary re-registration traffic, particularly if devices are expected to remain stable on the network for long periods. |
| Reset Client after [min] |
If Bacnet client stops communicating with all devices connected to that client, it will reset client after set amount of time. |
| Use direct WhoIs |
Use Direct Who-Is enables finding a BACnet device by sending a Who-Is request directly to its deviceId instead of broadcasting This reduces network traffic improves efficiency with BBMD devices and supports both Who-Is and Remote Who-Is requests It is important to ensure proper device network settings for effective communication This feature is especially useful in large BACnet networks where minimizing broadcast traffic is necessary. |
| Shared Connection |
With “Shared Connections” makes it possible to use a bacnet browser, for example (YABE) at the same time as Web Port on the same IP-address. |
Use Direct Who-Is
The Use Direct WhoIs setting enables the discovery of a specific BACnet device by sending a Who-Is request directly to its device instance number (deviceId) rather than broadcasting.
Benefits:
- Helps reduce network traffic by disabling broadcast Who-Is requests.
- Improves efficiency when communicating with BBMD devices, ensuring a more direct lookup.
- Works for both regular Who-Is and Remote Who-Is requests.
Important Notes:
- Ensure that the device network settings are correctly configured for effective communication.
- This feature is particularly useful in large BACnet networks where broadcast traffic should be minimized.
Use Direct Who-Is enables finding a BACnet device by sending a Who-Is request directly to its deviceId instead of broadcasting This reduces network traffic improves efficiency with BBMD devices and supports both Who-Is and Remote Who-Is requests It is important to ensure proper device network settings for effective communication This feature is especially useful in large BACnet networks where minimizing broadcast traffic is necessary
Tags
To read and write values from a BACnet device, tags must be created in the Web Port and addressed to the desired signals.
For more information on how to create tag lists and tags, see "Tags" in the main manual.
The address can be specified as follows:
Technical address ex. B'H'Mes'HuS6.present-value
Object type (name) and id ex. binary-value: 101012.present-value
Object type (id) and id ex. 5:101012.present-value
Tip1!
Create a tag list for each IO device. This is to get a good structure and easily find tags in the lists.
Tip2!
Web Port supports the import of tags via the BACnet protocol. The import function is found in edit mode for a tag list. An import script is required for import. An example import script is included with the installation and is added by default to /assets/import/drvbacnet/example.js. The script supports the import of the most common object types.
You can download or upload your own scripts via the "Import tags-function" in the Web Port interface by choosing your BACnet IO and then click on importscript.
The script runs for each object found on a device (listed in the respective device configuration file)
Tip3!
Web Port uses priority 16 by default. This priority can be changed at the tag level by typing !nn after the address in the tag list, where nn is the desired priority. In BACnet, prio 8 is used for manual overrides technical address!priority
Priority can then be reset by entering a technical address !!priority on a tag
Example: manual setting of analog control signal.
Three tags are configured.
Tag 1 (OP, current output) uses prio 16 (addressOP)
Tag 2 (OPM, manual output) uses prio 8 (addressOP! 8)
Tag 3 (M, active manual operation) indicates whether OPM is active or not (addressOP !! 8)
When writing to tag 1, Web Port writes to prio 16
When writing to tag 2, Web Port writes to prio 8
When writing value 0 to tag 3, priority is reset to 16 (the value of prio 8 is deleted)
When writing value 1 to tag 3, priority is set to 8 (and the value of prio 16 is copied to prio 8)
Tip4!
Schedules are read into the Web Port as the type SCHEDULE. These can be read in Web Port as a local schedule where the entire tag name is specified as the Tag Reference. See section on local schedules in the main manual.
Tags associated with a DrvBACnet IO device may have the following data types:
| Data type in BACnet: | Data type in Web Port: |
| BOOLEAN | DIGITAL |
| UNSIGNED_INT | ULONG |
| SIGNED_INT | LONG |
| REAL | REAL |
| DOUBLE | DOUBLE |
| DATE | DATE |
| TIME | TIME |
| CHARACTER_STRING | STRING |
| BIT_STRING | BITSTRING |
| ENUMERATED | ENUM |
| WEEKLY_SCHEDULE | SCHEDULE |
Addresses are most easily found via a BACnet browser, e.g. YABE.
BACnet object
Web Port can read BACnet objects either via its object-name or via its object type followed by: and instance number. Proprietary objects are read by typing object type: instance where object type is specified as number.
The following BACnet objects are supported in Web Port:
| Object: | Number |
| analog-input | =0 |
| analog-output | =1 |
| analog-value | =2 |
| binary-input | =3 |
| binary-output | =4 |
| binary-value | =5 |
| calendar | =6 |
| command | =7 |
| device | =8 |
| event-enrollment | =9 |
| file | =10 |
| group | =11 |
| loop | =12 |
| multi-state-input | =13 |
| multi-state-output | =14 |
| notification-class | =15 |
| program | =16 |
| schedule | =17 |
| averaging | =18 |
| multi-state-value | =19 |
| trendlog | =20 |
| life-safety-point | =21 |
| life-safety-zone | =22 |
| accumulator | =23 |
| pulse-converter | =24 |
| event-log | =25 |
| global-group | =26 |
| trend-log-multiple | =27 |
| load-control | =28 |
| structured-view | =29 |
| access-door | =30 |
| timer | =31 |
| access-credential | =32 |
| access-point | =33 |
| access-rights | =34 |
| access-user | =35 |
| access-zone | =36 |
| credential-data-input | =37 |
| network-security | =38 |
| bitstring-value | =39 |
| characterstring-value | =40 |
| date-pattern-value | =41 |
| date-value | =42 |
| datetime-pattern-value | =43 |
| datetime-value | =44 |
| integer-value | =45 |
| large-analog-value | =46 |
| octetstring-value | =47 |
| positive-integer-value | =48 |
| time-pattern-value | =49 |
| time-value | =50 |
| notification-forwarder | =51 |
| alert-enrollment | =52 |
| channel | =53 |
| lightning-output | =54 |
| binary-lightning-output | =55 |
| proprietary-min | =128 |
| proprietary-max | =1023 |
| max-bacnet-type | =1024 |
| max-ashrae-type | =55 |
Parameters
The following parameters can be applied to BACnet objects. Parameters can be accessed either via their name or number. Proprietary parameters are always accessed via their number. In the technical address, first the object ID is entered, then a point (.) And then the parameter. If a different position in an array is to be reached, this is indicated in parentheses []. Writing is currently always done with level 16.
...
| acked-transitions | = 0 |
| ack-required | = 1 |
| action | = 2 |
| action-text | = 3 |
| active-text | = 4 |
| active-vt-sessions | = 5 |
| alarm-value | = 6 |
| alarm-values | = 7 |
| all | = 8 |
| all-writes-successful | = 9 |
| apdu-segment-timeout | = 10 |
| apdu-timeout | = 11 |
| application-software-version | = 12 |
| archive | = 13 |
| bias | = 14 |
| change-of-state-count | = 15 |
| change-of-state-time | = 16 |
| notification-class | = 17 |
| blank-1 | = 18 |
| controlled-variable-reference | = 19 |
| controlled-variable-units | = 20 |
| controlled-variable-value | = 21 |
| cov-increment | = 22 |
| date-list | = 23 |
| daylight-savings-status | = 24 |
| deadband | = 25 |
| derivative-constant | = 26 |
| derivative-constant-units | = 27 |
| description | = 28 |
| description-of-halt | = 29 |
| device-address-binding | = 30 |
| device-type | = 31 |
| effective-period | = 32 |
| elapsed-active-time | = 33 |
| error-limit | = 34 |
| event-enable | = 35 |
| event-state | = 36 |
| event-type | = 37 |
| exception-schedule | = 38 |
| fault-values | = 39 |
| feedback-value | = 40 |
| file-access-method | = 41 |
| file-size | = 42 |
| file-type | = 43 |
| firmware-revision | = 44 |
| high-limit | = 45 |
| inactive-text | = 46 |
| in-process | = 47 |
| instance-of | = 48 |
| integral-constant | = 49 |
| integral-constant-units | = 50 |
| issue-confirmed-notifications | = 51 |
| limit-enable | = 52 |
| list-of-group-members | = 53 |
| list-of-object-property-references | = 54 |
| list-of-session-keys | = 55 |
| local-date | = 56 |
| local-time | = 57 |
| location | = 58 |
| low-limit | = 59 |
| manipulated-variable-reference | = 60 |
| maximum-output | = 61 |
| max-apdu-length-accepted | = 62 |
| max-info-frames | = 63 |
| max-master | = 64 |
| max-pres-value | = 65 |
| minimum-off-time | = 66 |
| minimum-on-time | = 67 |
| minimum-output | = 68 |
| min-pres-value | = 69 |
| model-name | = 70 |
| modification-date | = 71 |
| notify-type | = 72 |
| number-of-apdu-retries | = 73 |
| number-of-states | = 74 |
| object-identifier | = 75 |
| object-list | = 76 |
| object-name | = 77 |
| object-property-reference | = 78 |
| object-type | = 79 |
| optional | = 80 |
| out-of-service | = 81 |
| output-units | = 82 |
| event-parameters | = 83 |
| polarity | = 84 |
| present-value | = 85 |
| priority | = 86 |
| priority-array | = 87 |
| priority-for-writing | = 88 |
| process-identifier | = 89 |
| program-change | = 90 |
| program-location | = 91 |
| program-state | = 92 |
| proportional-constant | = 93 |
| proportional-constant-units | = 94 |
| protocol-conformance-class | = 95 |
| protocol-object-types-supported | = 96 |
| protocol-services-supported | = 97 |
| protocol-version | = 98 |
| read-only | = 99 |
| reason-for-halt | = 100 |
| recipient | = 101 |
| recipient-list | = 102 |
| reliability | = 103 |
| relinquish-default | = 104 |
| required | = 105 |
| resolution | = 106 |
| segmentation-supported | = 107 |
| setpoint | = 108 |
| setpoint-reference | = 109 |
| state-text | = 110 |
| status-flags | = 111 |
| system-status | = 112 |
| time-delay | = 113 |
| time-of-active-time-reset | = 114 |
| time-of-state-count-reset | = 115 |
| time-synchronization-recipients | = 116 |
| units | = 117 |
| update-interval | = 118 |
| utc-offset | = 119 |
| vendor-identifier | = 120 |
| vendor-name | = 121 |
| vt-classes-supported | = 122 |
| weekly-schedule | = 123 |
| attempted-samples | = 124 |
| average-value | = 125 |
| buffer-size | = 126 |
| client-cov-increment | = 127 |
| cov-resubscription-interval | = 128 |
| current-notify-time | = 129 |
| event-time-stamps | = 130 |
| log-buffer | = 131 |
| log-device-object-property | = 132 |
| enable | = 133 |
| log-interval | = 134 |
| maximum-value | = 135 |
| minimum-value | = 136 |
| notification-threshold | = 137 |
| previous-notify-time | = 138 |
| protocol-revision | = 139 |
| records-since-notification | = 140 |
| record-count | = 141 |
| start-time | = 142 |
| stop-time | = 143 |
| stop-when-full | = 144 |
| total-record-count | = 145 |
| valid-samples | = 146 |
| window-interval | = 147 |
| window-samples | = 148 |
| maximum-value-timestamp | = 149 |
| minimum-value-timestamp | = 150 |
| variance-value | = 151 |
| active-cov-subscriptions | = 152 |
| backup-failure-timeout | = 153 |
| configuration-files | = 154 |
| database-revision | = 155 |
| direct-reading | = 156 |
| last-restore-time | = 157 |
| maintenance-required | = 158 |
| member-of | = 159 |
| fashion | = 160 |
| operation-expected | = 161 |
| setting | = 162 |
| silenced | = 163 |
| tracking-value | = 164 |
| zone-members | = 165 |
| life-safety-alarm-values | = 166 |
| max-segments-accepted | = 167 |
| profile-name | = 168 |
| auto-slave-discovery | = 169 |
| manual-slave-address-binding | = 170 |
| slave-address-binding | = 171 |
| slave-proxy-enable | = 172 |
| last-notify-record | = 173 |
| schedule-default | = 174 |
| accepted-modes | = 175 |
| adjust-value | = 176 |
| count | = 177 |
| count-before-change | = 178 |
| count-change-time | = 179 |
| cov-period | = 180 |
| input-reference | = 181 |
| limit-monitoring-interval | = 182 |
| logging-object | = 183 |
| logging-record | = 184 |
| prescale | = 185 |
| pulse-rate | = 186 |
| scale | = 187 |
| scale-factor | = 188 |
| update-time | = 189 |
| value-before-change | = 190 |
| value-set | = 191 |
| value-change-time | = 192 |
| align-intervals | = 193 |
| interval-offset | = 195 |
| last-restart-reason | = 196 |
| logging-type | = 197 |
| restart-notification-recipients | = 202 |
| time-of-device-restart | = 203 |
| time-synchronization-interval | = 204 |
| trigger | = 205 |
| utc-time-synchronization-recipients | = 206 |
| node-subtype | = 207 |
| node-type | = 208 |
| structured-object-list | = 209 |
| subordinate-annotations | = 210 |
| subordinate-list | = 211 |
| actual-shed-level | = 212 |
| duty-window | = 213 |
| expected-shed-level | = 214 |
| full-duty-baseline | = 215 |
| requested-shed-level | = 218 |
| shed-duration | = 219 |
| shed-level-descriptions | = 220 |
| shed-levels | = 221 |
| state-description | = 222 |
| door-alarm-state | = 226 |
| door-extended-pulse-time | = 227 |
| door-members | = 228 |
| door-open-too-long-time | = 229 |
| door-pulse-time | = 230 |
| door-status | = 231 |
| door-unlock-delay-time | = 232 |
| lock-status | = 233 |
| masked-alarm-values | = 234 |
| secured-status | = 235 |
| absentee-limit | = 244 |
| access-alarm-events | = 245 |
| access-doors | = 246 |
| access-event | = 247 |
| access-event-authentication-factor | = 248 |
| access-event-credential | = 249 |
| access-event-time | = 250 |
| access-transaction-events | = 251 |
| accompaniment | = 252 |
| accompaniment-time | = 253 |
| activation-time | = 254 |
| active-authentication-policy | = 255 |
| assigned-access-rights | = 256 |
| authentication-factors | = 257 |
| authentication-policy-list | = 258 |
| authentication-policy-names | = 259 |
| authentication-status | = 260 |
| authorization-mode | = 261 |
| belongs-to | = 262 |
| credential-disable | = 263 |
| credential-status | = 264 |
| credentials | = 265 |
| credentials-in-zone | = 266 |
| days-remaining | = 267 |
| entry-points | = 268 |
| exit-points | = 269 |
| expiry-time | = 270 |
| extended-time-enable | = 271 |
| failed-attempt-events | = 272 |
| failed-attempts | = 273 |
| failed-attempts-time | = 274 |
| last-access-event | = 275 |
| last-access-point | = 276 |
| last-credential-added | = 277 |
| last-credential-added-time | = 278 |
| last-credential-removed | = 279 |
| last-credential-removed-time | = 280 |
| last-use-time | = 281 |
| lockout | = 282 |
| lockout-relinquish-time | = 283 |
| master-exemption | = 284 |
| max-failed-attempts | = 285 |
| members | = 286 |
| muster-point | = 287 |
| negative-access-rules | = 288 |
| number-of-authentication-policies | = 289 |
| occupancy-count | = 290 |
| occupancy-count-adjust | = 291 |
| occupancy-count-enable | = 292 |
| occupancy-exemption | = 293 |
| occupancy-lower-limit | = 294 |
| occupancy-lower-limit-enforced | = 295 |
| occupancy-state | = 296 |
| occupancy-upper-limit | = 297 |
| occupancy-upper-limit-enforced | = 298 |
| passback-exemption | = 299 |
| passback-mode | = 300 |
| passback-timeout | = 301 |
| positive-access-rules | = 302 |
| reason-for-disable | = 303 |
| supported-formats | = 304 |
| supported-format-classes | = 305 |
| threat-authority | = 306 |
| threat-level | = 307 |
| trace-flag | = 308 |
| transaction-notification-class | = 309 |
| user-external-identifier | = 310 |
| user-information-reference | = 311 |
| user-name | = 317 |
| user-type | = 318 |
| uses-remaining | = 319 |
| zone-from | = 320 |
| zone-to | = 321 |
| access-event-tag | = 322 |
| global-identifier | = 323 |
| verification-time | = 326 |
| base-device-security-policy | = 327 |
| distribution-key-revision | = 328 |
| do-not-hide | = 329 |
| key-sets | = 330 |
| last-key-server | = 331 |
| network-access-security-policies | = 332 |
| packet-reorder-time | = 333 |
| security-pdu-timeout | = 334 |
| security-time-window | = 335 |
| supported-security-algorithm | = 336 |
| update-key-set-timeout | = 337 |
| backup-and-restore-state | = 338 |
| backup-preparation-time | = 339 |
| restore-completion-time | = 340 |
| restore-preparation-time | = 341 |
| bit-mask | = 342 |
| bit-text | = 343 |
| is-utc | = 344 |
| group-members | = 345 |
| group-member-names | = 346 |
| member-status-flags | = 347 |
| requested-update-interval | = 348 |
| covu-period | = 349 |
| covu-recipients | = 350 |
| event-message-texts | = 351 |
| event-message-texts-config | = 352 |
| event-detection-enable | = 353 |
| event-algorithm-inhibit | = 354 |
| event-algorithm-inhibit-ref | = 355 |
| time-delay-normal | = 356 |
| reliability-evaluation-inhibit | = 357 |
| fault-parameters | = 358 |
| fault-type | = 359 |
| local-forwarding-only | = 360 |
| process-identifier-filter | = 361 |
| subscribed-recipients | = 362 |
| port-filter | = 363 |
| authorization-exemptions | = 364 |
| allow-group-delay-inhibit | = 365 |
| channel-number | = 366 |
| control-groups | = 367 |
| execution-delay | = 368 |
| last-priority | = 369 |
| write-status | = 370 |
| property-list | = 371 |
| serial-number | = 372 |
| blink-warn-enable | = 373 |
| default-fade-time | = 374 |
| default-ramp-rate | = 375 |
| default-step-increment | = 376 |
| egress-time | = 377 |
| in-progress | = 378 |
| instantaneous-power | = 379 |
| lighting-command | = 380 |
| lighting-command-default-priority | = 381 |
| max-actual-value | = 382 |
| min-actual-value | = 383 |
| power | = 384 |
| transition | = 385 |
| egress-active | = 386 |
| interface-value | = 387 |
| fault-high-limit | = 388 |
| fault-low-limit | = 389 |
| low-diff-limit | = 390 |
| strike-count | = 391 |
| time-of-strike-count-reset | = 392 |
| default-timeout | = 393 |
| initial-timeout | = 394 |
| last-state-change | = 395 |
| state-change-values | = 396 |
| timer-running | = 397 |
| timer-state | = 398 |
| command-time-array | = 430 |
| current-command-priority | = 431 |
| last-command-time | = 432 |
| value-source | = 433 |
| value-source-array | = 434 |
| max-bacnet-property-id | = 4194303 |
Import script
To simplify the import of BACnet devices, import scripts can be created. These are placed in /assets/import/drvbacnet/. Or you can also find them in the Web Port interface via Systemsettings->Tags->Edit taglist->Import tags and then click on Importscript. The scripts are written in JavaScript and an example is included in the installation (example.js).
Web Port BACnet Integration
More info and help on connecting a BACnet device to Web Port: