ConnectorIO OpenHAB 3.x BACnet Add-on won't install

Running OH 3.4.2 in Win10/WSL2/Docker

Downloaded the ConnectorIO 3.X binding and copied org.connectorio.addons.feature.bacnet-3.0.0-20210402.kar into the addons directory. The BACnet Binding appears when I search under settings/Bindings/AddOns in the UI.

Install hangs and leaves this message in openhab.log

2023-03-19 10:33:30.874 [ERROR] [core.karaf.internal.FeatureInstaller] - Failed installing ‘openhab-binding-bacnet’: Unable to resolve root: missing requirement [root] osgi.identity; osgi.identity=openhab-binding-bacnet; type=karaf.feature; version=“[3.0.0.SNAPSHOT,3.0.0.SNAPSHOT]”; filter:=“(&(osgi.identity=openhab-binding-bacnet)(type=karaf.feature)(version>=3.0.0.SNAPSHOT)(version<=3.0.0.SNAPSHOT))” [caused by: Unable to resolve openhab-binding-bacnet/3.0.0.SNAPSHOT: missing requirement [openhab-binding-bacnet/3.0.0.SNAPSHOT] osgi.identity; osgi.identity=co7io-binding-bacnet; type=karaf.feature [caused by: Unable to resolve co7io-binding-bacnet/3.0.0.SNAPSHOT: missing requirement [co7io-binding-bacnet/3.0.0.SNAPSHOT] osgi.identity; osgi.identity=org.connectorio.addons.binding.bacnet; type=osgi.bundle; version=“[3.0.0.SNAPSHOT,3.0.0.SNAPSHOT]”; resolution:=mandatory [caused by: Unable to resolve org.connectorio.addons.binding.bacnet/3.0.0.SNAPSHOT: missing requirement [org.connectorio.addons.binding.bacnet/3.0.0.SNAPSHOT] osgi.wiring.package; filter:=“(&(osgi.wiring.package=javax.measure)(version>=1.0.0)(!(version>=2.0.0)))”]]]

Any suggestions on what to try next? I’m contemplating a Temco T3000 integration and BACNet looks a lot more appealing than Modbus if I can get it to work

Hello Asher,
Version you downloaded is compatible with openHAB 3.x but not 3.4.x. Most accurate way to get binding for your version is building it from sources. Instructions are provided in several posts from other topic:

Error you have should get gone after getting binding build valid for your OH release. One advice - if you start with T3000 my general advice would be to go with bacnet/ip as binding currently works with polling (just like modbus) so getting larger controller I/O status via serial connection will quickly exceed mstp link capability.

Lukasz,

Thank you so much!

I just loaded the version you sent and it’s doing something, but I’ll try to work out how to build from scratch. Was trying to avoid that!

Definitely using the bacnet/ip mode. One detail: my T3000 and my OH are on different IP subnets. I will move them to the same LAN, but in the meantime any advice how to configure addresses in the bridge and IP bindings? My OH is 192.168.3.41 and TB3000 is 192.168.1.35

BACnet/IP communication rely on broadcast address hence bridge definition for sure will require address which can reach both ends. If you plan changes to network layout simply re-run discovery once you are done. By default first step of discovery is to make an advice about bacnet/ip interfaces based on operating system configuration.

Moved the T3000 BACnet device to the same LAN, but long story short: I can’t expose the OH instance directly to the same broadcast segment. (docker + WSL2 networking)

Since I know the address of my BACnet device, is there any way to configure the bridge and IP device to hardwire addresses and not care about broadcast discovery?

You can enter bridge and device IP address, however your setup is not something I tested so far.

Lukasz: Really good news. Here are the config steps that worked for me on WSL2/Docker

  1. Create the bridge. Local network 0, device ID 1339, local address BLANK, port 47808, broadcast address [192.168.3.255]

  2. Create the IP device. Connect to bridge, Dev IP: [192.168.3.5], port 47808, dev identifier; DEVICE OBJECT ID, network number: 0, Discover Channels: On

The binding automatically populated the BACnet channels in the T3000. I added a few links to see the register reads work properly. For example a Thermistor input channel is reading the right value.

Still working out how writes work

