...also; die Art wie Udo an das Thema ran gegangen ist, ist die mit den Möglichkeiten aus OH3/OH4 (Widgets). Mein Herangehensweise ist dagegen noch "oldschool", basierend auf der ursprünglichen Regel (OH2).
Aber noch mal von Anfang!
Unter OH2.5 hattest du damals ein Rule gepostet, mit der du einen Wert (erstmalig -
Gaszaehler_Stand.postUpdate(Letzter_abgelesener_Zaehlerstand))setzen wolltest und danach sollte dieser Wert
"fix" sein
Code: Alles auswählen
if (Gaszaehler_Stand.state != NULL && Gaszaehler_Stand.state <= Letzter_abgelesener_Zaehlerstand) {
Gaszaehler_Stand.postUpdate(Letzter_abgelesener_Zaehlerstand) }
und die Regel sollte beim Triggern diesen Wert immer wieder erhöhen
(var Einheit = 0.01)
. Und das hat ja auch schon funktioniert.
Deshalb habe ich eine zweite Regel vorgeschlagen, die basierend auf der "globalen Variablen"
(var Letzter_abgelesener_Zaehlerstand = 1495.70)
diesen Wert wieder in dein Item "Gaszaehler_Stand" setzt.
Wenn ich dich aber jetzt richtig verstehe, brauchst(willst) du die Prüfung auf den "letzten abgelesenen Zählerstand" gar nicht. Dann kann man diese Bedingung (s.o.) auch weglassen und mit der eleganten Lösung von Udo den Wert einfach direkt in das Item "Gaszaehler_Stand" per Widget setzen.
Der Yaml-Code wäre dann mit deinem Item:
Code: Alles auswählen
component: oh-input-card
config:
item: Gaszaehler_Stand
title: Eine Zahl
name: Wert
type: number
inputmode: decimal
sendButton: true
slots: null
und sieht so aus:
widget.jpg
Die Fehlermeldung...
Code: Alles auswählen
2024-02-26 11:12:46.645 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'test_zaehler_udo-1' failed: An error occurred during the script execution: Could not invoke method: org.eclipse.xtext.xbase.lib.DoubleExtensions.operator_plus(double,double) on instance: null in test_zaehler_udo
habe ich beim Ausführen der Regel auch bekommen und diese noch etwas angepasst (Deklaration der Variablen in der Rule-Typ):
Code: Alles auswählen
val Einheit = 0.01 // m³ pro Puls
val Gaspreis_Jahr = 200.1 // € pro Jahr
val Gaspreis_Tag = 54.82191780821918 // ct pro Tag
val Gaspreis_kWh = 19.269 // ct pro kWh
val Gaspreis_zZahl = 0.9645 // z Zahl
val Gaspreis_Brennwert = 10.293 // Brennwert
rule "Increment Gas Meter"
when
Item Dummy_4 changed from OFF to ON
then
var Number nCountTotal = 0.0
var Number nCountToday = 0.0
var Number Faktor = Gaspreis_zZahl * Gaspreis_Brennwert * Gaspreis_kWh
if(Gaszaehler_Stand.state instanceof Number)
nCountTotal = Gaszaehler_Stand.state as Number
nCountTotal += Einheit
Gaszaehler_Stand.postUpdate(nCountTotal)
Thread.sleep(300)
nCountToday = Gaszaehler_Stand.deltaSince(now.with(LocalTime.MIDNIGHT))
Gaszaehler_Heute.postUpdate(nCountToday)
Gaskosten_Heute.postUpdate((nCountToday * Faktor + Gaspreis_Tag) / 100)
end
Dann hat's geklappt, "wie geschnitten Brot"