[SOLVED] How to migrate from Modbus binding v1 to Modbus binding v2?

Hello!
openHAB version: 2.4

Modbus binding v1:
lemp.items

Dimmer  LED1     "lemp #1" <light>   {modbus="slave2:0"}
Dimmer  LED2     "lemp #2" <light>   {modbus="slave2:1"}
Number  LED1TXT  "[%d]"              {modbus="slave1:0"}
Number  LED2TXT  "[%d]"              {modbus="slave1:1"}

modbus.cfg

poll=200
 
modbus:serial.slave1.connection=/dev/ttyUSB0:9600:8:none:1:rtu:200:1000:none:none
modbus:serial.slave1.id=10
modbus:serial.slave1.start=2
modbus:serial.slave1.length=2
modbus:serial.slave1.type=input

modbus:serial.slave2.connection=/dev/ttyUSB0:9600:8:none:1:rtu:200:1000:none:none
modbus:serial.slave2.id=10
modbus:serial.slave2.start=4
modbus:serial.slave2.length=2
modbus:serial.slave2.type=holding

Modbus binding v2:
lemp.items

Dimmer  LED1    "lemp #1" <light>   {channel="modbus:data:lemp:write:one:dimmer"}
Dimmer  LED2    "lemp #2" <light>   {channel="modbus:data:lemp:write:two:dimmer"}

Number  LED1TXT  "[%d]" {channel="modbus:data:lemp:read:one:number"}
Number  LED2TXT  "[%d]" {channel="modbus:data:lemp:read:two:number"}

modbus.things

    Bridge modbus:serial:lemp [
         port="/dev/ttyUSB0",
         baud=9600,
         dataBits=8,
         parity="none",
         stopBits="1",
         encoding="rtu",
         timeBetweenTransactionsMillis=200,
         receiveTimeoutMillis=1000,
         flowControlIn="none",
         flowControlOut="none",
         id=10
     ] {
         Bridge poller read  [ start=2, length=2, refresh=500, type="input" ] {
             Thing data one [ readStart="2", readValueType="int16" ]
             Thing data two [ readStart="3", readValueType="int16" ]
         }
     
         Bridge poller write [ start=4, length=2, refresh=500, type="holding" ] {
            Thing data one [ writeStart="4", writeValueType="int16" ]
            Thing data two [ writeStart="5", writeValueType="int16" ]
         }
     }

What is wrong in configuration?
Thank you for your answer.

At a first look, you must give all Things a unique name

Bridge poller read [ start=2, length=2, refresh=500, type="input" ] {
Thing data readone [ readStart="2", readValueType="int16" ]
Thing data readtwo [ readStart="3", readValueType="int16" ]
}

Bridge poller write [ start=4, length=2, refresh=500, type="holding" ] {
   Thing data writeone [ writeStart="4", writeValueType="int16" ]
   Thing data writetwo [ writeStart="5", writeValueType="int16" ]
}
1 Like

What does the logs say?

Docs have a section on migration from old to new binding : https://www.openhab.org/addons/bindings/modbus/#how-to-manually-migrate

That also has good troubleshooting steps and advice how to find errors.

Best
Sami

1 Like

Btw, I am not sure if it is OK to split thing definition to multiple lines like you have.

Logs will tell if that is an issue… Syntax errors are logged when the file is modified and reloaded in openHAB

1 Like

Changed all Things name but still the same.
lemp.items

Dimmer  LED1    "lemp #1" <light>   {channel="modbus:data:lemp:write:writeone:dimmer", autoupdate="false"}
Dimmer  LED2    "lemp #2" <light>   {channel="modbus:data:lemp:write:writetwo:dimmer", autoupdate="false"}

Number  LED1TXT  "[%d]"              {channel="modbus:data:lemp:read:readone:number", autoupdate="false"}
Number  LED2TXT  "[%d]"              {channel="modbus:data:lemp:read:readtwo:number", autoupdate="false"}