By default you get channel for each basic commandable element (AI/AO/AV, BI/BO/BV etc.). Some of less common bacnet objects or values might be a trouble, but standard I/O shall stay fine.

Have the binding talking to the T3-TB and populating channels. How do I configure the binding to see the RS485/MSTP devices connected to the T3-TB? Still on the test bench, but want to connect MSTP devices like thermostats to the T3-TB.

It really depends on how it is visible in BACnet - are thermostats becoming analog/commendable objects to T3-TB or they become separate devices? If later then you need to add them just like you did with T3-TB using same IP address but use appropriate device id.

Controller and thermostat are separate BACnet devices. On a 3rd party BACnet discovery tool they appear as

Device 0192288: T3-TB at 192.168.3.5:bac0 on net 10 with MAC 192:168:03:05:00:00
Device 0194235: Tstat10-5 at 192.168.3.5:bac0 on net 10 with MAC 5

The binding scans to discover the T3-TB and populates the channels.
I tried adding the thermostat as a BACnet/IP device with

Bridge: BACnet/IP bridge
Device IP Address: 192.168.3.5
Port: 47808
Device identifier: 194235
Network Number: 10
Refresh Interval: 0
Discover Channels: On
Discover Objects: Off

Binding just sits on status “INITIALIZING”. Any suggestions on what’s different between discovery through scanning and discovery from a configured IP address?

Ok, so other way could be adding mstp node to ip bridge and using mstp node id. This is usually working with ip to mstp routers, however I am not entirely sure if that’s case for T3. You could also add network to ip address mapping in bridge settings.

Thanks. I tried adding an MSTP node using the IP Bridge and got the same result: “Initializing”.

I saw the network router box in the bridge advanced configuration. Any tips on what to try there?

network=192.168.3.5:bac0 and network=192.168.3.5:47808

don’t seem to be the right answers. I’m new to BACnet.

The other strange thing: the T3-TB binding works when it is discovered via the SCAN, but I can’t manually populate it as a BACnet/IP device

Can you share your logs? If things gets stuck in initializing phase there might be some failures calculating addresses to reach devices.

Any of this help? Are you aware of a different controller I should try that might have more complete BACnet support? I think it’s the right approach for my project if I can tame all the loose ends.

Unfortunately I need to work on something else and will return to BACnet in a week

