Waschmaschinen-Rule von OH2.5 in OH4

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

maulwurf
Beiträge: 9
Registriert: 22. Nov 2024 11:57
Answers: 0

Waschmaschinen-Rule von OH2.5 in OH4

Beitrag von maulwurf »

Hallo zusammen!

ich bin schon längere Zeit stiller Mitleser und konnte so auch schon einiges umsetzen, habe aber absolut kein Hintergrund wissen wenn es um Programmiersprachen geht. Nun habe ich nach einigen Jahren den Umstieg von openhab 2 auf openhab 4 gewagt, und auch soweit alles hinbekommen (Neuinstallation).

Aktuell auf einem Raspberry 3B+ 1GB, openHabian – openHAB 4.2.1
Geplant ist, wenn alles wieder läuft auf einen Rasperry Pi 5 4GB und openhab 4 -64bit umzusteigen

Die Suchfunktion habe ich natürlich benutzt und auch einiges gelesen, konnte aber nichts finden das mir weiterhilft.

Ich schaffe es einfach nicht, bzw. fehlt mir der Ansatz, wie ich eine Regel (war unter openhab 2 als .rules abgelegt) unter openhab 4 zum Laufen bringe.


folgende Regel (natürlich kopiert und angepasst, nicht selbst erstellt) hat die letzten Jahre Problemlos unter openhab 2.5 funktioniert:

Code: Alles auswählen

import java.util.concurrent.locks.ReentrantLock

val Number MODE_OFF = 0
val Number MODE_STANDBY = 1
val Number MODE_ACTIVE = 2
val Number MODE_FINISHED = 3

var ReentrantLock finishLock = new ReentrantLock()


rule "Status Waschmaschine"
when
    Item Waschmaschine_Leistung changed
then
    if (Waschmaschine_Leistung.state < 0.1) 
        Waschmaschine_Status.postUpdate(MODE_OFF)
    
    else if (Waschmaschine_Leistung.state > 60) 
            Waschmaschine_Status.postUpdate(MODE_ACTIVE)
    
    else if (Waschmaschine_Leistung.state < 3.5) {
        if (Waschmaschine_Leistung.state == MODE_OFF) 
            Waschmaschine_Status.postUpdate(MODE_STANDBY)
        
        else if (Waschmaschine_Status.state == MODE_ACTIVE) {
            finishLock.lock()
            try {
                Thread::sleep(13000) // Debounce for 13 seconds
                if (Waschmaschine_Leistung.state < 3.5) { 
                    Waschmaschine_Status.postUpdate(MODE_FINISHED)
                    sendTelegram("bot1", "Waschmaschine ist fertig!")
                    sendNotification("xxx@xxx.xx", "Waschmaschine ist fertig!")
                }
            } finally {
                    finishLock.unlock()
            }
        }
    }
end
Im Blockly Editor habe ich es auch schon versucht nachzubauen, das funktioniert zwar teilweise, aber ich weiss nicht wie ich die 13 Sekunden sleep einbauen soll.
Ich wäre sehr Dankbar, wenn mir jemand kurz erklären kann, wie ich diese Regel am Besten in openhab 4 erstellen kann.

vielen Dank im voraus!

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

Re: Waschmaschinen-Rule von OH2.5 in OH4

Beitrag von udo1toni »

Herzlich willkommen als aktiver Part im openHAB Forum! :)

Grundsätzlich sollte die Rule auch unter openHAB4 funktionieren, allerdings war die Rule "schon immer" nicht so besonders gut...
Insbesondere Thread::sleep() ist unter openHAB2 eine ganz dumme Idee, wenn man Zeiten wesentlich über 500 Millisekunden verwendet.
Der ReentrantLock ist auch eher suboptimal und hier eventuell der Grund, warum die Rule eben doch nicht funktioniert.

Ach so... Und die Telegram Action funktioniert anders, dieser Teil wird immer schief gehen.

