Hi Matthew,
Our testing with the Siemens BMS went off mostly without a hitch, so I'd say the COV code is good to merge.
The only minor issue we came up against, was when we restarted our bacnet4j connector, we couldn't accept new COV subscriptions, because we didn't know about the remote device.
So the workaround we came up with was sending out a "WhoIs" request before failing the COV subscription. There was probably a better way but this is what we did:
The original code from com.serotonin.bacnet4j.obj.BACnetObject.addCovSubscription(Address, Network, UnsignedInteger, Boolean, UnsignedInteger)
if (confirmed) {
// If the peer wants confirmed notifications, it must be in the remote device list.
RemoteDevice d = localDevice.getRemoteDevice(from);
if (d == null)
throw new BACnetServiceException(ErrorClass.services, ErrorCode.covSubscriptionFailed,
"From address not found in remote device list. Cannot send confirmed notifications");
}
We changed to:
if (confirmed) {
// If the peer wants confirmed notifications, it must be in the remote device list.
RemoteDevice d = localDevice.getRemoteDevice(from);
if (d == null) {
// Send a WhoIs before sending a failure message, so that subsequent subscriptions will hopefully work
try {
this.localDevice.sendUnconfirmed(from, network, new WhoIsRequest());
}
catch (BACnetException e) {
// If the WhoIs request fails we just ignore it.
}
throw new BACnetServiceException(ErrorClass.services, ErrorCode.covSubscriptionFailed,
"From address not found in remote device list. Cannot send confirmed notifications");
}
}
Although I don't know if you'd want to merge something like that change, as it is more of a workaround and a bit specific to how our environment is setup.
Other than that we verified that COV subscriptions for Analog devices worked flawlessly taking into account their threshold.