Here’s the fixed version with correct handling of Number:Time
without assuming minutes as internal unit (my bad code was broken by 4.0):
rule "Tumble dryer final price"
when
Item TumbleDryer_RawState changed to 7 // End
then
val elapsedTime = (TumbleDryer_ElapsedTime.state as QuantityType<Duration>).toUnit("s").intValue
val Instant endTime = now.toInstant()
val Instant startTime = endTime.minusSeconds(elapsedTime)
logInfo("Tumble Dryer", "Calculating price for " + startTime.toString + " - " + endTime.toString)
val actions = getActions("energidataservice", "energidataservice:service:energidataservice");
var price = Float::parseFloat(transform("VAT", "DK", actions.calculatePrice(startTime, endTime, 667 | W).toString))
sendPushMessage.apply("Tumble dryer", "Price for run program: " + String.format("%.2f", price) + " kr.")
end
And here’s the JavaScript equivalent:
rules.when()
.item("TumbleDryer_RawState").changed().to(7) // End
.then(event =>
{
var elapsed = time.Duration.ofSeconds(Quantity(items.TumbleDryer_ElapsedTime.state).toUnit("s").int);
var endTime = time.Instant.now();
var edsActions = actions.get("energidataservice", "energidataservice:service:energidataservice");
var rawPrice = edsActions.calculatePrice(endTime.minus(elapsed), endTime, Quantity("667 W"));
var price = parseFloat(actions.Transformation.transform("VAT", "DK", rawPrice.toString())).toFixed(2).replace('.', ',');
notification.send("Tumble dryer", "Price for run program: " + price + " kr.");
})
.build("Tumble dryer finished", "Calculate tumble dryer final price");