BACnet COV vs Polling: Tradeoffs and When to Use Each

BACnetCOVpollingsubscriptionperformance
May 17, 2026|9 min read

BACnet COV (Change of Value) subscribes a client to receive push notifications whenever an object's value changes by at least its COV_Increment, while polling has the client repeatedly read values on a fixed schedule. Use COV when you need fast change detection across many slow-changing points and the device supports it reliably; use polling when you need predictable bandwidth, synchronized multi-point reads, or the device's COV implementation is incomplete. At most real sites the right answer is a hybrid — COV for the bulk of points, polling as a heartbeat or fallback on anything safety-critical.

When This Decision Shows Up

You hit the COV-vs-polling question whenever you build a new integration: a supervisory station pulling points from field controllers, an analytics platform ingesting trend data, an IoT gateway forwarding values to the cloud. The default in most engineering tools is “poll everything every 60 seconds.” That works until one of the following starts to bite:

How COV and Polling Actually Work

Polling is the simpler model. A client (your JACE, supervisor, or script) issues a ReadProperty or ReadPropertyMultiple request, the device returns the current value, the client moves on to the next point. Repeat on a fixed interval. Bandwidth and CPU load are deterministic: number of points × polling rate × bytes per read. Worst-case detection latency is one poll interval. If the device is offline, you get an error and try again next cycle.

COV (Change of Value) inverts the flow. The client sends a SubscribeCOV or SubscribeCOVProperty request once, specifying a process identifier, a target object, an issue-confirmed flag, and a subscription lifetime in seconds. The device then sends a COVNotification back — either confirmed (which the client must acknowledge) or unconfirmed (fire-and-forget) — whenever the monitored property changes by more than the object's COV_Increment (for analog values) or whenever it transitions (for binary values). When the subscription lifetime runs out, the device stops sending notifications. The client must re-issue the subscription before that happens.

Both services are defined in ASHRAE Standard 135. The exact set of subscription services a device supports depends on the protocol revision and the BIBBs (BACnet Interoperability Building Blocks) the vendor declared on the PICS. Real-world support breaks down roughly as follows:

Choosing Between COV and Polling

The decision usually isn't global — it's per-point-class. Use this rough framework:

Tuning COV_Increment and Subscription Lifetime

Two parameters determine whether COV behaves well: the COV_Increment on the object, and the subscription Lifetime the client requests.

COV_Increment defines the minimum absolute change in Present_Value required to trigger a notification. Set it too low and a noisy sensor will flood the trunk; set it too high and you'll miss real changes. A few starting points that work in practice:

Lifetime is the subscription duration in seconds the client requests. A lifetime of zero means “subscribe indefinitely” in some implementations, but many devices interpret this differently or cap it internally. A safer pattern is a finite lifetime (for example, 300 seconds) that the client renews on a shorter interval (every 240 seconds). If the client crashes, the device will drop the subscription naturally; if the device restarts, the client will re-establish it on the next renewal. Most supervisory platforms handle this automatically — verify your specific BACnet driver actually renews, because some don't.

Common Pitfalls

Verifying COV Behavior in the Field

When something feels wrong, the fastest way to confirm what's actually happening on the wire is a packet capture. On BACnet/IP, capture on the interface carrying UDP 47808 and look for SubscribeCOV requests from the client, the corresponding SimpleACK from the device, and the subsequent UnconfirmedCOVNotification or ConfirmedCOVNotification messages flowing back. If you see the subscribe and ACK but no notifications, either the value really isn't changing enough to cross the increment, or the device's COV implementation is broken.

In Wireshark, the BACnet dissector decodes COV service requests and notifications directly — filter for the BACnet protocol and look at the service column. Avoid copying obscure filter expressions from forums; either use the protocol filter and read the decoded packets, or build a filter from the dissector tree by right-clicking a known-good field and selecting “Apply as Filter.”

When to Escalate

Reach out to the device vendor or your integrator (rather than continuing to tune) when:

For Python automation that needs to test COV behavior directly, both bacpypes3 and BAC0 support subscription and notification handling — their respective READMEs and API documentation on PyPI are the canonical references for the current release's API surface.

Source Attribution

The technical guidance in this entry is informed by the following sources:

Additional testing and field validation by SiteConduit.

COVpollingsubscriptionperformanceBACnet

Was this article helpful?

Related Articles

Need to do this remotely? SiteConduit provides Layer 2 access that preserves BACnet broadcasts — no BBMD needed for remote sessions. Join the waitlist.

SC

SiteConduit Technical Team

Idea Networks Inc.

SiteConduit builds managed remote access for building automation. Our knowledge base is maintained by BAS professionals with hands-on experience deploying and troubleshooting BACnet, Niagara, Modbus, and Facility Explorer systems.