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
- Inspect the selected
getPropertiesoverload in the installed BACnet4J library. Confirm whether its trailing arguments are a property varargs list or whether another typed parameter is expected. - Remove the untyped
nullfrom 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. - Keep the remote device and target object separate: connect to remote device instance
10, then addressanalogInput,0within that device. - Capture the BACnet exchange and inspect the outgoing read. The request must name
analogInput,0andpresentValue. If the capture shows a read without a property identifier, the client constructed the malformed request. - If the corrected request still fails, browse the remote device's object list or configuration and verify that analog-input instance
0exists. Then verify that the object exposespresentValue. - Separate transport discovery from property access. A successful
findRemoteDeviceresult 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
- Run the corrected call and confirm that
ServiceFutureImpl.getcompletes withoutBACnetException: property: missing-required-parameter. - Check that the returned
Map<PropertyIdentifier, Encodable>contains an entry forPropertyIdentifier.presentValue. Printing a nonempty map is useful, but checking the requested key gives a precise pass criterion. - 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.
- Review a packet capture when the application result and device display disagree. Confirm the response belongs to remote device instance
10and targetanalogInput,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.