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
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
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
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
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
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)