I have a problem when using [a string].split(“xx”).get(y) where y is a Number item
.item file
Number aNumberItem
String aStringItem
startup.rules
// rule running when
rule
when
System started
then
aNumberItem.sendCommand(2)
aStringItem.sendCommand("zeroed_first_second_third")
end
anotherRuleFile.rules
rule aButtomRule
when
aButtomItem received update
then
logInfo("debugger output", "value: " + aStringItem.state.toString.split("_").get(aNumberItem.state))
end
from log
[ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'aButtomRule-1' failed: Could not invoke method: org.eclipse.xtext.xbase.lib.IntegerExtensions.operator_plus(int,byte) on instance: null in aButtomRule
Why can’t I use a Number item to get my segment of the string? and how do I solve this? I have tried multiple ways of trying to cast it as a string, or a string to a Number or and integer or to an integer, nothing seems to work -.-
Because you are working with Java Object under the covers. The result of the call to split() returns a Java List and get() on a List requires a primitive int.
The state of a Number Item is either going to be a DecimalType or it’s going to be a QuantityType. Let’s assume it’s a DecimalType. This Object (if it’s an Object, it’s not a primitive) can be any representable number including floats and integers. Obviously you can’t get the 2.567th element of a List, that makes no sense.
So you have a function, get() which requires an int and an Object that can represent any numerical value. You can’t just cast it, you have to transform it. Luckily in this case that’s easy. DecimalType inherits from java.lang.Number which happens to have an intValue() method which returns the Number as a primitive int.
Unfortunately Rules DSL sometimes fails to recognize the proper types of Item states. If aNumberItem.state.intValue() doesn’t work, you will have to cast the state of the Item. But you can cast it to Number: (aNumberItem.state as Number).intValue().
It get’s more complicated if the number has units but I don’t think that will be the case here.