Dishwasher price calculation automation

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