Seite 1 von 2

JSScripting ECMA Rev.11

Verfasst: 5. Jun 2023 14:47
von kaiserdom
Hallo zusammen!

Ich setze mein openHAB-System neu auf und benutze die Gelegenheit, eine neue Script Sprache zu verwenden.
Bis jetzt habe ich JSScripting ECMA Rev. 5.1 verwendet, das aber angeblich bald ausläuft, deswegen also der Umstieg auf Rev. 11. Und da beginnen die Schwierigkeiten.
Einfaches Beispiel: Die (arithmetische) Differenz zweier Items soll einem dritten Item zugewiesen werden.

Unter JS Rev. 5.1 läuft folgendes Script einwandfrei:

Code: Alles auswählen

item1 = items['TempKollektor'];
item2 = items['TempPool'];
diff = item1 - item2;
events.postUpdate('TempDiff', diff);
Das entsprechende Script unter JS Rev. 11:

Code: Alles auswählen

item1 = items.getItem("TempKollektor");
item2 = items.getItem("TempPool");
diff = item1 - item2;
items.getItem("TempDiff").postUpdate(diff);
bringt zunächst eine Warnung im Log: State 'NaN' cannot be parsed for item 'TempDiff'
und dann eine ellenlange Fehlermeldung: Failed to execute script

Was ist hier los? Was muss ich ändern?
Kann mir bitte jemand helfen!

mfg kaiserdom

Re: JSScripting ECMA Rev.11

Verfasst: 5. Jun 2023 19:32
von Harka
Hi,
versuch es mal mit

Code: Alles auswählen

item1 = items.getItem("TempKollektor").state;
PS: ab OH 4 geht es auch wieder kürzer

Code: Alles auswählen

item1 = items.TempKollektor.state;

Re: JSScripting ECMA Rev.11

Verfasst: 5. Jun 2023 23:53
von kaiserdom
Danke Harka,

aber

Code: Alles auswählen

item1 = items.getItem("TempKollektor").state;
item2 = items.getItem("TempPool").state;
diff = item1 - item2;
items.getItem("TempDiff").postUpdate(diff);
bringt dieselbe Fehlermeldung: State 'NaN' cannot be parsed for item 'TempDiff'

OH4 werde ich probieren, muss ich erst einrichten.

Gruß, kaiserdom

Re: JSScripting ECMA Rev.11

Verfasst: 6. Jun 2023 10:07
von udo1toni
Kannst Du mal die komplette Rule zeigen? denn in dem Schnipsel wird das Status gar nicht abgefragt, warum also beschwert sich openHAB?

Re: JSScripting ECMA Rev.11

Verfasst: 6. Jun 2023 11:16
von kaiserdom
Ich hab genau diese 4 Zeilen in ein Script gepackt und gestartet, darauf komm die Fehlermelung und das Item Tempdiff wird nicht geändert.

Code: Alles auswählen

item1 = items.getItem("TempKollektor").state;
item2 = items.getItem("TempPool").state;
diff = item1 - item2;
items.getItem("TempDiff").postUpdate(diff);
Die Variable diff ist offenbar nicht numerisch
Das Ganze läuft letztlich auf die Frage hinaus: Wie bekommt man den Zahlenwert eines Items?
Ich hab alles probiert: .state, .rawState, .numericState, .quantityState, etc. - nichts!

Re: JSScripting ECMA Rev.11

Verfasst: 6. Jun 2023 13:44
von Harka
Habe gerade nur das Handy hier aber parse-Befehl bzw. mit 1 multiplizieren sollte helfen.
Ohne .state kommt immer nur ein Objekt zurück. Du kannst Dir auch mit glaube console.log('Titel', variable) die Zwischenwerte anzeigen lassen.

Re: JSScripting ECMA Rev.11

Verfasst: 6. Jun 2023 14:18
von kaiserdom
ich lasse mir die (Zwischen)ergebnisse per logger.info() anzeigen, also z.B.

Code: Alles auswählen

logger.info(items.getItem("TempKollektor").state);
liefert: "29.4 °C", ist OK

Code: Alles auswählen

logger.info(typeof items.getItem("TempKollektor").state);
liefert:" string", ist auch OK
aber bitte wie bekomme ich den Zahlenwert des Items TempKollektor für weitere numerische Operationen?

Re: JSScripting ECMA Rev.11

Verfasst: 6. Jun 2023 16:29
von udo1toni
Das ist aber eigentlich kein vollständiges Script...

Re: JSScripting ECMA Rev.11

Verfasst: 6. Jun 2023 16:48
von kaiserdom
Das ist aber eigentlich kein vollständiges Script...
Wenn ich obige Code-Zeilen im UI unter Scripts eingebe, und dann: Run now <Ctrl>-R - wieso ist das kein Skript?
Mich interessiert ja das Ergebnis bzw. allfällige Fehlermeldungen - und das kommt ja!

Re: JSScripting ECMA Rev.11

Verfasst: 6. Jun 2023 17:14
von Harka
ist unter OH 3.4 noch etwas umständlich

Code: Alles auswählen

item1 = parseFloat(items.getItem('OneCallAPIweatherandforecast_ForecastTomorrow_Maxtemperature').state);
console.log('item1 = ',item1);
item2 = parseFloat(items.getItem('OneCallAPIweatherandforecast_ForecastTomorrow_Mintemperature').state);
console.log('item2 = ',item2);
diff = item1 - item2;
console.log(diff);
items.getItem("Test").postUpdate(diff);
.numericState und .quantityState kommen erst in OH 4
Ich selbst klicke mir ja alles mit Blockly zusammen und bisher nutze ich dort für Messwerte grundsätzlich die Parse-Funktion von Guinnes um diese Probleme gar nicht erst zu haben. Quantity schau ich mir zur später sicher auch mal an.

Sehe gerade -> hier ist beschrieben wie die neue Version auch jetzt schon genutzt werden kann https://community.openhab.org/t/ecmascr ... ned/144125