Seite 1 von 9

Meldung Waschmaschine wenn fertig

Verfasst: 16. Mär 2021 20:02
von Innocent
Hallo zusammen,

seit einer Weile tüftele ich nun schon an einer wohl recht einfachen Sache, bekomme sie aber nicht hin.

Es soll bei erreichen einer gewissen Leistung der Waschmaschine ganz simpel eine nachricht per Telegramm an mich erfolgen.
Dies hatte ich schon bewerkstelligt, allerdings schwankt die leistung der maschine dann zwischen 1.3 und 1.4 Watt.
Ich bekam glaube knapp 1000 Nachrichten...

Ich möchte also, wenn die Leistung der Maschine erstmalig auf 1.3 Watt fällt einen Timer ablaufen lassen, dann prüfen, ob die leistung noch 1.3 bzw 1.4 Watt beträgt und dann einmalig eine Nachricht an mein handy senden lassen...

Alternativ könnte man ja sicher sagen, nachricht wenn leistung für 3 minuten kleiner als 2 Watt.

Ich komme nicht dahinter, wie es richtig sein muss. Gerne würde ich es verstehen.

So sieht meine Rule aktuell aus.

Code: Alles auswählen

rule "Waschmaschine fertig"
when
        Item sps_kg_wm_leistung changed from 1.3 to 1.4
then
        createTimer(now.plusMinutes(2))  
        sendTelegram("Sascha","Die Waschmaschine ist fertig")

end

Wer kann mir da auf die Sprünge helfen und es mir erklären ?

Re: Meldung Waschmaschine wenn fertig

Verfasst: 16. Mär 2021 22:26
von udo1toni
So macht man das nicht. ;) Welche Version von openHAB nutzt Du? eine mögliche Variante:

Code: Alles auswählen

var Timer tWash = null
var Boolean bWash = false

rule "Waschmaschine fertig"
when
    Item sps_kg_wm_leistung changed
then
    if(!bWash) {
        if(sps_kg_wm_leistung.state > 20) // Erkennung die Maschine wurde gestartet
            bWash = true
    } else {                              // bWash ist true -> Maschine aktiv
        if(sps_kg_wm_leistung.state < 1.4) { // Erkennung die Maschine ist vielleicht fertig
            if(tWash === null)
                tWash = createTimer(now.plusMinutes(2), [|
                    sendTelegram("Sascha","Die Waschmaschine ist fertig")
                    tWash = null
                    bWash = false
                ])
        } else if(sps_kg_wm_leistung.state > 3){ // notwendig, falls Stromaufnahme zwischendurch sehr niedrig
            tWash?.cancel
            tWash = null
        }
    }
end
Das ist nur ein grober Entwurf. Der Knackpunkt ist, dass die Rule nicht nur das Ende des Waschvorgangs erkennt, sondern auch den Beginn. Sie merkt sich, dass der Waschvorgang gestartet wurde. So kann sie am Ende nicht nur die NAchricht versenden, sondern zusätzlich den Merker wieder zurücksetzen. Es gibt in der Rule nun mehrere Schwellwerte, zum einen den für den Startvorgang (der letztlich auch recht hoch sein könnte, die Heizung braucht ja meist ordentlich Strom), die Grenze, die das Ende des Durchgangs signalisiert und einen weiteren Grenzwert, falls die Maschine zwischendurch nur kurzzeitig unter den unteren Grenzwert sinkt. Nur in diesem Fall ist der Timer überhaupt notwendig (um sicherzustellen, dass der untere Grenzwert über einen Mindestzeitzraum unterschritten wurde).
Wenn absolut sicher ist, dass der Verbrauch im laufenden Betrieb nie unter 1.4 fällt, könnte die Rule auch erheblich kürzer ausfallen:

Code: Alles auswählen

var Boolean bWash = false

rule "Waschmaschine fertig"
when
    Item sps_kg_wm_leistung changed
then
    if(!bWash) {
        if(sps_kg_wm_leistung.state > 20)        // Erkennung die Maschine wurde gestartet
            bWash = true
    } else {                                     // bWash ist true -> Maschine aktiv
        if(sps_kg_wm_leistung.state < 1.4) {     // Erkennung die Maschine ist fertig
            sendTelegram("Sascha","Die Waschmaschine ist fertig")
            bWash = false
        }
    }
end

Re: Meldung Waschmaschine wenn fertig

Verfasst: 17. Mär 2021 05:06
von Innocent
Vielen lieben Dank, das ging ja schnell.
Ich werde die kurze Variante erstmal testen.

Ich benutze openhab 2.5.10

Falls es funktioniert setze ich mich eingehend damit auseinander, um es tiefgründig zu verstehen.

Schönen Tag 😃

Re: Meldung Waschmaschine wenn fertig

Verfasst: 18. Mär 2021 08:28
von Innocent
Guten Morgen.

Die kurze Variante habe ich gestern Abend gleich mal ausprobiert.
Es funktioniert genau so wie es soll.

Jetzt werde ich mich mit den einzelnen Zeilen mal beschäftigen und versuchen zu kapieren. Wer kann da Hilfestellung geben? 🤔

Schönen Donnerstag!

Re: Meldung Waschmaschine wenn fertig

