[gelöst] Temperaturvergleich mit item state vs item numeric.state

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
oliverbaush
Beiträge: 23
Registriert: 4. Jan 2022 23:01
Answers: 0
Wohnort: Aschaffenburg

[gelöst] Temperaturvergleich mit item state vs item numeric.state

Beitrag von oliverbaush »

Moin zusammen,
mir ist aufgefallen, dass eine Regel nicht wie gewollt funktioniert. Ich habe zwei Temperaturen von unterschiedlichen Quellen, die in zwei verschiedenen Regeln verglichen werden. In ersten Fall funktioniert das nur mit .state im zweiten Fall nur mit .numericState. Mir ist an der Stelle nicht klar wo der Unterschied liegt. Beide Items sind vom Typ Number mit der Einheit °C .

Fall 1 liefert ein getItem folgendes:

Code: Alles auswählen

{
  "link": "https://openhab.athome.xx:8443/rest/items/Kuhltruhe_Temperatur__Temperatur",
  "state": "-20.44 °C",
  "stateDescription": {
    "pattern": "%.2f %unit%",
    "readOnly": true,
    "options": []
  },
  "unitSymbol": "°C",
  "metadata": {
    "semantics": {
      "value": "Point",
      "config": {
        "isPointOf": "Kuhltruhe_Temperatur_"
      }
    }
  },
  "editable": true,
  "type": "Number:Temperature",
  "name": "Kuhltruhe_Temperatur__Temperatur",
  "label": "Temperatur",
  "category": "Temperature",
  "tags": [
    "Point"
  ],
  "groupNames": [
    "Kuhltruhe_Temperatur_"
  ]
}
Die Rule wird bei der Variable tempist nur ein ".state" benötigt. (Ein numericState liefert als Wert eine "0" zurück)

Code: Alles auswählen

var logger  = Java.type('org.slf4j.LoggerFactory').getLogger('org.openhab.rule.' + ctx.ruleUID);
var telegramAction = actions.get("telegram","telegram:telegramBot:076f70b110");
var tempist = itemRegistry.getItem('Kuhltruhe_Temperatur__Temperatur').state;

//logger.info("Im Gefrierschrank sind es " + tempist );
if (tempist > -18) {
  telegramAction.sendTelegram("Achtung! Im Gefrierschrank sind es " + tempist );  
  logger.info("Warnung Gefrierschrank an Telegram Bot geschickt. Temperatur: " + tempist);
}
Fall 2 liefer abgesehen vom Pattern ein augenscheinlich gleiches Ergebnis, beides sind floats mit Einheit

Code: Alles auswählen

{
  "link": "https://openhab.athome.xx:8443/rest/items/Wetter_12h_MinimaleTemperatur",
  "state": "7.54 °C",
  "stateDescription": {
    "pattern": "%.1f %unit%",
    "readOnly": true,
    "options": []
  },
  "unitSymbol": "°C",
  "metadata": {
    "semantics": {
      "value": "Point",
      "config": {
        "hasLocation": "OpenWeatherMap"
      }
    }
  },
  "editable": true,
  "type": "Number:Temperature",
  "name": "Wetter_12h_MinimaleTemperatur",
  "label": "Minimale Temperatur 12h",
  "category": "Temperature",
  "tags": [
    "Point"
  ],
  "groupNames": [
    "OpenWeatherMap"
  ]
}
Die Regel dazu , hier benötigt die Variable temp12hMin ein .numericState

Code: Alles auswählen

var logger  = Java.type('org.slf4j.LoggerFactory').getLogger('org.openhab.rule.' + ctx.ruleUID);
var things = Java.type('org.openhab.core.model.script.actions.Things');

var temp12hMin = items.getItem('Wetter_12h_MinimaleTemperatur').numericState ; //ohne numericState klappte der Vergleich nicht
var offset = 0;

if (temp12hMin < 0 ) {
  offset = 1;
}
if (temp12hMin > 8) {
  offset = -1;
}

items.getItem('gThermostatOffset').sendCommand(offset);
logger.info("Temp 12h min: " + temp12hMin + " Offset: " + offset );
Der State ist doch in beiden Fällen ein String mit einer Einheit. Warum muss er in einem Fall als numerischen Wert interpretiert werden und im anderen nicht?
Zuletzt geändert von oliverbaush am 9. Mär 2024 17:25, insgesamt 1-mal geändert.
openHAB4.1.2, installiert unter openhabian

Harka
Beiträge: 308
Registriert: 30. Apr 2021 13:13
Answers: 15

Re: Temperaturvergleich mit item state vs item numeric.state

Beitrag von Harka »

Moin,
du setzt 2 verschiedene Javascript-Versionen ein.
itemRegistry.getItem stammt vom alten Nashorn (ECMAScript 5.1). Da gab es, meiner Erinnerung nach, noch kein numericState. Dies kam erst mit GraalJS (ECMAScript 2022+/ECMAScript 262 Edition 11). Da GraalJS weniger tolerant bei fehlerhaften Typen (String/Number) ist, funktioniert der Vergleich dort nicht mehr.

Benutzeravatar
peter-pan
Beiträge: 2573
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: Temperaturvergleich mit item state vs item numeric.state

Beitrag von peter-pan »

Ich bin zwar nicht so mit JS-Scripting vertraut, aber könnte es evtl. an den Item-Zugriffsmethoden liegen ?

Zugriff 1:
oliverbaush hat geschrieben: 9. Mär 2024 14:13 var tempist = itemRegistry.getItem('Kuhltruhe_Temperatur__Temperatur').state;
Zugriff 2:
oliverbaush hat geschrieben: 9. Mär 2024 14:13 var temp12hMin = items.getItem('Wetter_12h_MinimaleTemperatur').numericState ; //ohne numericState klappte der Vergleich nicht
... itemRegistry.... vs. items.... ?
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

oliverbaush
Beiträge: 23
Registriert: 4. Jan 2022 23:01
Answers: 0
Wohnort: Aschaffenburg

Re: Temperaturvergleich mit item state vs item numeric.state

Beitrag von oliverbaush »

Moin Harka,
Harka hat geschrieben: 9. Mär 2024 15:13 du setzt 2 verschiedene Javascript-Versionen ein.
itemRegistry.getItem stammt vom alten Nashorn (ECMAScript 5.1). Da gab es, meiner Erinnerung nach, noch kein numericState. Dies kam erst mit GraalJS (ECMAScript 2022+/ECMAScript 262 Edition 11). Da GraalJS weniger tolerant bei fehlerhaften Typen (String/Number) ist, funktioniert der Vergleich dort nicht mehr.
:roll: , das ist richtig. Hatte angefangen die Rules umzuschreiben und mittendrin kamen andere ganz tolle Ideen. Das ist definitiv noch eine alte ...

Hab den Fall 1 umgeschrieben auf ecma 11 und siehe da: der Vergleich klappt nur noch mit numericState. Works as designed. Danke für die Hilfestellung
openHAB4.1.2, installiert unter openhabian

Benutzeravatar
udo1toni
Beiträge: 13986
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: [gelöst] Temperaturvergleich mit item state vs item numeric.state

Beitrag von udo1toni »

Und um noch eins draufzusetzen, auch numericState ist nur die zweite Wahl ;) denn es handelt sich um ein Item mit QuantityType Status,, dafür gibt es eine eigene Funktion, mit der man dann auch die Einheit mit berücksichtigen kann :)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten