JS script uses old Item value

I’ve got this rule:

version: 1
rules:
  haarden-onverwachte-doving:
    label: Haarden - Onverwachte afkoeling
    description: Soms gaan de haarden onverwacht uit. Dit kan misschien opgemerkt worden middels de temperatuurssensors.
    triggers:
      - id: "1"
        config:
          itemName: haard_eetkamer_temperatuur
        type: ItemChanged
      - id: "2"
        config:
          itemName: haard_salon_temperatuur
        type: ItemChanged
    actions:
      - id: "3"
        config:
          type: JavaScript
          script: [see below]
        type: Script
const eventitemnaam = event.itemName;
const nieuwenumericstatusitem = items.getItem(eventitemnaam).numericState;
const oudenumericstatusitem = items.getItem(eventitemnaam).previousNumericState;

function main() {
  if (nieuwenumericstatusitem < oudenumericstatusitem && nieuwenumericstatusitem > 40) {
    const statusitemsuffix = "_gewenste_status";
    const haardprefix = eventitemnaam.split("_temperatuur")[0];
    const haardstatusitemstring = haardprefix + statusitemsuffix;
    const haardstatusitem = items.getItem(haardstatusitemstring);
    const haardstatus = haardstatusitem.boolState;
    if (haardstatus) {
      const melding = haardprefix + " is aan het afkoelen, maar " + haardstatusitemstring + " = " + haardstatus;
      rules.runRule("melding_gsm_DBE", { 'gsm': true, 'melding': melding });
      console.log(melding);
    }
  }
}

main();

Now see this chain of logging events:
events.log:

2026-11-07 14:46:52.484 [INFO ] [openhab.event.ItemStateChangedEvent  - 429       ] - Item 'haard_eetkamer_gewenste_status' changed from OFF to ON (source: org.openhab.core.autoupdate)
[...]
2026-11-07 14:47:35.515 [INFO ] [openhab.event.ItemStateChangedEvent  - 429       ] - Item 'haard_eetkamer_temperatuur' changed from 91.25 °C to 87 °C (source: org.openhab.core.thing$esphome:device:haard-eetkamer:temperatuur)

openhab.log:

2026-11-07 14:47:35.520 [INFO ] [ting.rule.haarden-onverwachte-doving - 41765     ] - haard_eetkamer is aan het afkoelen, maar haard_eetkamer_gewenste_status = true

Why does the script use a value of haard_eetkamer_gewenste_status that’s already been changed?

use event.state (or however it is done in js). Don’t get it from the item itself, because it may not have been updated when your event is triggered.

I wanted to do that, but then I get a string like 87 °C. It doesn’t look like there’s something like event.numericNewState and event.numericOldState…
Edit: it looks like parseFloat(event.newState); and parseFloat(event.oldState); will work.

But I think the problem is not that (nieuwenumericstatusitem < oudenumericstatusitem && nieuwenumericstatusitem > 40) was evaluated as true, but that (haardstatus) was. And that Item had received a new state 43 seconds before this rule was triggered.