XPATH Transformation - Casting "0" to integer returns null

Hi,

I’m working on a rule to get information out of the Belgian rail company.
This works really fine (I don’t know how to develop a Binding, otherwise that would really make sense…

I’m a little bit stuck there, the casting of a “0” (zero) from string format to Number prevent me to go further.
I’m getting the delay of a train in seconds, so I’d like to divide this number by 60 in order to round the number and print a readable number to my family.

I’ve tried a lot, I’m a little bit lost there, could you please help ?

Here’s where I’am :slight_smile:

Rule :

var Number delaySecondInNumber = transform("XPATH", "/vehicleinformation/stops/stop[6]/departureDelay", SNCBReply)
var String delaySecondInString = transform("XPATH", "/vehicleinformation/stops/stop[6]/departureDelay", SNCBReply)
logInfo("test", "In Number : " + delaySecondInNumber)
logInfo("test", "In String : " + delaySecondInString)
var Number delayMinutes = delaySecondInNumber/60
logIngo("test", "delayMinutes : " + delayMinutes)

and then the log :

2019-11-25 20:46:24.686 [INFO ] [.eclipse.smarthome.model.script.test] - In Number : 0
2019-11-25 20:46:24.687 [INFO ] [.eclipse.smarthome.model.script.test] - In String : 0
2019-11-25 20:46:24.688 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'train': An error occurred during the script execution: Could not invoke method: org.eclipse.smarthome.model.script.lib.NumberExtensions.operator_divide(java.lang.Number,java.lang.Number) on instance: null .engine.RuleEngineImpl] - Rule 'train': An error occurred during the script execution: Could not invoke method: org.eclipse.smarthome.model.script.lib.NumberExtensions.operator_divide(java.lang.Number,java.lang.Number) on instance: null

Could you please help ?

Thank,

Thierry.

Please use code fences. How to use code fences

I don’t know if XPATH would provide a direct number parsing. Let’s try it that way:

rule "my rule"
when
    Item SNCBReply changed
then
    var String delaySecondInString = transform("XPATH", "/vehicleinformation/stops/stop[6]/departureDelay", SNCBReply.state.toString)
    var Number delaySecondInNumber = Integer::parseInt(delaySecondInString)
    logInfo("test", "In Number : {}",delaySecondInNumber) 
    var Number delayMinutes = delaySecondInNumber/60
    logInfo("test", "delayMinutes : {}",delayMinutes)
end

adapted that way :

var String delaySecondInString = transform("XPATH", "/vehicleinformation/stops/stop[6]/departureDelay", SNCBReply)
logInfo("test", "In String : {}", delaySecondInString)
var Number delaySecondInNumber = Integer::parseInt(delaySecondInString)
logInfo("test", "In Number : {}", delaySecondInNumber)
var Number delayMinutes= delaySecondInNumber/60
logInfo("test", "In Minutes : {} ",delayMinutes)

result in log :

2019-11-25 21:11:51.742 [INFO ] [.eclipse.smarthome.model.script.test] - In String : 0
2019-11-25 21:11:51.744 [INFO ] [.eclipse.smarthome.model.script.test] - In Number : 0
2019-11-25 21:11:51.746 [INFO ] [.eclipse.smarthome.model.script.test] - In Minutes : 0E-8

Please use code fences!

So SNCBReply is in fact a var, not an Item? But apart from that, the result looks promising, although it’s strange to get a non zero result when dividing zero by an integer.
At least you get no error anymore.

Indeed, but it doesn’t arrange me, I’d like to play a string on my Alexa (voice TTS) when my wife is in the bathroom, preparing herself. So 0-E8 is not that suitable… I could test, indeed, but it’s really strange, as you said, that the result is as such…

Sorry for code fences, I tried to use them, but apparently the wrong ones :slight_smile:

So take a short look at the link :wink:

As you want full minutes, you would use an intValue anyway.

    var String delaySecondInString = transform("XPATH", "/vehicleinformation/stops/stop[6]/departureDelay", SNCBReply)
    var Number delaySecondInNumber = Integer::parseInt(delaySecondInString)
    logInfo("test", "In Number : {}",delaySecondInNumber) 
    var Number delayMinutes = (delaySecondInNumber/60).intValue
    logInfo("test", "delayMinutes : {}",delayMinutes)