Vermutlich liefert lastUpdate DateTimeType zurück, nicht ZonedDateTime.
Mein Gegnvorschlag für die Rule:
Code: Alles auswählen
rule "Regenmengensensor auswerten"
when
Item MQTT_RegenSWITCH changed
then
if(newState != ON)
return;
var counter = 1
if((MQTT_RegenCount.state instanceof Number))
counter = (MQTT_RegenCount.state as Number) + 1 // Zähler für L
MQTT_RegenCount.postUpdate(counter)
val Number REGEN_WIPPE = 0.006 // Inhalt der Wippe in l
val Number REGEN_FLAECHE = 0.0063617 // Fläche des Sensors umgerechnet in m²
val Number REGEN_X = (REGEN_WIPPE/REGEN_FLAECHE) // = L/m²
var REGEN_LASTUPDATE = (MQTT_RegenCount.lastUpdate("influxdb") as DateTimeType).getZonedDateTime() // Lt. Doku -> Returns the last timestamp a given Item was persisted
var REGEN_TIME = (REGEN_LASTUPDATE - ZonedDateTime.now())
logInfo("rainsensor","REGEN_X {}", REGEN_X )
logInfo("rainsensor","REGEN_LASTUPDATE {}", REGEN_LASTUPDATE )
logInfo("rainsensor","REGEN_TIME {}", REGEN_TIME )
end
Erst mal der frühe Return falls der Switch nicht ON ist. Einfacher wäre natürlich, als Trigger
zu setzen
Bitte NIEMALS ein Item als Variable innerhalb einer Rule missbrauchen. openHAB arbeitet asynchron, das heißt, postUpdate wird als Befehl ausgeführt und die Rule wird unmittelbar weiterverarbeitet, es wird nicht abgewartet, bis der Befehl ausgeführt wurde. Im Zweifel versucht die Rule, den Itemwert zu erhöhen bevor die Variable einen gültigen Inhalt hat. Stattdessen bitte immer eine lokale Variable nutzen, das ist die saubere Variante, die auch sicherstellt, dass der Wert nicht während eines Rule Durchlaufs verändert wird.
Die Variablennamen sind übrigens nicht Stylekonform, in openHAB wird allgemein mit CamelCase gearbeitet. Bei lokalen Variablen möchte ich dazu raten, lieber kurze Variablennamen zu verwenden, der Kontext ist ja durch die Rule selbst gegeben.
Wie erwähnt gehe ich davon aus, dass DateTimeType zurückgeliefert wird, was nicht direkt mit JavaTime verrechnet werden kann. Stattdessen müssen wird den Datentyp erst konvertieren wie gezeigt.
logInfo() erwartet zwei Strings als Parameter, wobei der erste String der Loggername ist (bzw. der letzte Teil des Loggernamens). INFO ist denkbar schlecht geeignet, zumal logInfo dies ohnehin IMMER in die Logzeile schreibt - es handelt sich also um eine nutzlose Information. Die Logbefehle können über den Loggernamen on-the-fly ein- und ausgeschaltet werden, es lohnt sich also, pro Rule (oder pro Funktion) einen kurzen Loggernamen zu kreieren.
Die Loggernamen sind hierarchisch organisiert, alle log-Befehle aus Rules heraus loggen unter dem Namen org.openhab.core.model.script.*, wobei das * der Teil im ersten String ist. Man kann hier auch selbst mit . weitere Ebenen einfügen, wenn man möchte. tiefere Hierarchien erben die übergeordnete Einstellung des Log Levels.
Außerdem beherrschen die log-Befehle die Substitution incl. Typumwandlung, diese ist grundsätzlich dem Verketten von Strings vorzuziehen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet