[SOLVED] Many(+100) modbus pollers, is it slowing down the binding?

The SNAPSHOT binding does not show up in the binding inbox?I named it like this “org.openhab.binding.modbus-2.5.0-lazy-updates-SNAPSHOT.jar” and put it in the openhab2-addons file.And i uninstalled the 2.4 modbus binding restart openhab and nothing show’s up?Am i doing something wrong?I am using the jablotron SNAPSHOT binding the same way and that one is showing up in the binding inbox?

Hmm, I haven’t used PaperUI for this so I’m not sure how it works out
bundle:list|grep -i modbus list all modbus bundles.
bundle:update XX where XX is the ID of the modbus binding as listed by bundle:list. Updates the binding from addons folder.

What do you mean by openhab2-addons file?

The file smb://openhabian-server.local/openhab2-share/openhab2-addons
When i drop the jar file there i should install te binding.
And it did

openhab> bundle:list|grep -i modbus
289 │ Installed │  80 │ 2.5.0.201812281754     │ Modbus Binding

But i have this warning

2018-12-28 20:37:07.859 [WARN ] [org.apache.felix.fileinstall        ] - Error while starting bundle: file:/usr/share/openhab2/addons/org.openhab.binding.modbus-2.5.0-lazy-updates-SNAPSHOT.jar

org.osgi.framework.BundleException: Could not resolve module: org.openhab.binding.modbus [289]

  Unresolved requirement: Import-Package: org.eclipse.jdt.annotation; resolution:="optional"

  Unresolved requirement: Import-Package: org.openhab.io.transport.modbus

	at org.eclipse.osgi.container.Module.start(Module.java:444) ~[?:?]

	at org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:383) ~[?:?]

	at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundle(DirectoryWatcher.java:1260) [10:org.apache.felix.fileinstall:3.6.4]

	at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(DirectoryWatcher.java:1233) [10:org.apache.felix.fileinstall:3.6.4]

	at org.apache.felix.fileinstall.internal.DirectoryWatcher.startAllBundles(DirectoryWatcher.java:1221) [10:org.apache.felix.fileinstall:3.6.4]

	at org.apache.felix.fileinstall.internal.DirectoryWatcher.doProcess(DirectoryWatcher.java:515) [10:org.apache.felix.fileinstall:3.6.4]

	at org.apache.felix.fileinstall.internal.DirectoryWatcher.process(DirectoryWatcher.java:365) [10:org.apache.felix.fileinstall:3.6.4]

	at org.apache.felix.fileinstall.internal.DirectoryWatcher.run(DirectoryWatcher.java:316) [10:org.apache.felix.fileinstall:3.6.4]
openhab> bundle:list|grep -i modbus
289 │ Installed │  80 │ 2.5.0.201812281754     │ Modbus Binding
openhab> bundle:update 289
openhab>                                                                      

You are missing the modbus transport (org.openhab.io.transport.modbus). You can install it with feature:install openhab-transport-modbus or something similar (see all available features with feature:list).

It is working cpu level is less but very unstable between 10% and 35% with an average of 13%.
Before without de modbus binding cpu level was around 4%.Your on the right track.I keep testing and report back to you.

1 Like

You can also try adjusting the rate which data things are updated (in case the value is not changing), see the parameter documentation here

Default of 1000 ms that channels are updated every second even though value would be the same.

I would be curious to know how it compares to the old binding.

That sounds like an attractive compromise.

I must get my own ‘live’ system set up so that I can swap test “openhabs” in easily. Happy to trial things, but I have to leave it functional at the end of each day :crazy_face:

1 Like

I have tested some different configurations the updateUnchangedValuesEveryMillis does influence the cpu load.This config is giving me best performance and lowest cpu load.The cpu load is still higher then the modbus1 binding.But it is acceptable.I also set timeBetweenTransactionsMillis=1.and refresh=1.Very fast polling