2023-03-23 17:49:49.601 [WARN ] [e.bacnet4j.wrapper.ip.BacNetIpClient] - Discovered unsupported property, ignoring
org.code_house.bacnet4j.wrapper.api.UnsupportedTypeException: Unsuported bacnet object type 128
at org.code_house.bacnet4j.wrapper.api.Type.valueOf(Type.java:90) ~[?:?]
at org.code_house.bacnet4j.wrapper.api.BacNetClientBase.createObjectSingleRead(BacNetClientBase.java:409) ~[?:?]
at org.code_house.bacnet4j.wrapper.api.BacNetClientBase.createObject(BacNetClientBase.java:396) ~[?:?]
at org.code_house.bacnet4j.wrapper.api.BacNetClientBase.getDeviceObjects(BacNetClientBase.java:165) ~[?:?]
at org.connectorio.addons.binding.bacnet.internal.handler.object.BACnetDeviceHandler.updateChannels(BACnetDeviceHandler.java:197) ~[?:?]
at org.connectorio.addons.binding.bacnet.internal.handler.object.BACnetDeviceHandler.lambda$initialize$4(BACnetDeviceHandler.java:132) ~[?:?]
at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859) [?:?]
at java.util.concurrent.CompletableFuture.uniWhenCompleteStage(CompletableFuture.java:883) [?:?]
at java.util.concurrent.CompletableFuture.whenComplete(CompletableFuture.java:2251) [?:?]
at org.connectorio.addons.binding.bacnet.internal.handler.object.BACnetDeviceHandler.initialize(BACnetDeviceHandler.java:123) [bundleFile:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
at org.openhab.core.internal.common.AbstractInvocationHandler.invokeDirect(AbstractInvocationHandler.java:154) [bundleFile:?]
at org.openhab.core.internal.common.Invocation.call(Invocation.java:52) [bundleFile:?]
at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
at java.lang.Thread.run(Thread.java:829) [?:?]

Looks like one of devices have vendor specific objects. Try disabling device channel/object discovery and see if its any better.

Best, Łukasz

Tried adding the device without discovery and it populates as ONLINE. Then tried adding channels manually and it switched to

Status:

UNINITIALIZED

HANDLER_CONFIGURATION_PENDING

{readOnly=The parameter is required., propertyIdentifier=The parameter is required.

Then I ran a SCAN on the device and got this log:

2023-03-24 06:59:34.440 [ERROR] [4j.wrapper.api.DiscoveryEventAdapter] - Could not collect additional device information
com.serotonin.bacnet4j.exception.BACnetTimeoutException: null
at com.serotonin.bacnet4j.transport.ServiceFutureImpl.result(ServiceFutureImpl.java:75) ~[bundleFile:?]
at com.serotonin.bacnet4j.transport.ServiceFutureImpl.get(ServiceFutureImpl.java:64) ~[bundleFile:?]
at org.code_house.bacnet4j.wrapper.api.DiscoveryEventAdapter.createDevice(DiscoveryEventAdapter.java:67) [bundleFile:?]
at org.code_house.bacnet4j.wrapper.api.DiscoveryEventAdapter.iAmReceived(DiscoveryEventAdapter.java:109) [bundleFile:?]
at org.code_house.bacnet4j.wrapper.api.util.ForwardingAdapter$2.run(ForwardingAdapter.java:77) [bundleFile:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
at java.lang.Thread.run(Thread.java:829) [?:?]
Caused by: com.serotonin.bacnet4j.exception.BACnetTimeoutException
at com.serotonin.bacnet4j.transport.DefaultTransport.lambda$expire$1(DefaultTransport.java:957) ~[?:?]
at com.serotonin.bacnet4j.transport.UnackedMessageContext.useConsumer(UnackedMessageContext.java:162) ~[?:?]
at com.serotonin.bacnet4j.transport.DefaultTransport.expire(DefaultTransport.java:957) ~[?:?]
at com.serotonin.bacnet4j.transport.DefaultTransport.run(DefaultTransport.java:525) ~[?:?]
… 1 more
2023-03-24 06:59:52.558 [ERROR] [4j.wrapper.api.DiscoveryEventAdapter] - Could not collect additional device information
com.serotonin.bacnet4j.exception.BACnetTimeoutException: null
at com.serotonin.bacnet4j.transport.ServiceFutureImpl.result(ServiceFutureImpl.java:75) ~[bundleFile:?]
at com.serotonin.bacnet4j.transport.ServiceFutureImpl.get(ServiceFutureImpl.java:64) ~[bundleFile:?]
at org.code_house.bacnet4j.wrapper.api.DiscoveryEventAdapter.createDevice(DiscoveryEventAdapter.java:67) [bundleFile:?]
at org.code_house.bacnet4j.wrapper.api.BlockingDiscoveryCallable.iAmReceived(BlockingDiscoveryCallable.java:76) [bundleFile:?]
at org.code_house.bacnet4j.wrapper.api.util.ForwardingAdapter$2.run(ForwardingAdapter.java:77) [bundleFile:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
at java.lang.Thread.run(Thread.java:829) [?:?]
Caused by: com.serotonin.bacnet4j.exception.BACnetTimeoutException
at com.serotonin.bacnet4j.transport.DefaultTransport.lambda$expire$1(DefaultTransport.java:957) ~[?:?]
at com.serotonin.bacnet4j.transport.UnackedMessageContext.useConsumer(UnackedMessageContext.java:162) ~[?:?]
at com.serotonin.bacnet4j.transport.DefaultTransport.expire(DefaultTransport.java:957) ~[?:?]
at com.serotonin.bacnet4j.transport.DefaultTransport.run(DefaultTransport.java:525) ~[?:?]
… 1 more

Can you share a screenshot from wacnet or bacnet explorer? There are two issues in above message. First is incomplete channel configuration, second is timeout related to network communications.

Sadly I have no way to test this controller other than making this try/fail approach.

Best,
Łukasz

I loaded WACnet. It sees the T3-TB and loads the same objects the binding sees.

It lists the serial number for the TSTAT10, but appears to throw java errors when it tries to load BACNET objects. I opened a question on the TEMCO forum to see if they can shed any light on what’s going on.

I’ll let you know what I hear from them.