modbus.things

    Bridge modbus:serial:lemp [
        port="/dev/ttyUSB0",
        baud=9600,
        dataBits=8,
        parity="none",
        stopBits="1",
        encoding="rtu",
        timeBetweenTransactionsMillis=200,
        receiveTimeoutMillis=1000,
        flowControlIn="none",
        flowControlOut="none",
        id=10
    ] {
        Bridge poller read  [ start=2, length=2, refresh=500, type="input" ] {
            Thing data readone [ readStart="2", readValueType="int16" ]
            Thing data readtwo [ readStart="3", readValueType="int16" ]
        }

        Bridge poller write [ start=4, length=2, refresh=500, type="holding" ] {
           Thing data writeone [ writeStart="4", writeValueType="int16" ]
           Thing data writetwo [ writeStart="5", writeValueType="int16" ]
        }
    }

/etc/default/openhab2

`EXTRA_JAVA_OPTS="-Dgnu.io.rxtx.SerialPorts=/dev/ttyUSB0:/dev/ttyS0:/dev/ttyS2:/dev/ttyACM0:/dev/ttyAMA0"`
   openhab> log:tail
    10:50:36.780 [INFO ] [ort.modbus.internal.ModbusManagerImpl] - Modbus manager activated
    10:50:40.417 [INFO ] [bpanel.internal.HABPanelDashboardTile] - Started HABPanel at /habpanel
    10:50:54.299 [INFO ] [del.core.internal.ModelRepositoryImpl] - Loading model 'lemp.items'
    10:51:02.581 [INFO ] [rthome.model.lsp.internal.ModelServer] - Started Language Server Protocol (LSP) service on port 5007
    10:51:03.771 [INFO ] [del.core.internal.ModelRepositoryImpl] - Loading model 'default.sitemap'
    10:51:04.413 [INFO ] [del.core.internal.ModelRepositoryImpl] - Loading model 'modbus.things'
    10:51:05.027 [INFO ] [thome.event.ItemChannelLinkAddedEvent] - Link 'LED2TXT-modbus:data:lemp:read:readtwo:number' has been added.
    10:51:05.033 [INFO ] [thome.event.ItemChannelLinkAddedEvent] - Link 'LED1-modbus:data:lemp:write:writeone:dimmer' has been added.
    10:51:05.039 [INFO ] [thome.event.ItemChannelLinkAddedEvent] - Link 'LED2-modbus:data:lemp:write:writetwo:dimmer' has been added.
    10:51:05.047 [INFO ] [thome.event.ItemChannelLinkAddedEvent] - Link 'LED1TXT-modbus:data:lemp:read:readone:number' has been added.
    10:51:05.236 [INFO ] [ome.event.ThingStatusInfoChangedEvent] - 'modbus:data:lemp:read:readone' changed from UNINITIALIZED to UNINITIALIZED (BRIDGE_UNINITIALIZED)
    10:51:05.269 [INFO ] [ome.event.ThingStatusInfoChangedEvent] - 'modbus:data:lemp:write:writeone' changed from UNINITIALIZED to UNINITIALIZED (BRIDGE_UNINITIALIZED)
    10:51:05.286 [INFO ] [ome.event.ThingStatusInfoChangedEvent] - 'modbus:serial:lemp' changed from UNINITIALIZED to INITIALIZING
    10:51:05.421 [INFO ] [ome.event.ThingStatusInfoChangedEvent] - 'modbus:serial:lemp' changed from INITIALIZING to ONLINE
    10:51:05.456 [INFO ] [ome.event.ThingStatusInfoChangedEvent] - 'modbus:poller:lemp:read' changed from UNINITIALIZED to INITIALIZING
    10:51:05.501 [INFO ] [ome.event.ThingStatusInfoChangedEvent] - 'modbus:poller:lemp:read' changed from INITIALIZING to ONLINE
    10:51:05.526 [INFO ] [ome.event.ThingStatusInfoChangedEvent] - 'modbus:poller:lemp:write' changed from UNINITIALIZED to INITIALIZING
    10:51:05.535 [INFO ] [ome.event.ThingStatusInfoChangedEvent] - 'modbus:poller:lemp:write' changed from INITIALIZING to ONLINE
    10:51:05.582 [INFO ] [ome.event.ThingStatusInfoChangedEvent] - 'modbus:data:lemp:read:readtwo' changed from UNINITIALIZED to INITIALIZING
    10:51:05.681 [INFO ] [ome.event.ThingStatusInfoChangedEvent] - 'modbus:data:lemp:read:readtwo' changed from INITIALIZING to ONLINE
    10:51:05.692 [INFO ] [ome.event.ThingStatusInfoChangedEvent] - 'modbus:data:lemp:write:writetwo' changed from UNINITIALIZED to INITIALIZING
    10:51:05.723 [INFO ] [ome.event.ThingStatusInfoChangedEvent] - 'modbus:data:lemp:write:writetwo' changed from INITIALIZING to OFFLINE (CONFIGURATION_ERROR)
    10:51:05.749 [INFO ] [ome.event.ThingStatusInfoChangedEvent] - 'modbus:data:lemp:write:writeone' changed from UNINITIALIZED (BRIDGE_UNINITIALIZED) to INITIALIZING
    10:51:05.752 [INFO ] [ome.event.ThingStatusInfoChangedEvent] - 'modbus:data:lemp:read:readone' changed from UNINITIALIZED (BRIDGE_UNINITIALIZED) to INITIALIZING
    10:51:05.762 [INFO ] [ome.event.ThingStatusInfoChangedEvent] - 'modbus:data:lemp:write:writeone' changed from INITIALIZING to OFFLINE (CONFIGURATION_ERROR)
    10:51:05.772 [INFO ] [ome.event.ThingStatusInfoChangedEvent] - 'modbus:data:lemp:read:readone' changed from INITIALIZING to ONLINE
    10:51:06.024 [INFO ] [smarthome.event.ItemStateChangedEvent] - LED2TXT changed from NULL to 0
    10:51:06.044 [INFO ] [smarthome.event.ItemStateChangedEvent] - LED1TXT changed from NULL to 0
    10:51:07.544 [INFO ] [i.dashboard.internal.DashboardService] - Started Dashboard at http://192.168.0.10:8080
    10:51:07.555 [INFO ] [i.dashboard.internal.DashboardService] - Started Dashboard at https://192.168.0.10:8443
    10:51:09.858 [INFO ] [marthome.ui.paper.internal.PaperUIApp] - Started Paper UI at /paperui
    10:51:10.212 [INFO ] [.ui.habmin.internal.servlet.HABminApp] - Started HABmin servlet at /habmin
    10:51:31.792 [INFO ] [smarthome.event.ItemCommandEvent     ] - Item 'LED1' received command 100
    10:51:39.825 [INFO ] [smarthome.event.ItemCommandEvent     ] - Item 'LED1' received command 80
    10:51:40.810 [INFO ] [smarthome.event.ItemCommandEvent     ] - Item 'LED1' received command 25
    10:51:41.489 [INFO ] [smarthome.event.ItemCommandEvent     ] - Item 'LED1' received command 50
    10:51:44.999 [INFO ] [smarthome.event.ItemCommandEvent     ] - Item 'LED1' received command 100

Okay, so your read Items are working.

Bridge poller write [ start=4, length=2, refresh=500, type="holding" ] {
           Thing data writeone [ writeStart="4", writeValueType="int16" ]
           Thing data writetwo [ writeStart="5", writeValueType="int16" ]
        }

You’ve chosen to make these write-only, but you have a read refresh specified in the poller. That makes no sense. I’m not sure it would give the configuration error you see, but I would set refresh=0 to disable read polls.

Because any data Thing can be configured to read and write from different registers, even different types, it does not “inherit” write register type from the poller.
You have to specify the write register type (holding, coil) as well as the data format (int16, float32 etc.)

Bridge poller write [ start=4, length=2, refresh=0, type="holding" ] {
           Thing data writeone [ writeStart="4", writeType="holding",  writeValueType="int16" ]
           Thing data writetwo [ writeStart="5", writeType="holding", writeValueType="int16" ]
        }
2 Likes