Wenn ich es richtig erfasst habe, geht es darum, dass die Leistung über einen Zeitraum von 13 Sekunden unter 3,5 fallen soll. Das ist jedoch nicht, was die Rule macht. Stattdessen fällt der Leistung unter 3,5, und wenn nach 13 Sekunden die Leistung ebenfalls unter 3,5 ist, wird die fertig-Meldung generiert. Falls die Update-Zeit größer als 13 Sekunden ist, sollte dieser kleine Unterschied keine Rolle spielen, ist der Messzyklus kleiner 13 Sekunden, könnte es aber sein, dass zwischenzeitlich mehr als 3,5 gemessen wird.

Aber die wichtigste Frage: Ist Waschmaschine_Leistung vom Typ Number, oder ist es mit openHAB4 jetzt evtl. vom Typ Number:Power? Dann müsste die Rule grundlegend anders aufgebaut werden.

Code: Alles auswählen

// globale Konstanten
val Number MODE_OFF = 0
val Number MODE_STANDBY = 1
val Number MODE_ACTIVE = 2
val Number MODE_FINISHED = 3
// globale Variablen
var Timer tWasch = null

rule "Status Waschmaschine"
when
    Item Waschmaschine_Leistung changed
then
    if(!(newState instanceof Number)) return;                                   // falls keine Zahl, raus
    val Number nPower = (newState as Number).floatValue                         // Leistung als Zahl werten

    if(nPower < 0.1)                                                            // Maschine aus
        Waschmaschine_Status.postUpdate(MODE_OFF)

    else if(nPower > 60)                                                        // Maschine läuft
        Waschmaschine_Status.postUpdate(MODE_ACTIVE)

    else if(nPower < 3.5) {                                                     // Maschine pausiert evtl.
        if(Waschmaschine_Status.state == MODE_OFF)                              // Falls aus -> Standby
            Waschmaschine_Status.postUpdate(MODE_STANDBY)
        else if(Waschmaschine_Status.state == MODE_ACTIVE && tWasch === null) { // Falls aktiv und Timer nicht gestartet
            tWasch = createTimer(now.plusSeconds(13),[|                         // Timer starten
                Waschmaschine_Status.postUpdate(MODE_FINISHED)
                telegramAction = getActions("telegram:telegramBot:bot1")
                telegramAction.sendTelegram("Waschmaschine ist fertig!")
                sendNotification("xxx@xxx.xx", "Waschmaschine ist fertig!")
            ])
        }
    } else                                                                      // über 3.5 und unter 60
        tWasch?.cancel                                                          // Timer abbrechen
end
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

maulwurf
Beiträge: 9
Registriert: 22. Nov 2024 11:57
Answers: 0

Re: Waschmaschinen-Rule von OH2.5 in OH4

Beitrag von maulwurf »

vielen Dank für die schnelle Antwort!

Danke auch für den Hinweis mit Telegram, das ist jedoch im Moment zweitrangig, eine notification über die app wäre fürs erste genug - das funktioniert auch prinzipiell.

Das Item ist tatsächlich Number:Power!

Ich habe jedoch noch eine andere grundsätzliche Frage, wie lege ich diese Rule am besten in openhab4 an?
Wie bisher, den ganzen Code in eine .rules im Ordner ablegen oder über die Weboberfläche?

Ich würde gerne ab jetzt alles über die Weboberfläche anlegen, muss ich hierzu einfach unter Settings->Scripts ein neues Script mit Rule DSL erstellen?
Muss dieses Script dann noch extra "getriggert" werden oder nicht, weil es ja schon so im Code steht?

schönen Abend noch!

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

Re: Waschmaschinen-Rule von OH2.5 in OH4

Beitrag von udo1toni »

Du kannst Rules wie bisher auch als Text Rule anlegen, die DSL ist weiterhin Bestandteil von openHAB; vermutlich wird sie aber mit OH5 aus dem Core entfernt und anschließend nur "nur noch" als Addon bereitstehen. Kann aber auch sein, dass dieser Schritt erst später erfolgt.

