Seite 1 von 2

Emailbenachrichtigung verbessern

Verfasst: 16. Jun 2023 19:25
von zinnik
Hallo

Ich hab mir eine Rule erstellt worauf ich benachrichtigt werde wenn der Topf der Pflanzen zu trocken ist.

Nun bekomme ich ich die Mail aber jede Stunde zwischen 6 und 23 Uhr. Kann man die Rule verbessern so das diese Email nur einmal verschickt wird.

Die Prüfung der Trockenheit sollte aber trotzdem in dem Zeitraum stattfinden oder besser noch den ganzen Tag über aber es soll nur einmal eine Mail versendet werden.

Ich nutze das mail Binding.

Code: Alles auswählen

rule "Email_Rhododendron"
when
    Time cron "0 0 6-23 * * ?"   // täglich zwischen 6-23 Uhr"0 0 6-23 * * ?"      Test Minuten nach der vollen Stunde"0 06 * * * ? *"
then

    logInfo("Bewässerung dynamisch Blumenbeet", "gestartet- geplante Startzeit 9 Uhr")
    if(BodenfeuchtesensorTopfpflanzen3_Bodenfeuchtigkeit.state instanceof Number)                    // enthält das Item einen gültigen Zahlenwert?
        if((BodenfeuchtesensorTopfpflanzen3_Bodenfeuchtigkeit.state as Number).floatValue >= 60)     // größer oder gleich 60?
            return;                                                                         // dann Rule abbrechen

    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?
            return;                                                                         // dann Rule abbrechen

    val mailActions = getActions("mail","mail:smtp:Gmail_zinnik_sven_SMTP")
    val success = mailActions.sendMail("zinnik.sven@gmail.com", "Bodenfeuchtigkeit Rododendron", "Achtung !!! Die Pflanze brauch Wasser")

end

Lg Sven

Re: Emailbenachrichtigung verbessern

Verfasst: 16. Jun 2023 23:22
von udo1toni
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...

Re: Emailbenachrichtigung verbessern

Verfasst: 21. Jun 2023 00:46
von zinnik
Sorry dass ich mich nicht früher gemeldet habe. Hatte wenig >Zeit.

Du fragtest warum ich die Rule so geschrieben habe? Weil ich es einfach nicht besser kann. Hatte mir ein vorhanden Teil aus der bewässerungsrule genommen und versucht was daraus zu machen. Sorry

Re: Emailbenachrichtigung verbessern

Verfasst: 21. Jun 2023 02:01
von udo1toni
Na, Du musst Dich nicht entschuldigen :)
Es ist aber für den reibungslosen Betrieb von openHAB nicht ganz unwichtig, zu verstehen, dass openHAB konsequent eventbasiert arbeitet, wo immer das möglich ist, sollte man also seine Rules auch entsprechend programmieren, also entweder auf Wertänderungen oder auf Befehle reagieren. Zeitsteuerung ist natürlich genauso möglich, sollte dann aber gezielt eingesetzt werden.
Hier wäre es ja nur so, dass die Rule einfach stumpf zu bestimmten Zeiten ausgeführt wird, um ein paar Werte miteinander zu verrechnen. Da aber die Uhrzeit bei der Berechnung kein Faktor ist, läuft die Rule eventuell sinnlos, weil sich z.B. Eingangswerte nicht geändert haben und somit auch das gleiche Ergebnis herauskommen wird, wie beim Durchlauf davor.
Aus dem gleichen Grund ist received update als Trigger mit Vorsicht zu genießen. Es gibt Beispiele, wo das der korrekte Trigger ist, z.B. für meine Klingeltaster, denn die werden ausschließlich als ON gemeldet, wenn die Taste gedrücktwird, es folgt aber kein OFF, wenn die Taste wieder losgelassen wird. changed fürde also nur ein einziges Mal nach einem Neustart triggern, dann nicht mehr. Die Alternative - das Item über eine Rule manuell zurückzusetzen - ist keine gute Lösung, weil sie ungleich mehr Code verlangt, als einfach den anderen Trigger zu verwenden :)
In den meisten Fällen wird man aber auf Wertänderungen warten, um dann erneut Berechnungen vorzunehmen

Re: Emailbenachrichtigung verbessern

Verfasst: 21. Jun 2023 08:56
von zinnik
Danke Udo für deine tollen Beiträge und Erklärungen würde dir gerne mal ein *Bierchen* spendieren.

Lg sven