Verfasst: 18. Mär 2021 15:11
von udo1toni
Wenn Du Fragen hast, jederzeit :)

Re: Meldung Waschmaschine wenn fertig

Verfasst: 18. Mär 2021 15:34
von Innocent
Wenn du mir die einzelnen Zeilen bei Gelegenheit erläutern möchtest... 😊

Auch wann welche Klammer und warum. Die verwirren mich sehr. 🤣

Meldung Waschmaschine wenn fertig

Verfasst: 18. Mär 2021 16:43
von udo1toni
Klar...

Code: Alles auswählen

// Globale Variablen, Konstanten und Imports müssen vor der ersten Rule definiert werden.

var Boolean bWash = false                   // definiere eine globale Variable 
                                            // vom Typ Boolean 
                                            // mit dem Namen bWash und 
                                            // belege diese zunächst mit dem Wert false

rule "Waschmaschine fertig"                 // Definiere eine Rule mit dem Namen "Waschmaschine fertig"
when                                        // ab hier folgt eine Liste aller Trigger, die die Rule auslösen
    Item sps_kg_wm_leistung changed         // Wenn das Item sps_kg_wm_leistung seinen Status ändert, starte die Rule
then                                        // ab hier folgt der auszuführende Code
    if(!bWash) {                            // Bedingung: die Variable bWash muss false enthalten 
                                            // das ! ist die logische Negierung, aus true wird false und umgekehrt
        if(sps_kg_wm_leistung.state > 20)   // Bedingung: der Status des Items sps_kg_wm_leistung ist grüßer als 20
            bWash = true                    // setze die Variable bWash auf true
   } else {                                // falls die zugehörige if-Anweisung (vor der öffnenden geschweiften Klammer) nicht zutrifft
        if(sps_kg_wm_leistung.state < 1.4) {// Bedingung: der Status des Items sps_kg_wm_leistung ist keiner als 1.4
            sendTelegram("Sascha","Die Waschmaschine ist fertig") // sende eine Nachricht über Telegram
            bWash = false                   // setze die Variable bWash auf false
        }
    }
end                                         // Ende des Codeblocks und Ende der Rule
Die geschweiften Klammern {} fassen mehrere Befehle so zusammen, dass sie wie ein Befehl behandelt werden (auf dieser Ebene)
Der Grund hierfür: jegliche bedingte Verzweigungen wirken immer nur auf den nächsten Befehl. Beispiel:

Code: Alles auswählen

        if(sps_kg_wm_leistung.state < 1.4) {
            sendTelegram("Sascha","Die Waschmaschine ist fertig")
            bWash = false
        }
ist das status < 1.4, werden beide Befehle ausgeführt, sonst keiner.

Code: Alles auswählen

        if(sps_kg_wm_leistung.state < 1.4)
            sendTelegram("Sascha","Die Waschmaschine ist fertig")
            bWash = false
ist das status < 1.4, wird sendTelegram ausgeführt, sonst nicht. die Wertzuweisung wird immer ausgeführt.
Die Einrückung des Codes dient einzig der Lesbarkeit und hat keinen Einfluss auf den Ablauf.
beim ersten if() wäre streng genommen keine Klammerung nötig, allerdings ist im ersten if-block eine weitere bedingte Verzweigung eingebaut und es folgt dann der else-block für die erste bedingte Verzweigung. Die DSL wird den else-Teil dann auf das flasche if beziehen.

Im ersten Codebeispiel gibt es noch die eckigen Klammern []. Diese schließen ein Lambda ein. Das Lambda ist ein Codeblock, der als Parameter dient. Dort gibt es ebenfalls einen senkrechten Slash |. Im Fall eines Timers spielt der keine Rolle und kann sogar weg gelassen werden (ist aber besserer Stil ihn hinzuschreiben). Wenn man z.B. eine Gruppefiltert, so benötigt man einen Stellvertreter für die einzelnen Gruppenmember, um im Filter das Item verwendne zu können, so:

Code: Alles auswählen

gMyGroup.members.filter[i|i.name.contains("Licht")].forEach[j|
    j.sendCommand(ON)
]
Diese drei Zeilen sorgen dafür, dass alle Member der Gruppe gMyGroup, in deren Namen das Wort "Licht" enthalten ist, den Befehl ON senden.
Diese drei Zeilen sind auch ein gutes Beispiel, wie mächtig die Rules DSL ist. :)

Re: Meldung Waschmaschine wenn fertig

Verfasst: 18. Mär 2021 18:40
von Innocent
Vielen Dank.

Habe es mal am Handy gelesen. Verstanden aber noch nicht. Werde es mal am Rechner anschauen da habe ich eventuell einen anderen Überblick.

Schon Wahnsinn.
Danke.

Re: Meldung Waschmaschine wenn fertig

Verfasst: 18. Mär 2021 19:53
von udo1toni
Ja, Handy ist da eher suboptimal...

Re: Meldung Waschmaschine wenn fertig

Verfasst: 22. Mär 2021 17:06
von Innocent
Fraule hat heute gewaschen.

Die Nachricht per Telegram kam mehrere Male auf dem Handy an.

Ich kapiere nicht ganz warum...

Wo müsste ich denn sendTelegram einfügen um bescheid zu bekommen, wenn die Maschine gestartet wurde?