Bridge modbus:serial:slave1 [ port="/dev/ttyUSB0" ,id=1 , baud=38400, stopBits="1", parity="none",timeBetweenTransactionsMillis=1,dataBits=8, encoding="rtu" ]{

Bridge poller slave1coils [ start=0, length=8, refresh=0, type="coil" ]{
    
        Thing data do00 [ readStart="0", readValueType="bit", writeStart="0", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do01 [ readStart="1", readValueType="bit", writeStart="1", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do02 [ readStart="2", readValueType="bit", writeStart="2", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do03 [ readStart="3", readValueType="bit", writeStart="3", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do04 [ readStart="4", readValueType="bit", writeStart="4", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do05 [ readStart="5", readValueType="bit", writeStart="5", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do06 [ readStart="6", readValueType="bit", writeStart="6", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do07 [ readStart="7", readValueType="bit", writeStart="7", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]

    } 
}     
Bridge modbus:serial:slave2 [ port="/dev/ttyUSB0" ,id=2 , baud=38400, stopBits="1", parity="none",timeBetweenTransactionsMillis=1,dataBits=8, encoding="rtu" ]{

Bridge poller slave2coils [ start=0, length=8, refresh=0, type="coil" ]{
    
        Thing data do08 [ readStart="0", readValueType="bit", writeStart="0", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do09 [ readStart="1", readValueType="bit", writeStart="1", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do10 [ readStart="2", readValueType="bit", writeStart="2", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do11 [ readStart="3", readValueType="bit", writeStart="3", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do12 [ readStart="4", readValueType="bit", writeStart="4", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do13 [ readStart="5", readValueType="bit", writeStart="5", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do14 [ readStart="6", readValueType="bit", writeStart="6", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do15 [ readStart="7", readValueType="bit", writeStart="7", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]

    } 
} 
Bridge modbus:serial:slave3 [ port="/dev/ttyUSB0" ,id=3 , baud=38400, stopBits="1", parity="none",timeBetweenTransactionsMillis=1,dataBits=8, encoding="rtu" ]{

Bridge poller slave3coils [ start=0, length=8, refresh=0, type="coil" ]{
    
        Thing data do16 [ readStart="0", readValueType="bit", writeStart="0", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do17 [ readStart="1", readValueType="bit", writeStart="1", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do18 [ readStart="2", readValueType="bit", writeStart="2", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do19 [ readStart="3", readValueType="bit", writeStart="3", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do20 [ readStart="4", readValueType="bit", writeStart="4", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do21 [ readStart="5", readValueType="bit", writeStart="5", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do22 [ readStart="6", readValueType="bit", writeStart="6", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do23 [ readStart="7", readValueType="bit", writeStart="7", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]

    } 
}
Bridge modbus:serial:slave4 [ port="/dev/ttyUSB0" ,id=4 , baud=38400, stopBits="1", parity="none",timeBetweenTransactionsMillis=1,dataBits=8, encoding="rtu" ]{

Bridge poller slave4coils [ start=0, length=8, refresh=0, type="coil" ]{
    
        Thing data do24 [ readStart="0", readValueType="bit", writeStart="0", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do25 [ readStart="1", readValueType="bit", writeStart="1", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do26 [ readStart="2", readValueType="bit", writeStart="2", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do27 [ readStart="3", readValueType="bit", writeStart="3", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do28 [ readStart="4", readValueType="bit", writeStart="4", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do29 [ readStart="5", readValueType="bit", writeStart="5", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do30 [ readStart="6", readValueType="bit", writeStart="6", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]
        Thing data do31 [ readStart="7", readValueType="bit", writeStart="7", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]

    } 
}          
Bridge modbus:serial:slave10 [ port="/dev/ttyUSB0" ,id=10 , baud=38400, stopBits="1", parity="none",timeBetweenTransactionsMillis=1,dataBits=8, encoding="rtu" ]{ 
   
Bridge poller slave10Inputs [ start=0, length=16, refresh=1, type="discrete" ]{ 
    
       Thing data di00 [ readStart="0", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di01 [ readStart="1", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di02 [ readStart="2", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di03 [ readStart="3", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di04 [ readStart="4", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di05 [ readStart="5", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di06 [ readStart="6", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di07 [ readStart="7", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di08 [ readStart="8", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di09 [ readStart="9", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di10 [ readStart="10", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di11 [ readStart="11", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di12 [ readStart="12", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di13 [ readStart="13", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di14 [ readStart="14", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di15 [ readStart="15", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
          
    }
}   
Bridge modbus:serial:slave11 [ port="/dev/ttyUSB0" ,id=11 , baud=38400, stopBits="1", parity="none",timeBetweenTransactionsMillis=1,dataBits=8, encoding="rtu" ]{ 
   
Bridge poller slave11Inputs [ start=0, length=16, refresh=1,type="discrete" ]{ 
    
       Thing data di16 [ readStart="0", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di17 [ readStart="1", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di18 [ readStart="2", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di19 [ readStart="3", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di20 [ readStart="4", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di21 [ readStart="5", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di22 [ readStart="6", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di23 [ readStart="7", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di24 [ readStart="8", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di25 [ readStart="9", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di26 [ readStart="10", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di27 [ readStart="11", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di28 [ readStart="12", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di29 [ readStart="13", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di30 [ readStart="14", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
       Thing data di31 [ readStart="15", readValueType="bit",updateUnchangedValuesEveryMillis="500000" ]
          
    }
}    



This is with de SNAPSHOT binding.

@Rado1 do you have any figures how much higher cpu usage you are seeing?

I made a few loggings with various config’s
First old modbus1 binding with my old config

Second old modbus1 binding with updateunchangeditems =true

And last modbus2 SNAPSHOT with config from previous post

1 Like

Dear @ssalonen, dear @Rado1

I updated to OH 2.4 and modbus binding V2 today. With Modbus Binding V1 I used

updateunchangeitems=false

for all my modbus slaves, as I have 235 modbus items in my setup (smart home :slight_smile: ). CPU load on my odroid XU4 was between 20% and 30% usually.

After updating the modbus binding CPU load increased to 200% + (2 CPU cores constantly occupied). By changing the poll cycles from 500ms to 2000ms I was able to reduce the CPU load to about 80%. Now with the 2.5.0 snapshot version I was able to configure 500ms again with a cpu load of 30% in average. For all data points I use

updateUnchangedValuesEveryMillis="1000000"

now.

Thanks, @ssalonen for all the work you put into the modbus binding for the last years!

Yours

Wolfgang

2 Likes

@ssalonen, I have added the parameter timeBetweenTransactionsMillis=0 and the reponsetime for writing a change from the sitemap is now as low as I was used to with V1, more or less immediate.

My bridge now looks like this:
Bridge modbus:tcp:SH2WEB [ host=“192.168.1.198”, port=502, id=1, timeBetweenTransactionsMillis=0, reconnectAfterMillis=60000]

I have 133 things using this bridge.

CPU-info as follows (in “idle”-mode). I don’t know if it is good or bad?
top - 15:51:28 up 73 days, 20:45, 1 user, load average: 1.40, 1.43, 1.45

2 Likes

Good that the original issue in this thread was solved. Consider marking your own reply as the answer.

Cpu load will be pretty high when each poll of data updates the channels of 100+ things . For this reason, there is the experimental version above, updating the channels less regularly.

I will do this, if it is solved…today no rules are executing and I see this as the last loginfo:

2019-01-06 14:31:03.198 [WARN ] [mmon.WrappedScheduledExecutorService] - Scheduled runnable ended with an exception: 

java.lang.InternalError: BMH.reinvoke=Lambda(a0:L/SpeciesData<LLLI>,a1:L)=>{

t2:L=MethodHandleImpl.array(a1:L);

t3:I=BoundMethodHandle$Species_L3I.argI3(a0:L);

t4:L=BoundMethodHandle$Species_L3I.argL2(a0:L);

t5:L=BoundMethodHandle$Species_L3I.argL1(a0:L);

t6:L=BoundMethodHandle$Species_L3I.argL0(a0:L);

t7:L=MethodHandle.invokeBasic(t6:L,t5:L,t4:L,t3:I,t2:L);t7:L}

at java.lang.invoke.MethodHandleStatics.newInternalError(MethodHandleStatics.java:127) ~[?:?]

at java.lang.invoke.LambdaForm.compileToBytecode(LambdaForm.java:660) ~[?:?]

at java.lang.invoke.LambdaForm.prepare(LambdaForm.java:635) ~[?:?]

at java.lang.invoke.MethodHandle.<init>(MethodHandle.java:461) ~[?:?]

at java.lang.invoke.BoundMethodHandle.<init>(BoundMethodHandle.java:58) ~[?:?]

at java.lang.invoke.BoundMethodHandle$Species_L3I.<init>(Species_L3I) ~[?:?]

at java.lang.invoke.BoundMethodHandle$Species_L3I.copyWith(Species_L3I) ~[?:?]

at java.lang.invoke.MethodHandle.asCollector(MethodHandle.java:1002) ~[?:?]

at jdk.internal.dynalink.DynamicLinker.createRelinkAndInvokeMethod(DynamicLinker.java:228) ~[?:?]

at jdk.internal.dynalink.DynamicLinker.link(DynamicLinker.java:201) ~[?:?]

at jdk.nashorn.internal.runtime.linker.Bootstrap.bootstrap(Bootstrap.java:208) ~[?:?]

at jdk.nashorn.internal.runtime.linker.Bootstrap.createDynamicInvoker(Bootstrap.java:371) ~[?:?]

at jdk.nashorn.internal.runtime.linker.Bootstrap.createDynamicInvoker(Bootstrap.java:345) ~[?:?]

at jdk.nashorn.internal.runtime.linker.InvokeByName.<init>(InvokeByName.java:86) ~[?:?]

at jdk.nashorn.internal.runtime.linker.InvokeByName.<init>(InvokeByName.java:73) ~[?:?]

at jdk.nashorn.internal.objects.Global.<init>(Global.java:96) ~[?:?]

at jdk.nashorn.internal.runtime.Context.newGlobal(Context.java:1111) ~[?:?]

at jdk.nashorn.api.scripting.NashornScriptEngine$2.run(NashornScriptEngine.java:350) ~[?:?]

at jdk.nashorn.api.scripting.NashornScriptEngine$2.run(NashornScriptEngine.java:346) ~[?:?]

at java.security.AccessController.doPrivileged(Native Method) ~[?:?]

at jdk.nashorn.api.scripting.NashornScriptEngine.createNashornGlobal(NashornScriptEngine.java:346) ~[?:?]

at jdk.nashorn.api.scripting.NashornScriptEngine.<init>(NashornScriptEngine.java:143) ~[?:?]

at jdk.nashorn.api.scripting.NashornScriptEngineFactory.getScriptEngine(NashornScriptEngineFactory.java:148) ~[?:?]

at javax.script.ScriptEngineManager.getEngineByName(ScriptEngineManager.java:238) ~[?:?]

at org.eclipse.smarthome.transform.javascript.internal.JavaScriptTransformationService.transform(JavaScriptTransformationService.java:77) ~[?:?]

at org.openhab.binding.modbus.internal.Transformation.transform(Transformation.java:140) ~[?:?]

at org.openhab.binding.modbus.internal.Transformation.transformState(Transformation.java:186) ~[?:?]

at org.openhab.binding.modbus.internal.handler.ModbusDataThingHandler.lambda$9(ModbusDataThingHandler.java:819) ~[?:?]

at java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1553) ~[?:?]

at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580) ~[?:?]

at org.openhab.binding.modbus.internal.handler.ModbusDataThingHandler.processUpdatedValue(ModbusDataThingHandler.java:787) ~[?:?]

at org.openhab.binding.modbus.internal.handler.ModbusDataThingHandler.onRegisters(ModbusDataThingHandler.java:667) ~[?:?]

at org.openhab.binding.modbus.internal.handler.ModbusPollerThingHandlerImpl$ReadCallbackDelegator.lambda$0(ModbusPollerThingHandlerImpl.java:91) ~[?:?]

at java.util.concurrent.CopyOnWriteArrayList.forEach(CopyOnWriteArrayList.java:891) ~[?:?]

at org.openhab.binding.modbus.internal.handler.ModbusPollerThingHandlerImpl$ReadCallbackDelegator.onRegisters(ModbusPollerThingHandlerImpl.java:91) ~[?:?]

at org.openhab.io.transport.modbus.internal.ModbusLibraryWrapper.invokeCallbackWithResponse(ModbusLibraryWrapper.java:279) ~[?:?]

at org.openhab.io.transport.modbus.internal.ModbusManagerImpl$PollOperation.lambda$1(ModbusManagerImpl.java:163) ~[?:?]

at org.openhab.io.transport.modbus.internal.SimpleStopWatch.timeRunnable(SimpleStopWatch.java:148) ~[?:?]

at org.openhab.io.transport.modbus.internal.ModbusManagerImpl$PollOperation.accept(ModbusManagerImpl.java:162) ~[?:?]

at org.openhab.io.transport.modbus.internal.ModbusManagerImpl$PollOperation.accept(ModbusManagerImpl.java:1) ~[?:?]

at org.openhab.io.transport.modbus.internal.ModbusManagerImpl.executeOperation(ModbusManagerImpl.java:571) ~[?:?]

at org.openhab.io.transport.modbus.internal.ModbusManagerImpl.lambda$15(ModbusManagerImpl.java:719) ~[?:?]

at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:?]

at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) ~[?:?]

at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) ~[?:?]

at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) ~[?:?]

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:?]

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:?]

at java.lang.Thread.run(Thread.java:748) [?:?]

 Caused by: java.lang.OutOfMemoryError: Java heap space

I don’t understand what this means or the cause. Is it because the modbus-binding or something else?

No idea, looks like very low level java issue when it is doing the transformation… this is outside the scope of the binding.

Perhaps open new thread regarding this? Can you get the issue all the time?

I believe (could be very wrong) that Modbus binding being the one to discover there is no memory does not make it the guilty party - could be anyone.

If you’ve still got all the tracing turned on that be making some extra load on loggers etc.

ok. I restarted openhab service and it runs as usual now.
If/when it happen again I posta a new thread about it.

Thanks again @ssalonen for your wokr!

Best,
Per

1 Like

As I understood, this parameter configures if and if yes how ofter MODBUS Thing will get an update if the status is not changed?

Thing data do08 [ readStart="0", readValueType="bit", writeStart="0", writeValueType="bit", writeType="coil",updateUnchangedValuesEveryMillis="500000" ]

This parameter is not in the documentation. Is it only available on 2.5 snapshot or in 2.4 stable binding too?

And can I set it to false, which means I get only changed Things trigger and no update trigger?
Which means my item only get changed events? This will reduce the load on OH? Because MODBUS will update my items every sec. and I have 100 of them.

Check out above posts for all the answers, linked here for your convenience.

experimental version (not just a typical snapshot, you have to download it here)

Please read the following messages for the installation instructions and issues you might encounter

Docs which explains the behavior as well Many(+100) modbus pollers, is it slowing down the binding?

Note that “false” is not valid configuration value, it is not a number.

Thanks for the hint, I missed this. Can I ask one more question about this parameter

updateUnchangedValuesEveryMillis=
Normally values are not updated unless their value change. In milliseconds.

Does this mean, if I do not configure the parameter the binding only acts on thing change and will update the item?
In an earlier version of the binding I run into a problem with my persistance. I had a config to persist on every update. This slows down OH a lot. I changed persist on every change and it works again. This is why I thought that the modbus-binding sends an update to the thing/item at every poll interval. But this seams not the case. I will try it.