(Solved) Modbus 2 on startup not writing

  • Platform information:
    • Hardware: Raspberry Pi 3+
    • OS:openhabian
    • openHAB version: snapshot 2.4.0
  • Issue of the topic: Can’t get modbus 2 to write (or to poll write) on startup
    Hello to everyone. I have a little test setup working like i want.
    The slave is dum and when it loses connection for mor than 10 seconds, every thing falls to zero.
    If i change a value in the sitemap it keeps polling and keeps the system “alive” just like I want.
    My problem is when i restart. I see the values in place in my items (persistence is ok), but polling for the write holding does not happen.
    I see polling works because the read input is in place.
    What am I missing ?
    Thanks to all for reading

My Things:

Bridge modbus:serial:interel [ port="/dev/ttyUSB0", baud=19200, stopBits="1.0", parity="none", dataBits=8, encoding="rtu" ] {
    
    Bridge poller WriteRegisters [ start=0, length=8, refresh=100, type="holding" ] {
        // write from index 0 to 6
        Thing data Interel_OutputRegister_000 [ readStart="0", readValueType="int16", writeStart="0", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_001 [ readStart="1", readValueType="int16", writeStart="1", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_002 [ readStart="2", readValueType="int16", writeStart="2", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_003 [ writeStart="3", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_004 [ writeStart="4", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_005 [ writeStart="5", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_006 [ readStart="6", readValueType="int16", writeStart="6", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_007 [ readStart="7", readValueType="int16", writeStart="7", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
    }
    Bridge poller InputRegisters [ start=0, length=8, refresh=1000, type="input" ] {
        // write from index 0 to 6
        Thing data Interel_InputRegister_007 [ readStart="7.1", readValueType="uint8" ]
    }
}

My items:

// Persistence Groups
Group gHOLDING_REGS // per Items MODBUS scritto verso registri
Group gINPUT_REGS // per Items MODBUS scritto verso registri


Number Interel_OutputRegister_000   "Holding index 0 scaled [%.0f]" (gHOLDING_REGS)  { channel="modbus:data:interel:WriteRegisters:Interel_OutputRegister_000:number" }
Number Interel_OutputRegister_001   "Holding index 1 scaled [%.0f]" (gHOLDING_REGS)  { channel="modbus:data:interel:WriteRegisters:Interel_OutputRegister_001:number" }
Number Interel_OutputRegister_002   "Holding index 2 scaled [%.0f]" (gHOLDING_REGS)  { channel="modbus:data:interel:WriteRegisters:Interel_OutputRegister_002:number" }
Number Interel_OutputRegister_003   "Holding index 3 scaled [%.0f]" (gHOLDING_REGS)  { channel="modbus:data:interel:WriteRegisters:Interel_OutputRegister_003:number" }
Number Interel_OutputRegister_004   "Holding index 4 scaled [%.0f]" (gHOLDING_REGS)  { channel="modbus:data:interel:WriteRegisters:Interel_OutputRegister_004:number" }
Number Interel_OutputRegister_005   "Holding index 5 scaled [%.0f]" (gHOLDING_REGS)  { channel="modbus:data:interel:WriteRegisters:Interel_OutputRegister_005:number" }
Number Interel_OutputRegister_006   "Holding index 6 scaled [%.0f]" (gHOLDING_REGS)  { channel="modbus:data:interel:WriteRegisters:Interel_OutputRegister_006:number" }
Number Interel_OutputRegister_007   "Holding index 7 scaled [%.0f]" (gHOLDING_REGS)  { channel="modbus:data:interel:WriteRegisters:Interel_OutputRegister_007:number" }


Number  Interel_InputRegister_007   "Temperature_007 [%.0f °C]"      (gINPUT_REGS)   { channel="modbus:data:interel:InputRegisters:Interel_InputRegister_007:number" }

My persist:

// persistence strategies have a name and a definition and are referred to in the "Items" section
Strategies {
	// for rrd charts, we need a cron strategy
	//everyMinute : "0 * * * * ?"
	default = everyUpdate

}

Items {
	//* : strategy = everyChange, restoreOnStartup
	gHOLDING_REGS*, gINPUT_REGS* : strategy = everyChange , restoreOnStartup
	
}

My sitemap:

sitemap default label="House"

{
	Frame {

			Text item=Interel_InputRegister_007
		
	}

	    Frame {
        Text item=Interel_OutputRegister_000
        Setpoint item=Interel_OutputRegister_000 minValue=0 maxValue=255 step=1
		Text item=Interel_OutputRegister_001
        Setpoint item=Interel_OutputRegister_001 minValue=0 maxValue=255 step=1
		Text item=Interel_OutputRegister_002
        Setpoint item=Interel_OutputRegister_002 minValue=0 maxValue=255 step=1
		Text item=Interel_OutputRegister_003
        Setpoint item=Interel_OutputRegister_003 minValue=0 maxValue=255 step=1
		Text item=Interel_OutputRegister_004
        Setpoint item=Interel_OutputRegister_004 minValue=0 maxValue=255 step=1
		Text item=Interel_OutputRegister_005
        Setpoint item=Interel_OutputRegister_005 minValue=0 maxValue=255 step=1
		Text item=Interel_OutputRegister_006
        Setpoint item=Interel_OutputRegister_006 minValue=0 maxValue=255 step=1
		Text item=Interel_OutputRegister_007
        Setpoint item=Interel_OutputRegister_007 minValue=0 maxValue=255 step=1

    }


}

Time changes only on manual change of value (not on refresh interval):


DateTime Output_003_LastOKWrite  "Output register 003 last read [%1$tA, %1$td.%1$tm.%1$tY %1$tH:%1$tM:%1$tS]"  { channel="modbus:data:interel:WriteRegisters:Interel_OutputRegister_003:lastWriteSuccess" }

The Modbus binding only writes when an Item receives a command (like most bindings).
Modbus polling is only about reading.

I think for your case you could trigger a rule from System started, that sends a command to each important register, using it’s own (restored) state.

Reading again, I suppose you should have an Item that detects the slave coming online, and use that to trigger the same rule as well.

This should do. I will give it a try.
Thank you rossko57

Wow. Now working like a charm…