Rule für Sicherungsfall

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Epicblue
Beiträge: 26
Registriert: 20. Jan 2020 03:18
Answers: 0

Rule für Sicherungsfall

Beitrag von Epicblue »

Hallo zusammen,

ich habe einen KNX Schaltaktor mit Strommessung. Bei diesem habe ich den Lastausfall eingestellt um mir dann über Openhab und Pushover Nachrichten zu schicken. Ich habe eine Gruppe gLastausfall erstellt und wenn sich einer davon ändert sollen die Meldungen kommen.
Falls eine Sicherung längere Zeit aus ist und noch eine zweite fällt, bekomme ich immer doppelte Meldungen.

Hier ist meine Rule

Code: Alles auswählen

//Sicherungsfall KNX Aktor Strommessung
    rule "Küche Kühlschrank Lastausfall"
        when
            Member of gLastausfall changed
        then
            if (KNX_EG_Kueche_Kuehlschrank_Lastausfall.state == ON) {
            sendPushoverMessage(pushoverBuilder("Kühlschrank Sicherung F2.7.1 prüfen"))
            } 
            if ( KNX_EG_Kueche_Dampfgarer_Lastausfall.state == ON) {
            sendPushoverMessage(pushoverBuilder("Dampfgarer Sicherung F2.8.1 prüfen"))
            }
            if ( KNX_EG_Kueche_Waermeschublade_Lastausfall.state == ON) {
            sendPushoverMessage(pushoverBuilder("Wärmeschublade Sicherung F2.8.1 prüfen"))
            }
            if ( KNX_EG_Kueche_Backofen_Lastausfall.state == ON) {
            sendPushoverMessage(pushoverBuilder("Backofen Sicherung F2.9.1 prüfen"))
            }
            if ( KNX_EG_Kueche_Spuelmaschine_Lastausfall.state == ON) {
            sendPushoverMessage(pushoverBuilder("Spühlmaschine Sicherung F2.10.1 prüfen"))
            }
            if ( KNX_EG_Kueche_Gefrierschrank_Lastausfall.state == ON) {
            sendPushoverMessage(pushoverBuilder("Gefrierschrank Sicherung F2.11.1 prüfen"))
            }
            if ( KNX_EG_Kueche_InduktionsfeldL1_Lastausfall.state == ON) {
            sendPushoverMessage(pushoverBuilder("Induktionskochfeld Sicherung F2.12.1 prüfen"))
            }
            if ( KNX_EG_Kueche_InduktionsfeldL2_Lastausfall.state == ON) {
            sendPushoverMessage(pushoverBuilder("Induktionskochfeld Sicherung F2.12.1 prüfen"))
            }
            if ( KNX_EG_Kueche_InduktionsfeldL3_Lastausfall.state == ON) {
            sendPushoverMessage(pushoverBuilder("Induktionskochfeld Sicherung F2.12.1 prüfen"))
            }
            if ( KNX_EG_Hauswirtschaftsraum_Trockner_Lastausfall.state == ON) {
            sendPushoverMessage(pushoverBuilder("Trockner Sicherung F1.3.1 prüfen"))
            }
            if ( KNX_EG_Hauswirtschaftsraum_Waschmaschine_Lastausfall.state == ON) {
            sendPushoverMessage(pushoverBuilder("Waschmaschine Sicherung F1.3.2 prüfen"))
            }
    end

Tokamak
Beiträge: 183
Registriert: 20. Aug 2019 08:37
Answers: 4
Wohnort: Aachen

Re: Rule für Sicherungsfall

Beitrag von Tokamak »

Du bekommst zu jedem Lastaufall-Item, das ON ist, eine Meldung, wenn die Rule ausgeführt wird.

Um nur zu dem Item, das die Rule getriggert hat, eine Meldung zu erhalten, musst du zusätzlich triggeringItem abfragen, also etwa

Code: Alles auswählen

//Sicherungsfall KNX Aktor Strommessung
    rule "Küche Kühlschrank Lastausfall"
        when
            Member of gLastausfall changed
        then
            // kein Lastausfall -> hier nicht interessant
            if (triggeringItem.state == OFF)
                return;
                
            if (triggeringItem == KNX_EG_Kueche_Kuehlschrank_Lastausfall) {
                sendPushoverMessage(pushoverBuilder("Kühlschrank Sicherung F2.7.1 prüfen"))
            } 
            ...
Proxmox mit OH 4.2 und HABApp 24 im LXC-Container

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

Re: Rule für Sicherungsfall

Beitrag von udo1toni »

Also, eigentlich willst Du eine andere Rule haben :)

Ohn Gewähr...

Code: Alles auswählen

import java.util.HashMap

val HashMap<String,String> hCircuit = newHashMap[
                                                "Kuehlschrank"     -> "Kühlschrank_2.7.1",
                                                "Dampfgarer"       -> "Dampfgarer_2.8.1",
                                                "Waermeschublade"  -> "Wärmeschublade_2.8.1",
                                                "Backofen"         -> "Backofen_2.9.1",
                                                "Spuelmaschine"    -> "Spülmaschine_2.10.1",
                                                "Gefrierschrank"   -> "Gefrierschrank_2.11.1",
                                                "InduktionsfeldL1" -> "InduktionsfeldL1_2.12.1",
                                                "InduktionsfeldL2" -> "InduktionsfeldL2_2.12.1",
                                                "InduktionsfeldL3" -> "InduktionsfeldL3_2.12.1",
                                                "Trockner"         -> "Trockner_1.3.1",
                                                "Waschmaschine"    -> "Waschmaschine_1.3.2"
    ]

//Sicherungsfall KNX Aktor Strommessung
rule "Lastausfall Meldung"
when
    Member of gLastausfall changed to ON
then
    val String strName = triggeringItem.name.split("_").get(3)
    val String strRName = hCircuit.get(strName).toString.split("_").get(0)
    val String strCirc = hCircuit.get(strName).toString.split("_").get(1)
    sendPushoverMessage(pushoverBuilder(strRName + " Sicherung F" + strCirc + " prüfen"))
end
Das wäre ja eine schöne Rule Engine, wenn man alles zigfach hinschreiben müsste.

Der Trigger "changed to ON" sorgt dafür, dass die Rule nur triggert, wenn einer der Stromkreise ausfällt, aber nicht, wenn die Sicherung wieder eingeschaltet wird.
triggeringItem ist das Item, welches die Rule ausgelöst hat (das einzelne, nicht das Gruppenitem).
split() trennt den String in mehrere Stücke (am angegebenen Zeichen), get() liefert den n+1. Teil, also der erste Teil ist get(0).
Die HashMap setzt den String in einen anderen String um, der in diesem Fall zwei Teilstrings enthält.
Die erste Konstante nimmt also den wesentlichen Teilstring aus dem Namen des triggernden Items auf.
Die zweite und dritte Konstante werden anschließend genutzt, um die beiden Teilstrings aufzunehmen.
Anschließend müssen die Teilstrings nur noch zur Meldung zusammengesetzt werden.
Durch die HashMap ist der Code natürlich auch recht lang :) aber im Zweifel wesentlich effizienter.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Epicblue
Beiträge: 26
Registriert: 20. Jan 2020 03:18
Answers: 0

Re: Rule für Sicherungsfall

Beitrag von Epicblue »

Hallo, Danke für eure Antworten

udo1toni könntest du mir das mit dem get(3) (0) und (1) nochmal genauer erklären?

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

Rule für Sicherungsfall

Beitrag von udo1toni »

get(x) gibt das x+1ste Element der Liste zurück. get(0) gibt also das 1. Elektro zurück, get(1) gibt das 2. Element zurück, get(3) gibt das 4. Element zurück.

Die Liste entsteht durch die Funktion davor, die heißt split(“_”). Split() nimmt den übergebenen String, durchsucht ihn nach der angegebenen Zeichenfolge, trennt den String jeweils an diesen Stellen auf (entfernt die “Trennzeichen” und bildet aus den Elementen eine Liste, die von oben nach unten gefüllt wird. Ein String KNX_EG_Kueche_InduktionsfeldL3_Lastausfall wird also als Liste

KNX
EG
Kueche
InduktionsfeldL3
Lastausfall

ausgegeben. Damit ist dann get(3) das Wort InduktionsfeldL3



Gesendet von iPad mit Tapatalk
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Epicblue
Beiträge: 26
Registriert: 20. Jan 2020 03:18
Answers: 0

Re: Rule für Sicherungsfall

Beitrag von Epicblue »

Vielen Dank für die ausführliche Beschreibung :)

Antworten