BadDeadbandFilterInvalid
BadDeadband
BadDeadbandFilterInvalid means the deadband in your DataChangeFilter is not usable. Percent deadband requires an EURange property on the node and a value between 0 and 100; absolute deadband requires a non-negative value on a numeric item. Check for EURange before requesting Percent, and fall back to Absolute where it is missing.
What you actually see
Items with a deadband are rejected while identical items with DeadbandType None are accepted, and the rejection follows the node rather than the client.
Why it happens
- Percent deadband on a node with no EURangeA percent deadband is a percentage of the node's engineering unit range, so the server needs an EURange property on the Variable to compute it. Where EURange is missing, the percentage has no meaning. Some servers reject the filter for this reason and others silently ignore the deadband, which is worse because you believe filtering is happening when it is not.
- Percent value outside 0 to 100A percent deadband is expressed as a percentage, so 0 to 100 is the meaningful range. Configuration that stores deadbands as fractions and passes 0.02 meaning two percent will filter almost nothing, and a value above 100 or below zero is invalid outright.
- Deadband on a non-numeric itemDeadband compares numeric magnitudes. A Boolean, String, DateTime, ByteString or structured value has no deadband, and requesting one is invalid. This appears when a generic collector applies a default deadband to every tag it finds, including state words and text.
- Negative absolute deadband valueAn absolute deadband is a magnitude, so a negative value is meaningless. It usually arrives from a signed configuration field or from arithmetic that produced a negative range, and it is refused rather than treated as zero.
- DeadbandType value not one of the defined threeDeadbandType is None, Absolute or Percent. An out-of-range integer from a configuration file or an off-by-one enumeration mapping produces this code with no other symptom.
How to fix it
In diagnostic order: work down, do not skip ahead.
- Read EURange before requesting a percent deadbandBrowse the Variable for a HasProperty reference to EURange and read it. If it is absent, do not request Percent. Where you have the range from another source, compute an equivalent absolute deadband yourself and request Absolute instead.
- Prefer absolute deadband for machine dataAbsolute is more portable, needs no metadata on the node, and is easier to reason about: a deadband of 0.5 on a temperature in degrees means exactly that. Reserve Percent for analogue loops where EURange is reliably present and the range varies between instruments.
- Restrict deadbands to numeric items in your generatorBranch on the item's DataType when building the filter. Numeric scalar Variables get a deadband; Booleans, strings and structures get DeadbandType None with a StatusValue DataChangeTrigger. This removes most occurrences of this code from a fleet configuration in one change.
- Confirm the deadband is actually being enforcedA server that accepted the filter is not necessarily applying it. Set a deliberately large deadband on a noisy value and confirm the notification rate falls. If it does not, the deadband is being ignored and you must filter client-side or slow the sampling interval instead.
- Use DataChangeTrigger alongside the deadbandDataChangeTrigger of Status, StatusValue or StatusValueTimestamp decides what counts as a change at all. StatusValue is the sensible default; StatusValueTimestamp will notify on every sample where the timestamp moves, which defeats the deadband entirely for a server that stamps every sample.
Where it shows up, by tool and stack
| Tool / stack | What to do there |
|---|---|
| UaExpert | The Data Access View exposes deadband type and value per row, which makes it the fastest way to establish whether a given server accepts and honours a percent deadband on a specific node. |
| UA-.NETStandard (C#) | Set MonitoredItem.Filter to a DataChangeFilter with DeadbandType cast from the DeadbandType enum and DeadbandValue as a double. Check MonitoredItem.Status.Error after ApplyChanges; a rejected filter leaves the item in error, not merely unfiltered. |
| node-opcua | DataChangeFilter takes trigger, deadbandType and deadbandValue. DeadbandType.Percent against a node with no EURange is the classic failure; read the EURange property first. |
| asyncua (Python) | Build ua.DataChangeFilter and pass it in the monitored item parameters. The high-level subscribe_data_change does not set a deadband, so any deadband in your system came from code you can inspect. |
| open62541 (C) | The DataChangeFilter fields are set directly on the monitored item request. Absolute deadband on numeric items is the well-trodden path; verify percent support against your specific server. |
| Ignition | Deadband is configured per tag with a mode selection, and where the server does not support the requested mode the platform may filter on its side instead. Verify whether the reduction you see is happening at the server or in the gateway. |
What it looks like in the log
DataChangeFilter rejected for ns=3;s=Oven.Temp: DeadbandType Percent, EURange not present
Absolute deadband value -1.0 invalid for ns=2;s=Flow
Deadband requested on Boolean item ns=4;s=Machine.Running
Confirm the fix
Recreate the item and confirm the per-item status is Good, then compare the notification rate with and without the deadband on the same signal over a few minutes; an unchanged rate means the filter was accepted but not applied.
Stop it happening again
Drive deadband selection from the node's DataType and the presence of EURange rather than from a global default, store deadbands in engineering units so a percentage cannot be misread as a fraction, and include a rate check that proves the filter is being honoured.
Stuck on more than one of these? The troubleshooting clinic works through broken configurations end to end, on camera.
Troubleshooting clinic →Last verified 7 September 2026 against OPC UA 1.05.07. OPC UA Connect is an educational resource and is not affiliated with the OPC Foundation.