Why Does BACnet Return missing-required-parameter?

Erik Lindqvist5 min read
Other ManufacturerOther TopicTroubleshooting
Licensed PE Working through this on a live machine? A Maine-licensed engineer can take it from here — included with IMD hardware, by the hour for everything else. Book an engineer

A read of presentValue from analogInput,0 fails with property: missing-required-parameter because the property request contains a missing field before the valid property identifier. In the shown call, null is passed immediately before PropertyIdentifier.presentValue; remove it so the request contains only the intended property. This is a request-construction failure, not evidence of a bad analog signal or stale process value.

Symptom and request boundary

The requested process value never reaches the application. ServiceFutureImpl.get receives a BACnet error result, and RequestUtils.sendOneAtATime stops before returning the property map. The number that matters is the count of valid property identifiers in each generated request: every request must contain an actual identifier rather than a null entry.

Quantity or field Value in this call Limit or decision Where to read it
Remote device instance 10 Must identify the intended remote device findRemoteDevice(address, 10, transport, ld)
Object type ObjectType.analogInput Must match the remote object ObjectIdentifier construction
Object instance 0 Must exist in the remote device new ObjectIdentifier(ObjectType.analogInput, 0)
Requested property PropertyIdentifier.presentValue Must be a valid, non-null request argument RequestUtils.getProperties call
Unexpected argument null Remove it from the property list Argument immediately before presentValue
Returned error property: missing-required-parameter No value can be decoded until the malformed request is corrected BACnetException message and captured BACnet response

BACnet error mechanism

RequestUtils.getProperties converts the supplied property arguments into one or more BACnet property reads. The stack path through readProperties and sendOneAtATime shows that the helper is issuing individual reads and waiting for each result. When a property position contains null, the generated operation lacks the required property identifier. The remote endpoint rejects that operation with the property-class error missing-required-parameter.

The later PropertyIdentifier.presentValue argument does not repair the earlier malformed operation. One-at-a-time processing can fail on the null entry first and terminate the helper call, so the valid property may never be read. The elapsed time to the exception is therefore transaction timing—request transmission, remote processing, and response handling—not analog-input sampling time.

The commented alternative, new ObjectIdentifier(ObjectType.device, 10), changes the target object rather than the remote connection. Device instance 10 and analog-input instance 0 occupy different roles. Changing the target to a device object is not a repair for a malformed property argument, and presentValue must be requested from an object type that exposes that property.

Diagnostic checks

  1. Inspect the selected getProperties overload in the installed BACnet4J library. Confirm whether its trailing arguments are a property varargs list or whether another typed parameter is expected.
  2. Remove the untyped null from the call. An untyped null can participate in Java overload selection or become an element of a variable-length argument list; either outcome can select a different path from the one intended.
  3. Keep the remote device and target object separate: connect to remote device instance 10, then address analogInput,0 within that device.
  4. Capture the BACnet exchange and inspect the outgoing read. The request must name analogInput,0 and presentValue. If the capture shows a read without a property identifier, the client constructed the malformed request.
  5. If the corrected request still fails, browse the remote device's object list or configuration and verify that analog-input instance 0 exists. Then verify that the object exposes presentValue.
  6. Separate transport discovery from property access. A successful findRemoteDevice result proves that a remote device was found; it does not prove that the requested child object or property exists.

Corrected read procedure

Construct the object identifier once and pass only the requested property to getProperties:

RemoteDevice rd = findRemoteDevice(address, 10, transport, ld);

ObjectIdentifier objectIdentifier =
        new ObjectIdentifier(ObjectType.analogInput, 0);

Map<PropertyIdentifier, Encodable> values =
        RequestUtils.getProperties(
                ld,
                rd,
                objectIdentifier,
                PropertyIdentifier.presentValue);

System.out.println(values);

This form gives the property varargs list one valid element. If this exact call does not compile against the installed BACnet4J release, use the compiler or IDE to display that release's overload signatures. Supply every required non-property argument with its declared type, then pass PropertyIdentifier.presentValue in the property position; never insert an untyped null merely to make an overload compile.

Test one property first. Adding several requested properties before the single-property read works makes it harder to distinguish malformed request construction from an unsupported property or nonexistent object.

Verification criteria

  1. Run the corrected call and confirm that ServiceFutureImpl.get completes without BACnetException: property: missing-required-parameter.
  2. Check that the returned Map<PropertyIdentifier, Encodable> contains an entry for PropertyIdentifier.presentValue. Printing a nonempty map is useful, but checking the requested key gives a precise pass criterion.
  3. Compare the returned value with the remote device's own displayed value or another trusted BACnet client. This distinguishes successful protocol access from a sensor, scaling, or application interpretation problem.
  4. Review a packet capture when the application result and device display disagree. Confirm the response belongs to remote device instance 10 and target analogInput,0, then inspect the returned property value before application conversion.

A successful read closes only the request-construction fault. Signal accuracy, engineering units, scaling, and update behavior are separate checks performed after a valid presentValue response is available.

Recurring implementation pitfalls

Pitfall Observable result Correction
Passing null in a property varargs position missing-required-parameter before a map is returned Pass only valid property identifiers
Confusing device instance 10 with object instance 0 Reads target the wrong BACnet object Track the remote device and contained object as separate identifiers
Changing to ObjectType.device while retaining presentValue The request no longer targets the analog input Keep ObjectType.analogInput for the process value read
Requesting multiple properties during diagnosis The first failed read hides later valid reads Prove a single-property request before expanding it
Treating discovery as object validation The remote device is found, but the property read still fails Verify the object instance and property independently

FAQ

How do I fix BACnet missing-required-parameter in getProperties?

Remove the null argument and call getProperties with PropertyIdentifier.presentValue as the requested property. Then verify that the returned map contains that key.

How do I verify that analogInput 0 is the correct BACnet object?

Browse remote device instance 10 and confirm that analogInput,0 exists and exposes presentValue. A successful device lookup alone does not validate the contained object.

How do I tell whether BACnet4J or the remote device rejected the read?

Capture the BACnet exchange and inspect the outgoing property identifier and returned error. A request missing its property identifier points to client-side construction; a well-formed request directs diagnosis to object existence and property support.

When should I stop troubleshooting and contact official support?

Stop after the corrected single-property call produces a well-formed captured request but the remote device still returns missing-required-parameter, or when the installed library's overloads differ from the call shown. Send the code, complete exception stack, BACnet capture, library version, and device identification to the appropriate manufacturer's official support channel.

Back to blog