Wenn Du die Rules lieber über die UI anlegen möchtest, musst Du sie als Rule anlegen (nicht als Script), eben weil die Rule ja einen Trigger benötigt.
Allerdings: Auch UI Scripte sind letztlich nur Rules ohne Trigger-Sektion, Du kannst deshalb Scripte in der yaml-Ansicht um den Trigger-Teil einer Rule erweitern und die aus dem Script wird eine Rule.
Aber: die Buchstabenfolge yaml deutet es ja schon an... auch DSL Rules müssen - über die UI erstellt - das yaml Format verwenden.
Textliche DSL Rules bestehen aus zwei Teilen, dem Trigger-Teil zwischen when und then und dem Code-Teil zwischen then und end. Diese Schlüsselworte sind nicht Bestandteil des Rule Codes!
Entsprechend musst Du beim Umstellen auf UI Rules die Trigger separat erstellen und als DSL Code nur den Block zwischen then und end (ohne die Schlüsselworte...) übernehmen.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

maulwurf
Beiträge: 9
Registriert: 22. Nov 2024 11:57
Answers: 0

Re: Waschmaschinen-Rule von OH2.5 in OH4

Beitrag von maulwurf »

Danke für die Erklärung, ich werde das ausprobieren sobald die Rule läuft.

Gestern konnte ich mit einem kurzen Waschgang testen, und der Status wechselt von 0 auf 2, erkennt dann aber kein Ende (der Verbrauch lag am Ende für über 2 Minuten unter 3,6Watt) und wechselt auf 0 wenn man die Waschmaschine ausschaltet.

Code: Alles auswählen

// globale Konstanten
val Number MODE_OFF = 0
val Number MODE_STANDBY = 1
val Number MODE_ACTIVE = 2
val Number MODE_FINISHED = 3
// globale Variablen
var Timer tWasch = null

rule "Status Waschmaschine"
when
    Item shellyplugs2_Waschmaschine_shellyplugs9d908f1921681236_Power_Consumption
 changed
then
    if(!(newState instanceof Number)) return;                                   // falls keine Zahl, raus
    val Number shellyplugs2_Waschmaschine_shellyplugs9d908f1921681236_Power_Consumption
 = (newState as Number).floatValue                         // Leistung als Zahl werten

    if(shellyplugs2_Waschmaschine_shellyplugs9d908f1921681236_Power_Consumption
 < 0.1)                                                            // Maschine aus
        Waschmaschine_Status.postUpdate(MODE_OFF)

    else if(shellyplugs2_Waschmaschine_shellyplugs9d908f1921681236_Power_Consumption
 > 60)                                                        // Maschine läuft
        Waschmaschine_Status.postUpdate(MODE_ACTIVE)

    else if(shellyplugs2_Waschmaschine_shellyplugs9d908f1921681236_Power_Consumption
 < 3.6) {                                                     // Maschine pausiert evtl.
        if(Waschmaschine_Status.state == MODE_OFF)                              // Falls aus -> Standby
            Waschmaschine_Status.postUpdate(MODE_STANDBY)
        else if(Waschmaschine_Status.state == MODE_ACTIVE && tWasch === null) { // Falls aktiv und Timer nicht gestartet
            tWasch = createTimer(now.plusSeconds(13),[|                         // Timer starten
                Waschmaschine_Status.postUpdate(MODE_FINISHED)
                telegramAction = getActions("telegram:telegramBot:bot1")
                telegramAction.sendTelegram("Waschmaschine ist fertig!")
                sendNotification("markus@mfam.at", "Waschmaschine ist fertig!")
            ])
        }
    } else                                                                      // über 3.6 und unter 60
        tWasch?.cancel                                                          // Timer abbrechen
end
ist hier der Timer das Problem oder muss ich sonst noch etwas beachten?

schönen Abend!

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

Re: Waschmaschinen-Rule von OH2.5 in OH4

Beitrag von udo1toni »

ACHTUNG! Du hast die lokale Variable nPower umbenannt und dabei den Namen eines Items verwendet. Bitte mach das unbedingt rückgängig! nPower ist eine lokale Variable.

