Hello,
Using your example with bits, I configure things, rules, items… but receiving an errors in executing rule. maybe you can take a look… i can’t find my mistake
modbus.things
Bridge modbus:tcp:id2 [ host=“192.168.10.82”, port=502, id=1, timeBetweenTransactionsMillis=100 ]
{
Bridge poller poolpoll [ start=16, length=33, refresh=1000, type=“holding” ]
{
Thing data reg40017 [ readStart=“16”, readValueType=“uint16”, writeStart=“16”, writeValueType=“uint16”, writeType=“holding”, writeMultipleEvenWithSingleRegisterOrCoil = “true” ]
Thing data bit_16_0 [ readStart=“16.0”, readValueType=“bit” ]
Thing data bit_16_1 [ readStart=“16.1”, readValueType=“bit” ]
Thing data bit_16_2 [ readStart=“16.2”, readValueType=“bit” ]
Thing data bit_16_3 [ readStart=“16.3”, readValueType=“bit” ]
Thing data bit_16_4 [ readStart=“16.4”, readValueType=“bit” ]
Thing data bit_16_5 [ readStart=“16.5”, readValueType=“bit” ]
Thing data bit_16_14 [ readStart=“16.14”, readValueType=“bit” ]
Thing data bit_16_15 [ readStart=“16.15”, readValueType=“bit” ]
}
}
modbus.items
Number reg40017 “reg40017 register [%d]” { channel=“modbus:data:id2:poolpoll:reg40017:number” }
Group reg40017_Bits
Switch reg40017_bit_16_0 “Enable Filtration [%s]” (reg40017_Bits) { channel=“modbus:data:id2:poolpoll:bit_16_0:switch” }
Switch reg40017_bit_16_1 “Manual Filter Backwash [%s]” (reg40017_Bits) { channel=“modbus:data:id2:poolpoll:bit_16_1:switch” }
Switch reg40017_bit_16_2 “Open Pool [%s]” (reg40017_Bits) { channel=“modbus:data:id2:poolpoll:bit_16_2:switch” }
Switch reg40017_bit_16_3 “Close Pool [%s]” (reg40017_Bits) { channel=“modbus:data:id2:poolpoll:bit_16_3:switch” }
Switch reg40017_bit_16_4 “Pool Light [%s]” (reg40017_Bits) { channel=“modbus:data:id2:poolpoll:bit_16_4:switch” }
Switch reg40017_bit_16_5 “Block Filling Up [%s]” (reg40017_Bits) { channel=“modbus:data:id2:poolpoll:bit_16_5:switch” }
Switch reg40017_bit_16_14 “Reset Alarms [%s]” (reg40017_Bits) { channel=“modbus:data:id2:poolpoll:bit_16_14:switch” }
Switch reg40017_bit_16_15 “Save Filter Backwash Timers [%s]” (reg40017_Bits) { channel=“modbus:data:id2:poolpoll:bit_16_15:switch” }
modbus.rules
import java.lang.Math // we need this for testBit
rule “update reg40017 register”
when
Member of reg40017_Bits received command
then
var BigInteger register = 0 // we need BigInteger type to use testBit
if ( reg40017.state != NULL && reg40017.state != UNDEF) { // avoid using invalid register image
register = (reg40017.state as DecimalType).toBigDecimal.toBigInteger // use existing image
}
switch triggeringItem.name { // act on switched Item name to change only one bit
case “reg40017_bit_16_0” : {
if (receivedCommand = ON) {
register = register.setBit(0)
} else if (receivedCommand = OFF) { // by testing both, we will ignore REFRESH commands
register = register.clearBit(0)
}
}
case “reg40017_bit_16_1” : {
if (receivedCommand = ON) {
register = register.setBit(1)
} else if (receivedCommand = OFF) {
register = register.clearBit(1)
}
}
case “reg40017_bit_16_2” : {
if (receivedCommand = ON) {
register = register.setBit(2)
} else if (receivedCommand = OFF) {
register = register.clearBit(2)
}
}
}
// at last, write to Modbus
reg40017.sendCommand(register)
end
errors in log when i try to on/off bit 0:
2019-09-19 20:41:38.757 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule ‘update reg40017 register’: An error occurred during the script execution: null
2019-09-19 20:41:38.763 [WARN ] [ernal.handler.ModbusDataThingHandler] - Thing modbus:data:id2:poolpoll:bit_16_0 ‘Modbus data’: not processing command OFF since writeStart is missing and transformation output is not a JSON
Ed