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
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.
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?
Lukasz: Really good news. Here are the config steps that worked for me on WSL2/Docker
Create the bridge. Local network 0, device ID 1339, local address BLANK, port 47808, broadcast address [192.168.3.255]
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.
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.
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) [?:?]
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.
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.