Nur am Rande: Du willst doch nicht ernsthaft behaupten, dass shellyplugs2_Waschmaschine_shellyplugs9d908f1921681236_Power_Consumption in irgendeiner Form ein sinnvoller Itemname ist?

1: ThingIDs werden bei Autodiscovery oft mit "Zufallsnamen" aus Buchstaben und Zahlen angeboten. Ja, man kann diesen Namen übernehmen, aber nein, man sollte das nur im absoluten Ausnahmefall tun (diese Ausnahme ist, wenn man - weil das Addon schlecht programmiert ist - die ID beibehalten muss, um die Funktion zu gewährleisten).
2. Items sind grundsätzlich unabhängig von der verwendeten Hardware. Man sollte die Itemnamen nicht nach Hardware benennen (klar, kann man, aber meist ist das wirklich unnötig)
Hier wäre Waschmaschine_Power vollkommen ausreichend (selbst Consumption ist nur ein unnötiges Anhängsel) und ein solcher (kürzerer) Itemname hilft auch, Rules lesbarer zu gestalten. Aber ursprünglich hieß das Item Waschmnaschine_Leistung, warum hast Du den Namen überhaupt geändert?
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

maulwurf
Beiträge: 9
Registriert: 22. Nov 2024 11:57
Answers: 0

Re: Waschmaschinen-Rule von OH2.5 in OH4

Beitrag von maulwurf »

OK, ich habe es wieder geändert:

Code: Alles auswählen

// globale Konstanten
val Number MODE_OFF = 0
val Number MODE_STANDBY = 1
val Number MODE_ACTIVE = 2
val Number MODE_FINISHED = 3
// globale Variablen
var Timer tWasch = null

rule "Status Waschmaschine"
when
    Item shellyplugs2_Waschmaschine_shellyplugs9d908f1921681236_Power_Consumption
    changed
then
    if(!(newState instanceof Number)) return;                                   // falls keine Zahl, raus
    val Number nPower = (newState as Number).floatValue                         // Leistung als Zahl werten

    if(nPower < 0.1)                                                            // Maschine aus
        Waschmaschine_Status.postUpdate(MODE_OFF)

    else if(nPower > 60)                                                        // Maschine läuft
        Waschmaschine_Status.postUpdate(MODE_ACTIVE)

    else if(nPower < 3.6) {                                                     // Maschine pausiert evtl.
        if(Waschmaschine_Status.state == MODE_OFF)                              // Falls aus -> Standby
            Waschmaschine_Status.postUpdate(MODE_STANDBY)
        else if(Waschmaschine_Status.state == MODE_ACTIVE && tWasch === null) { // Falls aktiv und Timer nicht gestartet
            tWasch = createTimer(now.plusSeconds(13),[|                         // Timer starten
                Waschmaschine_Status.postUpdate(MODE_FINISHED)
                telegramAction = getActions("telegram:telegramBot:bot1")
                telegramAction.sendTelegram("Waschmaschine ist fertig!")
                sendNotification("xxx@xxx.xx", "Waschmaschine ist fertig!")
            ])
        }
    } else                                                                      // über 3.6 und unter 60
        tWasch?.cancel                                                          // Timer abbrechen
end
leider ohne Erfolg. Verhält sich genauso, wechselt beim starten von 0 auf 2, nach dem Waschgang fällt die Leistung unter 3,6W für ca. 5 Minuten und wird nicht als Ende erkannt. Nach diesen 5 Minuten schaltet die Waschmaschine automatisch ab und der Status wechselt auf 0.

Gibt es hier sonst noch etwas zu ändern?

Zur Namensgebung:
"Waschmaschine_Leistung" war das Item in meiner alten openhab 2 Installation.
Seit dem Wechsel zu openhab 4 und einer Neuinstallation auf dem "alten" Raspberry 3, habe ich die Namen nicht sonderlich beachtet weil diese Installation nur zum testen dient.

Wenn dann alles klappt, folgt eine Neuinstallation am Raspberry Pi5 und da bemühe ich mich dann wieder, die Things und Items vernünftig zu benennen.

