What is BACnet COV, and when is it better than polling?
Updated 4 November 2026
Polling means the client reads a point on a timer,
whether it changed or not. COV (Change of Value) means the client
subscribes once and the device sends a notification when the value moves by more than its
COV_Increment, or when a binary or multi-state point changes state. COV cuts
traffic, which matters most on slow MS/TP trunks, but it's optional in BACnet, devices
can hold only so many subscriptions, and subscriptions expire. When a head-end shows a
value that never moves, a lapsed COV subscription is a common reason.
Polling
The client sends ReadProperty (or ReadPropertyMultiple, several properties in one request) for each point every so many seconds. Every BACnet device supports reads, so polling always works. The cost is traffic: 400 points every 10 seconds is 40 reads a second whether anything changed or not. On BACnet IP that rarely matters; on a 38,400-baud MS/TP trunk shared by 40 controllers, it does.
COV
The client sends SubscribeCOV for an object, naming itself as the recipient, a
lifetime, and whether it wants confirmed or unconfirmed notifications. From then on the
device sends a notification carrying Present_Value and
Status_Flags:
- for analog objects, when the value moves by more than
COV_Incrementsince the last notification; - for binary and multi-state objects, on any change of state;
- for any of them, when a status flag changes (into alarm, fault, overridden, out of service).
SubscribeCOVProperty does the same for one named property, on devices that support it.
Lifetime and renewal
A subscription runs for its lifetime in seconds, then the device drops it without telling anyone. The client is expected to resubscribe before it runs out. A lifetime of 0 means "indefinite", but subscriptions are usually held in RAM and lost when the device restarts, so a client that never renews stops getting updates after the first power blip. That's the classic "the graphic says 72 and has said 72 since Tuesday" fault. A good head-end renews on a schedule and falls back to polling when a subscription is refused.
COV_Increment
On analog objects COV_Increment sets how far the value has to move before
a notification goes out. Too small, say 0.01 on a noisy duct static, and the device floods
the network. Too large, say 5 on a zone temperature, and the trend looks flat and the
graphic looks stuck. It's a property on the object, and on many devices it is writable.
Why COV sometimes doesn't work
- The device doesn't support it. COV is optional. Check the device's
PICS for the
DS-COV-Bbuilding block. - The device is out of subscription slots. Small controllers may hold only a handful. When the head-end, an analytics platform and a second front end all subscribe, the last one is refused.
- Notifications can't get back. They are sent to the address in the subscription. Through NAT, a VPN or a firewall that allows your requests out but not unsolicited packets back in, the subscription succeeds and nothing ever arrives.
- The subscription lapsed after a device restart, and the client never renewed it.
Which one to use
Integrators commonly use COV for points behind MS/TP routers and for status points that rarely change, and poll fast-moving analogs on BACnet IP or anything on a device with weak COV support. Many head-ends let you choose per device or per point. When a value looks frozen, read it directly with a tool that polls. If the direct read shows a different value, the device is fine and the head-end's subscription is the problem.
Easy BACnet doesn't subscribe to anything. It reads a point when you open it or tap Refresh, so it leaves nothing behind in the device, and it's a quick way to make that direct-read check.
Check it on your own network. Easy BACnet is a free Android app that finds BACnet IP devices and reads their points in a couple of taps.
Get it on Google Play