Re: Emailbenachrichtigung verbessern

Verfasst: 30. Jun 2023 00:56
von zinnik
Hallo hab noch mal ne <Frage zu einer anderen einfachen <Rule

wenn ich diese Rule über die UI starte und erstelle läuft sie einwandfrei.

Aber wenn ich sie im rules Ordner erstelle startet sie nicht Irgendwas funktioniert nicht am "when" Befehl.

UI Rule:

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      itemName: Bewaesserung_1_STATE
      command: ON
    type: core.ItemCommandTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/vnd.openhab.dsl.rule
      script: >-
        val mailActions = getActions("mail","mail:smtp:Gmail_zinnik_sven_SMTP")

        val success = mailActions.sendMail("zinnik.sven@gmail.com", "Blumenbeet Bewaesserung gestartet", "Die Bewaesserung von Blumenbeet ist gestartet")
    type: script.ScriptAction
Rule über Rules Ordner DSL

Code: Alles auswählen

rule "Email Bewässerung Blumenbeet neu"
when
    Item Bewaesserung_1_STATE received command [ON]  // Wenn ich normale Klammern(ON) nutze geht es auch nicht. Ich glaube nur bei "changed" geh es aber dann bekomme ich auch bei dem "OFF) eine Meldung
then
    val mailActions = getActions("mail","mail:smtp:Gmail_zinnik_sven_SMTP")
val success = mailActions.sendMail("zinnik.sven@gmail.com", "Bewaesserung Blumenbeet gestartet", "Die Bewaesserung von Blumenbeet ist gestartet")
end
Hat da jemand eine Idee?

Lg Sven

Re: Emailbenachrichtigung verbessern

Verfasst: 30. Jun 2023 07:52
von udo1toni
Der trigger muss ohne Klammern geschrieben werden.

Code: Alles auswählen

rule "Email Bewässerung Blumenbeet neu"
when
    Item Bewaesserung_1_STATE received command ON
then
    val mailActions = getActions("mail","mail:smtp:Gmail_zinnik_sven_SMTP")
    val success = mailActions.sendMail("zinnik.sven@gmail.com", "Bewaesserung Blumenbeet gestartet", "Die Bewaesserung von Blumenbeet ist gestartet")
end

Re: Emailbenachrichtigung verbessern

Verfasst: 30. Jun 2023 08:07
von zinnik
udo1toni hat geschrieben: 30. Jun 2023 07:52 Der trigger muss ohne Klammern geschrieben werden.

Code: Alles auswählen

rule "Email Bewässerung Blumenbeet neu"
when
    Item Bewaesserung_1_STATE received command ON
then
    val mailActions = getActions("mail","mail:smtp:Gmail_zinnik_sven_SMTP")
    val success = mailActions.sendMail("zinnik.sven@gmail.com", "Bewaesserung Blumenbeet gestartet", "Die Bewaesserung von Blumenbeet ist gestartet")
end
Das funktioniert leider nicht. komisch

Re: Emailbenachrichtigung verbessern

Verfasst: 30. Jun 2023 08:36
von udo1toni
Doch, das funktioniert, sofern Du nicht weitere Fehler in der Datei hast, die verhindern, dass openHAB die Datei abarbeitet.

Punkt 1: Speicherort korrekt? Speicherort ist exakt $OPENHAB_CONF/rules/ (z.B. auf einem Pi mit Standard Installation /etc/openhab/rules/, nicht in einem weiteren Unterordner)
Punkt 2: Dateiendung korrekt? Der Dateiname endet zwingend auf .rules (Groß/Kleinschreibung beachten)
Punkt 3: Irgendwelche Fehlermeldungen in openhab.log? Dort muss nach jedem Speichern der Datei sowie beim Neustart von openHAB eine Meldung der Art Loading model 'my.rules' wobei hier my.rules der Dateiname ist. Wenn da irgendwas vonwegen therefor ignoring it steht, weißt Du, dass die Datei zwar gelesen wurde, aber so fehlerhaft ist, dass openHAB sie sicherheitshalber ignoriert.

Re: Emailbenachrichtigung verbessern

Verfasst: 30. Jun 2023 08:40
von zinnik
Achso weitere Fehler in der Datei ja das stimmt hab die anderen email benachrichtigungen nicht angepasst. Probier ich dann gleich aus. Bin jetzt mal deinem Rat gefolgt und habe eine Datei für mehrere Rules der gleichen Art angelegt.

Lg sven