Hello!
I’m struggling with a problem that updating my Item via REST API works strange. Sometimes it updates item (and sends modbus write packet to device), sometimes it is ignored.
My setup is as follows:
- The device is ESP8266 with Modbus TCP library.
- I’m using OpenHAB 3.2.0
- Things config for device is as follows:
Bridge modbus:tcp:LivingRoomBigHeater [ host="192.168.0.33", port=15000, id=1 ] {
Bridge poller H[start = 0, length = 8, type = "holding", refresh = 500] {
Thing data LivingRoomBigHeater_Mode[readStart = "0", readValueType = "int16", writeStart="0", writeValueType="int16", writeType="holding"]
Thing data LivingRoomBigHeater_State[readStart = "1", readValueType = "int16"]
Thing data LivingRoomBigHeater_RelayT[readStart = "2", readValueType = "int16", readTransform="JS(divide100.js)"]
Thing data LivingRoomBigHeater_Overheat[readStart = "3", readValueType = "int16"]
Thing data LivingRoomBigHeater_OverrideState[readStart = "4", readValueType = "int16", writeStart="4", writeValueType="int16", writeType="holding"]
Thing data LivingRoomBigHeater_TargetT[readStart = "5", readValueType = "int16", readTransform="JS(divide100.js)", writeStart="5", writeValueType="int16", writeType="holding", writeTransform="JS(multiply100.js)"]
Thing data LivingRoomBigHeater_InternalT[readStart = "6", readValueType = "int16", readTransform="JS(divide100.js)"]
Thing data LivingRoomBigHeater_ExternalT[readStart = "7", readValueType = "int16", readTransform="JS(divide100.js)"]
}
}
Transforms (divide100 / multiply100) are simple JS functions which divide and multiply their numeric argument.
4. Items config is as follows:
Number LivingRoomBigHeater_Mode "LivingRoomBigHeater mode" <switch> {channel="modbus:data:LivingRoomBigHeater:H:LivingRoomBigHeater_Mode:number"}
Switch LivingRoomBigHeater_State "LivingRoomBigHeater state" <switch> {channel="modbus:data:LivingRoomBigHeater:H:LivingRoomBigHeater_State:switch"}
Number LivingRoomBigHeater_RelayT "LivingRoomBigHeater relay temperature [%.1f °C]" <temperature> {channel="modbus:data:LivingRoomBigHeater:H:LivingRoomBigHeater_RelayT:number"}
Number LivingRoomBigHeater_Overheat "LivingRoomBigHeater relay overheated" <switch> {channel="modbus:data:LivingRoomBigHeater:H:LivingRoomBigHeater_Overheat:number"}
Switch LivingRoomBigHeater_OverrideState "LivingRoomBigHeater override state" <switch> {channel="modbus:data:LivingRoomBigHeater:H:LivingRoomBigHeater_OverrideState:switch"}
Number LivingRoomBigHeater_TargetT "LivingRoomBigHeater desired temperature [%.1f °C]" <temperature> {channel="modbus:data:LivingRoomBigHeater:H:LivingRoomBigHeater_TargetT:number"}
Number LivingRoomBigHeater_InternalT "LivingRoomBigHeater internal temperature [%.1f °C]" <temperature> {channel="modbus:data:LivingRoomBigHeater:H:LivingRoomBigHeater_InternalT:number"}
Number LivingRoomBigHeater_ExternalT "LivingRoomBigHeater external temperature [%.1f °C]" <temperature> {channel="modbus:data:LivingRoomBigHeater:H:LivingRoomBigHeater_ExternalT:number"}
So, i’m trying to write item LivingRoomBigHeater_TargetT
(via Habpanel if that’s important). According to browser console logs, Habpanel dutifully sends POST request to OpenHAB every time i’m trying to change value. But very often the item is not updated in OpenHAB (and it seems that modbus write request is not generated. And sometimes it works as expected.
Why can this work like that? I’ve tried to think about some race conditions in the device, but it does not write to that modus registed, merely reads from it (so, register code could be only written to by modbus library in reaction to write requests).