Float values are 2 registers, not 4. A float value is composed of two 16 bit integer registers. Your modbus device has just spaced the float pairs out quite a bit with a lot of empty registers in between for some reason. For instance the first float value is register one and register two, but the next float value doesn’t start until register 7.
The next float value, current, doesn’t start until register 7, and it’s a float value, so it takes up register 7 and register 8. these are 1-offset based numbers in the manual, so when putting them into openhab they would be one number less.
I’m not sure where you’re seeing that the 5th register is the start of the current. On page 5 of the document you linked it very clearly shows the addresses of each float value, and the registers in between are empty. the “3” in front of each address register can be ignored as it is just specifying the register type (holding, input, etc). this is automatically added over the wire by the modbus protocol and you don’t specify it in openhab, just the address number after it (minus one)
On that page it clearly shows voltage starts at register 1. in 0-based offset, that’s 0, which is what you have, which is why your voltage item is working.
Next is current, which is clearly shown as beginning at register 7 - so in openhab that would be 6. If you copy the item and open cfg text I posted you’ll see it will work as expected.
To read all the values you need, you need to set the length so it reads to the very last register you require, taking into account the two registers making up the float values, and the offset difference.
So since you just need the first three right now with the last register existing at 13 and 14, you would specify an offset of 14. If you want to read all the way down to frequency for instance, which starts at 71, you would need a length of 72.
Because of the way your device has a bunch of empty registers between each float value though that becomes very inefficient as it will be reading mostly empty registers. Another way to read multiple registers that are spaced out is defining multiple slaves in the config, instead of one with a huge read length. For instance to read the same three registers like you are now:
# read voltage registers
modbus:serial.sdm120V1.connection=/dev/ttyUSB0:2400:8:none:1:rtu
modbus:serial.sdm120V1.type=input
modbus:serial.sdm120V1.valuetype=float32
modbus:serial.sdm120V1.length=2
modbus:serial.sdm120V1.start=0
modbus:serial.sdm120V1.id=1
# read current registers
modbus:serial.sdm120V2.connection=/dev/ttyUSB0:2400:8:none:1:rtu
modbus:serial.sdm120V2.type=input
modbus:serial.sdm120V2.valuetype=float32
modbus:serial.sdm120V2.length=2
modbus:serial.sdm120V2.start=6
modbus:serial.sdm120V2.id=1
# read power registers
modbus:serial.sdm120V3.connection=/dev/ttyUSB0:2400:8:none:1:rtu
modbus:serial.sdm120V3.type=input
modbus:serial.sdm120V3.valuetype=float32
modbus:serial.sdm120V3.length=2
modbus:serial.sdm120V3.start=12
modbus:serial.sdm120V3.id=1
That way openhab is only reading the registers you need, and not all the empty registers in between. you just need to specify the start to be the register you want to read, and the length set to 2 so you get both registers of the float value. You also need to give each instance a unique slave name (I just added V1 V2 V3 for instance)
Then in your items file, use the unique slave names, and make the offset for each 0 since we already specified the offset with the “start” value in the cfg
Number sdm120Voltage "Voltage [%.1f]" (sdm120) {modbus="sdm120V1:0"}
Number sdm120Current "Current [%.1f]" (sdm120) {modbus="sdm120V2:0"}
Number sdm120Power "Power [%.1f]" (sdm120) {modbus="sdm120V3:0"}
WIth it done that way, you’re not reading 5 empty registers in between each actual float register pair