Aber du hast recht, der Übersicht halber hätte ich es gleich ordentlich machen sollen.

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

Re: Waschmaschinen-Rule von OH2.5 in OH4

Beitrag von udo1toni »

Dann lass mal ein bisschen loggen...

Code: Alles auswählen

// globale Konstanten
val Number MODE_OFF = 0
val Number MODE_STANDBY = 1
val Number MODE_ACTIVE = 2
val Number MODE_FINISHED = 3
// globale Variablen
var Timer tWasch = null

rule "Status Waschmaschine"
when
    Item shellyplugs2_Waschmaschine_shellyplugs9d908f1921681236_Power_Consumption
    changed
then
    if(!(newState instanceof Number)) {                                                // falls keine Zahl, raus
        logWarn("washingMachine","newState liefert keine Zahl! ({})",newState)
        return;                                   
    } 
    val Number nPower = (newState as Number).floatValue                                // Leistung als Zahl werten
    logDebug("washingMachine","newState ({}) -> nPower ({})",newState,nPower)

    if(nPower < 0.1) {                                                                 // Maschine aus
        logDebug("washingMachine","nPower < 0.1, setze MODE_OFF")
        Waschmaschine_Status.postUpdate(MODE_OFF)
    }
    else if(nPower > 60) {                                                             // Maschine läuft
        logDebug("washingMachine","nPower > 60,  setze MODE_ACTIVE")
        Waschmaschine_Status.postUpdate(MODE_ACTIVE)
    }
    else if(nPower < 3.6) {                                                            // Maschine pausiert evtl.
        val actStat = (Waschmaschine_Status.state as Number).intValue
        logDebug("washingMachine","nPower < 3.6, aktueller Status {}", actStat)
        if(actStat == MODE_OFF) {                                                      // Falls aus -> Standby
            logDebug("washingMachine","aktueller Status MODE_OFF, setze MODE_STANDBY")
            Waschmaschine_Status.postUpdate(MODE_STANDBY)
        }
        else if(actStat == MODE_ACTIVE && tWasch === null) {                           // Falls aktiv und Timer nicht gestartet
            logDebug("washingMachine","aktueller Status MODE_ACTIVE, starte Timer")
            tWasch = createTimer(now.plusSeconds(13), [|                               // Timer starten
                logDebug("washingMachine","Timer abgelaufen, setze MODE_FINISHED")
                Waschmaschine_Status.postUpdate(MODE_FINISHED)
                telegramAction = getActions("telegram:telegramBot:bot1")
                telegramAction.sendTelegram("Waschmaschine ist fertig!")
                sendNotification("xxx@xxx.xx", "Waschmaschine ist fertig!")
            ])
        }
    } else                                                                             // über 3.6 und unter 60
        tWasch?.cancel                                                                 // Timer abbrechen
end
Da ich noch eine "Kleinigkeit" geändert habe (actStat als lokale Konstante), kannst Du die Rule erst mal "einfach so" probieren. Wenn es weiterhin nicht funktionieren sollte, öffnest Du die Karaf Konsole und änderst das Logging auf DEBUG:

Code: Alles auswählen

openhab-cli console
(Passwort sollte habopen sein)
log:set DEBUG org.openhab.core.model.script.washingMachine
logout
Danach sollten alle Debug-Zeilen mit ausgegeben werden.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

maulwurf
Beiträge: 9
Registriert: 22. Nov 2024 11:57
Answers: 0

Re: Waschmaschinen-Rule von OH2.5 in OH4

Beitrag von maulwurf »

Hi,

hier das Logfile - ich hoffe das passt so als .txt
[ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'waschmaschine_neu-1' failed: Could not cast 2 to java.lang.Number; line 30, column 24, length 36 in waschmaschine_neu
weißt du, was dieser Error bedeutet?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

maulwurf
Beiträge: 9
Registriert: 22. Nov 2024 11:57
Answers: 0

Re: Waschmaschinen-Rule von OH2.5 in OH4

Beitrag von maulwurf »

hier noch ein Logfile mit Debug.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Antworten