Meldung Waschmaschine wenn fertig

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Innocent
Beiträge: 198
Registriert: 29. Jul 2020 12:40

Meldung Waschmaschine wenn fertig

Beitrag 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 ?
Openhab 2 auf RaspberryPi 4

Benutzeravatar
udo1toni
Beiträge: 13860
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Meldung Waschmaschine wenn fertig

Beitrag 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
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Innocent
Beiträge: 198
Registriert: 29. Jul 2020 12:40

Re: Meldung Waschmaschine wenn fertig

Beitrag 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 😃
Openhab 2 auf RaspberryPi 4

Innocent
Beiträge: 198
Registriert: 29. Jul 2020 12:40

Re: Meldung Waschmaschine wenn fertig

Beitrag 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!
Openhab 2 auf RaspberryPi 4

Benutzeravatar
udo1toni
Beiträge: 13860
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Meldung Waschmaschine wenn fertig

Beitrag von udo1toni »

Wenn Du Fragen hast, jederzeit :)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Innocent
Beiträge: 198
Registriert: 29. Jul 2020 12:40

Re: Meldung Waschmaschine wenn fertig

Beitrag von Innocent »

Wenn du mir die einzelnen Zeilen bei Gelegenheit erläutern möchtest... 😊

Auch wann welche Klammer und warum. Die verwirren mich sehr. 🤣
Openhab 2 auf RaspberryPi 4

Benutzeravatar
udo1toni
Beiträge: 13860
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Meldung Waschmaschine wenn fertig

Beitrag 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. :)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Innocent
Beiträge: 198
Registriert: 29. Jul 2020 12:40

Re: Meldung Waschmaschine wenn fertig

Beitrag 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.
Openhab 2 auf RaspberryPi 4

Benutzeravatar
udo1toni
Beiträge: 13860
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Meldung Waschmaschine wenn fertig

Beitrag von udo1toni »

Ja, Handy ist da eher suboptimal...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Innocent
Beiträge: 198
Registriert: 29. Jul 2020 12:40

Re: Meldung Waschmaschine wenn fertig

Beitrag 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?
Openhab 2 auf RaspberryPi 4

Antworten