Seite 1 von 2

Java neu - Berechnungen

Verfasst: 10. Apr 2024 21:43
von dobby
Hallo!
Ich habe OH 4 auf einem Raspi 5 installiert. Die Regeln von OH 3 funktionieren da nicht mehr, soweit so gut. Die Syntax sollte ich verstanden haben. Es funktionieren jedoch die einfachsten Berechnungen nicht. Die folgende Subtraktion funktioniert nicht:
items.getItem('prod_tag').postUpdate((items.getItem('smartmeter_produziert').state)-(items.getItem('prod_start').state);
Es wird in "prod_tag" immer nur der Wert von "prod_start" geschrieben. Alle items sind numerisch. Ich habe verschiedene Variationen mit Klammern ausprobiert, leider ohne Erfolg. Etwas, wahrscheinlich Banales, übersehe ich.
Ich hoffe jemand kann mir helfen
Danke

Re: Java neu - Berechnungen

Verfasst: 10. Apr 2024 22:16
von udo1toni
Was Du da zeigst, ist mutmaßlich JavaScript.

Der erste Punkt ist, Du musst unter openHAB4 explizit das JavaScript Scripting Addon installieren (bei openHAB3 war dies automatisch installiert). Punkt zwei ist, es gibt zwei verschiedene Versionen davon. "Nashorn" ist die alte Engine, wenn Du die installierst, sollten die JavaScript Rules auf openHAB3 direkt funktionieren (evtl. mit ein paar Kleinigkeiten, die Du noch anpassen musst) "Graal" ist die moderne Version, die einerseits mehr Anpassungen erfordert, andererseits aber weniger Code braucht, weil diverse Dinge direkter erreichbar sind. Dieses ganze items.getItem-Gedöns sollte viel einfacher funktionieren.
Und was den Status betrifft, wenn Du den als numerischne Wert haben willst, gibt es (zumindest in Graal) .numericState, welches Du explizit auswählen musst.
Genaueres findest Du aber auch in der offiziellen Doku, dort ist JavaScript Scripting inzwischen sehr umfangreich dokumentiert.

Re: JavaScript neu - Berechnungen

Verfasst: 10. Apr 2024 22:21
von Harka
Moin,
sieht eher nach JavaScript aus ;-)
Versuch mal bitte

Code: Alles auswählen

items.getItem('prod_tag').postUpdate((items.getItem('smartmeter_produziert').numericState)-(items.getItem('prod_start').numericState);
Wenn es funktioniert solltest Du Dich noch mit den UoM beschäftigen.

PS. Udo war schneller

Re: Java neu - Berechnungen

Verfasst: 11. Apr 2024 04:20
von udo1toni
Harka hat geschrieben: 10. Apr 2024 22:21 PS. Udo war schneller
Hihi... ;)

Re: Java neu - Berechnungen

Verfasst: 12. Apr 2024 10:42
von dobby
Funktioniert noch immer nicht.
Ich habe folgende add-ons installiert
JavaScript Scripting
JRule - openHAB Rules using Java
Den Code habe ich um die fehlende Klammer ergänzt.

Code: Alles auswählen

items.getItem('prod_tag').postUpdate((items.getItem('smartmeter_produziert').numericState)-(items.getItem('prod_start').numericState));
Alle Items sind als Number definiert. Sollte ich die falschen Add-ons installiert haben?

Re: JavaScript neu - Berechnungen

Verfasst: 12. Apr 2024 17:28
von Harka
Wie verwaltest Du Deine Regeln? Wenn über die UI -> klapp mal bitte mit dem Pfeil untern rechts die Details auf. Dort sollte ECMAScript 262 Edition 11 aktiviert sein.
Wenn du OH4 als openhabian installiert hast ist automatisch auch frontail für die Logs dabei und unter der Adresse IP:9001 erreichbar. Kommen dort Fehler? Was wird angezeigt wenn Du mit
console.info(items.getItem('DeinItem').numericState);
die Ausgangswerte ausgeben lässt?

Re: Java neu - Berechnungen

Verfasst: 12. Apr 2024 19:16
von udo1toni
Ich möchte auch den Tipp geben, lieber strukturierten Code zu produzieren, als Einzeiler.

Also eher so:

Code: Alles auswählen

val prod = items.getItem('smartmeter_produziert').numericState;
val start = items.getItem('prod_start').numericState;
items.getItem('prod_tag').postUpdate(prod - start);
Zeig doch mal bitte die komplette Codeansicht der Rule (also den gesamten yaml Code).

Re: Java neu - Berechnungen

Verfasst: 17. Apr 2024 06:58
von dobby
Ich habe jetzt einiges ausprobiert. ECMAScript 262 Edition 11 ist aktiviert. Folgender Code funktioniert

Code: Alles auswählen

items.getItem('prod_tag').postUpdate(23);

Code: Alles auswählen

items.getItem('prod_tag').postUpdate(items.getItem('prod_start').state);

Code: Alles auswählen

items.getItem('prod_tag').postUpdate(23-17);
Nicht funktiert

Code: Alles auswählen

items.getItem('prod_tag').postUpdate((items.getItem('smartmeter_produziert').state)-(items.getItem('prod_start').state));

Code: Alles auswählen

items.getItem('prod_tag').postUpdate((items.getItem('smartmeter_produziert').numericState)-(items.getItem('prod_start').numericState));
Auch Dein Tipp mit Variablen zu rechnen hat nicht funktioniert.

Vielleicht hast Du ja noch eine Idee.

Re: Java neu - Berechnungen

Verfasst: 17. Apr 2024 07:16
von udo1toni
Wie sind die Items definiert (welcher EXAKTE Typ)?

Re: Java neu - Berechnungen

Verfasst: 17. Apr 2024 07:24
von dobby
Alle als Number