Found a way to achive my objective but it appears awfully complicated:
Things file (one modbus data item for each of the five uint16 registers containing the values for the 5 serial number characters):
Bridge modbus:serial:SPH10000 "Modbus SPH10000" [ port="/dev/ttyUSB0", id=1, baud=9600, stopBits="1.0", parity="none", dataBits=8, encoding="rtu", timeBetweenTransactionsMillis=350 ]
{
Bridge poller growattSerial "Seriennummer" [start=23, length=5, type="holding", refresh=6000,maxTries=2] //start=608, length=1, refresh=12000, type="holding", maxTries=2 ]
{
Thing data growattSerial5 "Seriennummer5" [ readStart="23", readValueType="uint16"]
Thing data growattSerial4 "Seriennummer4" [ readStart="24", readValueType="uint16"]
Thing data growattSerial3 "Seriennummer3" [ readStart="25", readValueType="uint16"]
Thing data growattSerial2 "Seriennummer2" [ readStart="26", readValueType="uint16"]
Thing data growattSerial1 "Seriennummer1" [ readStart="27", readValueType="uint16"]
}
}
Items file (one item for each uint16 registers plus a string item which is supposed to contain the serial number in readable text):
Group gGrowattInverterSerials "Seriennummern-Items"
Number growattSerial1 "Serienummer 1. Stelle" (gGrowattInverter, gGrowattInverterSerials) {channel="modbus:data:SPH10000:growattSerial:growattSerial1:number"}
Number growattSerial2 "Serienummer 2. Stelle" (gGrowattInverter, gGrowattInverterSerials) {channel="modbus:data:SPH10000:growattSerial:growattSerial4:number"}
Number growattSerial3 "Serienummer 3. Stelle" (gGrowattInverter, gGrowattInverterSerials) {channel="modbus:data:SPH10000:growattSerial:growattSerial3:number"}
Number growattSerial4 "Serienummer 4. Stelle" (gGrowattInverter, gGrowattInverterSerials) {channel="modbus:data:SPH10000:growattSerial:growattSerial2:number"}
Number growattSerial5 "Serienummer 5. Stelle" (gGrowattInverter, gGrowattInverterSerials) {channel="modbus:data:SPH10000:growattSerial:growattSerial5:number"}
String growattSerialtxt "Seriennummer" (gGrowattInverter)
and a complicated(?) rule to “compute” and concatenate the characters from the high and low bytes of each of the 5 uint16 items:
rule ConcatGrowattSerial
when
Member of gGrowattInverterSerials changed
//or Time cron "0 0/1* * * * ? *"
then
growattSerialtxt.postUpdate( (String::valueOf(Character::toChars( Math::round( (growattSerial5.state as Number).doubleValue / 256).intValue) ) )
+ (String::valueOf(Character::toChars( ( (growattSerial5.state as DecimalType).intValue() % 256) ) ) )
+ (String::valueOf(Character::toChars( Math::round( (growattSerial2.state as Number).doubleValue / 256).intValue) ) )
+ (String::valueOf(Character::toChars( ( (growattSerial2.state as DecimalType).intValue() % 256) ) ) )
+ (String::valueOf(Character::toChars( Math::round( (growattSerial3.state as Number).doubleValue / 256).intValue) ) )
+ (String::valueOf(Character::toChars( ( (growattSerial3.state as DecimalType).intValue() % 256) ) ) )
+ (String::valueOf(Character::toChars( Math::round( (growattSerial4.state as Number).doubleValue / 256).intValue) ) )
+ (String::valueOf(Character::toChars( ( (growattSerial4.state as DecimalType).intValue() % 256) ) ) )
+ (String::valueOf(Character::toChars( Math::round( (growattSerial1.state as Number).doubleValue / 256).intValue) ) )
+ (String::valueOf(Character::toChars( ( (growattSerial1.state as DecimalType).intValue() % 256) ) ) )
)
end
Is that the way it should be or is there an easier way of getting the serial number from the five uint16 modbus registers?