Die Frage ist erst mal, warum Du überhaupt so vorgehst.
Dich interessiert, ob die Bodenfeuchte unter 60 % ist. Es interessiert Dich
nicht zu einem exakten Zeitpunkt, Du willst lediglich die Nachricht auf einen bestimmten Zeitraum begrenzen - und mutmaßlich spielt es eine untergeordnete Rolle, wann innerhalb des Zeitfensters die Mail versandt wird, also nicht zwingend zur vollen Stunde, sondern lediglich irgendwann zwischen 6 und 23 Uhr (wobei Du ja sogar schreibst, dass es am besten rund um die Uhr liefe)
Code: Alles auswählen
var Boolean bMailSent = false
rule "Email Rhododendron"
when
Item BodenfeuchtesensorTopfpflanzen3_Bodenfeuchtigkeit changed
then
if(bMailSent) {
logDebug("mailPlant","dynamische Bewässerung: Mail wurde bereits versandt.")
return;
}
if(!(newState instanceof Number)) { // newState enthält den aktuellen Status des triggernden Items
logWarn("mailPlant","dynamische Bewässerung: Sensor liefert ungültigen Wert: {}",newState)
return;
}
if((newState as Number).floatValue >= 60) {
logDebug("mailPlant","dynamische Bewässerung: Bodenfeuchte ({}%) ausreichend.")
return;
}
if(BodenfeuchtesensorTopfpflanzen3_Bodentemperatur.state instanceof Number) { // enthält das Item einen gültigen Zahlenwert?
if((BodenfeuchtesensorTopfpflanzen3_Bodentemperatur.state as Number).floatValue <= 1) { // kleiner oder gleich 1?
logDebug("mailPlant","dynamische Bewässerung: Temperatur unter 1 °C.")
return; // dann Rule abbrechen
}
} else
logWarn("mailPlant","dynamische Bewässerung: Temperatursensor liefert ungültigen Wert.")
val mailActions = getActions("mail","mail:smtp:Gmail_zinnik_sven_SMTP")
val success = mailActions.sendMail("zinnik.sven@gmail.com", "Bodenfeuchtigkeit Rhododendron", "Achtung !!! Die Pflanze brauch Wasser")
bMailSent = true
end
rule "Mail-Marker zurücksetzen"
when
Time cron "0 0 6 * * ?" // täglich um 6 Uhr
then
bMailSent = false
end
Beide Rules müssen in einer gemeinsamen rules-Datei gespeichert sein, da sie auf die selbe globale Variable zugreifen. Man kann dazu natürlich auch ein Switch Item verwenden, dann können die Rules auch über die UI angelegt werden oder in unterschiedlichen Dateien gespeichert sein.
Die zweite Rule dient nur dazu, einen eventuell gesetzten Merker morgens um 6 Uhr zurückzusetzen - selbstverständlich geht auch ein anderer Zeitpunkt.
Die erste Rule triggert bei einer Wertänderung, prüft, ob bereits eine Mail gesendet wurde (über den Merker) und falls das nicht der Fall ist, werden die Werte geprüft wie gehabt (allerdings mit sinnvollen log-Meldungen).
Wird die MAil versandt, wird zusätzlich auch noch der Merker gesetzt, so dass die Rule bis zum nächsten Tag immer sofort beendet wird.
Die Debug-Meldungen werden lediglich ausgegeben, wenn der Log-Level für org.openhab.core.module.script.mailPlant auf DEBUG gesetzt wird. Liefert einer der Sensoren keinen gültigen Wert so wird dies mit einer Warnmeldung quittiert (nur, solange an diesem Tag noch keine Mail gesendet wurde)
Im Ergebnis bekommst Du maximal einmal am Tag eine Mail, falls die Bodenfeuchte unter 60 fällt, ansonsten wird nur bei aktivierten Debug-Modus bei jedem Trigger der Rule eine log-Meldung geschrieben, warum die Rule abgebrochen wurde.
Man könnte den Merker auch über eine Änderung der Bodenfeuchte über z.B. 65 % zurücksetzen, dann muss die Prüfung von bMailSent natürlich später innerhalb der Rule erfolgen. Es gibt dann nur noch eine Rule, aber auch nur noch eine Mail pro Trockenheit, nicht eine Mail pro Tag - da kommt es halt auch drauf an, wie oft Du Deine Mails checkst...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet