HashMap in Rule erweitern / hinzufügen ?

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

HashMap in Rule erweitern / hinzufügen ?

Beitrag von Steinspiel »

Moin,

Vor einiger Zeit hat mir der @udo1toni hier "meine" genialste Rule geschrieben.viewtopic.php?p=21565#p21565 ;)

Dadurch kann ich in einer Sitemap Räume auswählen, u.a. den "Go-Button" drücken und mein Saugroboter düst los... Alles klein, kompackt und läuft seit dem täglich! :-)

Nun habe ich mein Setup um Türkontakte erweitert, für jede Tür einen:

tk_16_Arbeitszimmer
tk_17_Bad
tk_18_Flur
tk_20_Kueche

und würde die Rule gern so erweitern das der Roboter nach der Abfrage der HashMap nicht nur los fährt wenn der jeweilige Raum ausgewäht ist, sondern auch NUR wenn der dazu passende Türkontakte OFFEN ist. So zu sagen als Sicherung...

Die Türkontakte habe ich einer Gruppe "gTKontk" zusammengefasst und kann mir Vorstellen das man eine zweite HashMap definiert in dem diese Eingetragen werden. Im THEN Bereich wird dann nicht nur geprüft ob das 1. Element der Gruppe "Raeume" ON ist sondern AUCH das dazu passende Element der Gruppe "gTKontk" OFFEN . Nur weiß ich überhaupt nicht wie ich das in der Rule formulieren soll!

Kann mir da jemand behilflich sein?

Anbei die Rule von @udo1toni

Code: Alles auswählen

import java.util.HashMap

val HashMap<String,String> Raeume = newHashMap("Robo_16_Arbeitszimmer_vw"    -> "app_segment_clean[16]",  // 16 - Arbeitszimmer
                                               "Robo_17_Bad_vw"              -> "app_segment_clean[17]",  // 17 - Bad
                                               "Robo_18_Flur_vw"             -> "app_segment_clean[18]",  // 18 - Flur
                                               "Robo_20_Kueche_vw"           -> "app_segment_clean[20]")  // 20 - Kueche

rule "vorauswahl_fuer_automatisches_saugen"

when

    Item Robo_Test_B changed to ON

then

        if(gRomms_vw.members.filter[i|i.state == ON].size == 0) {                               // auch der letzter Raum der Gruppe schon gesaugt (Sortierabfrage ?)
            logInfo("vacuum","Fertig mit Saugen!")

                if(Robo_Test_B.state != OFF)                                                    // Falls Schalter nicht OFF
                Robo_Test_B.postUpdate(OFF)                                                     // dann auf OFF
                return;
        }

    val vacRoom = gRomms_vw.members.filter[i|i.state == ON].sortBy[name].head                   // 1. Element der Gruppe das ON ist
    logInfo("vacuum","{}. Raum ({}) gewählt",Raeume,vacRoom.name)
               

    val String strRaum = Raeume.get(vacRoom.name)                                               // Variable initialisieren
    logInfo("vacuum","Raumzone {} gewählt",strRaum)

    Mi_1S_ActionsCommands.sendCommand(strRaum)                                                  // Raum saugen mit dem Kommando aus Variablen und Gruppe
    vacRoom.postUpdate(OFF)
    
    
end
bis dann, Steinspiel

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

Re: HashMap in Rule erweitern / hinzufügen ?

Beitrag von udo1toni »

Also, als Schuss ins Blaue:

Code: Alles auswählen

import java.util.HashMap

val HashMap<String,String> Raeume = newHashMap("Robo_16_Arbeitszimmer_vw"    -> "app_segment_clean[16]",  // 16 - Arbeitszimmer
                                               "Robo_17_Bad_vw"              -> "app_segment_clean[17]",  // 17 - Bad
                                               "Robo_18_Flur_vw"             -> "app_segment_clean[18]",  // 18 - Flur
                                               "Robo_20_Kueche_vw"           -> "app_segment_clean[20]")  // 20 - Kueche

rule "vorauswahl_fuer_automatisches_saugen"

when

    Item Robo_Test_B changed to ON

then

    if(gRomms_vw.members.filter[i|i.state == ON].size == 0) {                                   // auch der letzter Raum der Gruppe schon gesaugt (Sortierabfrage ?)
        logInfo("vacuum","Fertig mit Saugen!")
        if(Robo_Test_B.state != OFF)                                                            // Falls Schalter nicht OFF
            Robo_Test_B.postUpdate(OFF)                                                         // dann auf OFF
        return;
    }

    val vacRoom = gRomms_vw.members.filter[i|
        i.state == ON && 
        gTKontk.members.filter[j|j.name.contains(i.name.split("_").get(1))].head.state == OPEN
    ].sortBy[name].head                   // 1. Element der Gruppe das ON ist

    logInfo("vacuum","{}. Raum ({}) gewählt",Raeume,vacRoom.name)

    val String strRaum = Raeume.get(vacRoom.name)                                               // Variable initialisieren
    logInfo("vacuum","Raumzone {} gewählt",strRaum)

    Mi_1S_ActionsCommands.sendCommand(strRaum)                                                  // Raum saugen mit dem Kommando aus Variablen und Gruppe
    vacRoom.postUpdate(OFF)
    
end
Wenn die Zimmertür zu ist, wird der Raum übersprungen. Allerdings bleibt der Sauger so aktiv. Keine Ahnung, ob das so ok ist.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

Re: HashMap in Rule erweitern / hinzufügen ?

Beitrag von Steinspiel »

Moin,
udo1toni hat geschrieben: 6. Sep 2020 22:11 Also, als Schuss ins Blaue:
Na, der Schuss war nicht schlecht! ;-)

Habe das heute Nacht auf die Schnelle mal durchgespielt und es scheint zu funktionieren: Ist die Tür geschlossen wird der Raum übersprungen und der nächste angefahren, eigentlich genau das was ich wollte.

Auf jeden Fall dafür schon mal einen Herzlichen Dank!
Wenn die Zimmertür zu ist, wird der Raum übersprungen. Allerdings bleibt der Sauger so aktiv. Keine Ahnung, ob das so ok ist.
Da bin ich auch noch am Überlegen ob das egal ist oder nicht. Ist die Tür irgendwann mal wieder offen wird der Saugvorgang ja NICHT nachgeholt, somit wäre das egal. Ist der Trigger aber mal ein anderes als ein von Hand umgelegter Schalter (z.B. Handy meldet sich aus dem WLAN ab), dann wird der Saugvorgang nachgeholt, selbst wenn es nach Tagen ist...

Aber kannst Du mir erklären wie Du das bewerkstelligt hast?

Code: Alles auswählen

    val vacRoom_now = gRomms_now.members.filter[i|i.state == ON && 
	gTKontk.members.filter[j|j.name.contains(i.name.split("_").get(1))].head.state == OPEN
    ].sortBy[name].head 
Zeile 1 ist wie in Deiner alten Rule: es wird geprüft welchen Mitglieder der Gruppe "gRomms_now" ON sind UND
Zeile 2 die Mitgleider der Gruppe "gTKontk" werden dann wie sortiert?

Ich frage weil ich in "gRomms_now" sechs Räume habe: 16,17,18,19,20,21. In "gTKontk" sind aber nur fünf Türkontakte: 16, 17, 19, 20, 21 (sie heißen natürlich alle noch anders), trotzdem fährt der Sauger immer zum richtigen Raum! Außer in Raum 18, der hat keinen Türkontakt, da fährt er dann gar nicht hin. :-(

Wie funktioniert die Sortierung mit Raum UND Türkontackt?

Danke noch mal und ich finde das ganze Super! ;-)
bis dann, Steinspiel

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

Re: HashMap in Rule erweitern / hinzufügen ?

Beitrag von udo1toni »

Türkontakt: Oh, dann geht es natürlich nicht so einfach. Die schmutzige Variante wäre, einfach einen Türkontakt für den Raum 18 anzulegen, der immer auf OPEN steht (kann man per System started oder auch mittels persistence leicht erreichen).

Die Zeile

Code: Alles auswählen

gTKontk.members.filter[j|j.name.contains(i.name.split("_").get(1))].head.state == OPEN
erklärt:

Code: Alles auswählen

gTKontk        // Die Gruppe der Türkontakte
.members       // die unmittelbaren Member der Gruppe als Liste
.filter[j|     // filtere, j ist der Platzhalter
j.name         // für j.name muss gelten
.contains(     // enthält
i.name         // von i.name (das ist das aktuelle Schalteritem)
.split("_")    // teile den Namen am _
.get(1))       // nimm den 2. Teilstring
]
.head          // nimm das 1. Item
.state == OPEN // und prüfe, ob es den Status OPEN hat
Es wird also dasjenige Item herausgesucht, dessen Name den Teilstring nach dem ersten Unterstrich enthält. Durch einen lustigen Zufall ;) ist das genau das passende Item...

Wie wird die Rule eigentlich nachgetriggert? Es fehlt der Trigger, wenn der Sauger mit einem Raum fertig ist...
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

Re: HashMap in Rule erweitern / hinzufügen ?

Beitrag von Steinspiel »

Moin
udo1toni hat geschrieben: 8. Sep 2020 21:27 Die schmutzige Variante wäre, einfach einen Türkontakt für den Raum 18 anzulegen, der immer auf OPEN steht (kann man per System started oder auch mittels persistence leicht erreichen).
"schmutzige Varianten" sagen mir zu .. ;-)

"System started" kannte ich bis jetzt noch nicht (wirklich!), aber Supertrigger! Und was soll ich sagen, plötzlich wird auch Raum_18 gesaugt. ;-)

Danke auch für die Erklärung, Verstanden habe ich das soweit, nur die Syntax würde ich selbst nicht hinbekommen. Denn bei genauerem Überlegen habe ich gemerkt das mir noch ein weiteres "und" (&&) fehlt:

Der Sauger selbst steht im Raum_16, alle Abgleiche mit gewähltem Raum + dessen Türstatus machen nur Sinn wenn Türkontakt 16 immer zusätzlich abgefragt wird. Denn ist Tür_16 nicht offen kommt er ja nicht raus um durch die offenen Tür_17 zu fahren... ;-)

Wenn das geht, magst Du mir da noch mal behilflich sein?
Wie wird die Rule eigentlich nachgetriggert? Es fehlt der Trigger, wenn der Sauger mit einem Raum fertig ist...

Code: Alles auswählen

Item Mi_1S_StatusState changed from "Returning Dock" to "Charging"      // Roboter ist zurück in der Station
Ein Raum fertig, zurück ins Dock, dann bei Bedarf nächsten Raum. Ich glaube die Idee kam von Dir damals... Funktioniert auf jeden Fall .
bis dann, Steinspiel

Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

Re: HashMap in Rule erweitern / hinzufügen ?

Beitrag von Steinspiel »

Moin,
Steinspiel hat geschrieben: 9. Sep 2020 21:10 [...]
Der Sauger selbst steht im Raum_16, alle Abgleiche mit gewähltem Raum + dessen Türstatus machen nur Sinn wenn Türkontakt 16 immer zusätzlich abgefragt wird. Denn ist Tür_16 nicht offen kommt er ja nicht raus um durch die offenen Tür_17 zu fahren... ;-)

Wenn das geht, magst Du mir da noch mal behilflich sein?
Das habe ich jetzt am Anfang des "then Bereiches" so gelöst:

Code: Alles auswählen

[...]
then

    if(phos_aquara_ftk_r16_Open.state == CLOSED){			// wenn Raum_16 geschlossen -> Abbruch Saugvorgang
    logInfo("Tuerkontakt","Saugen Abbruch -> Raum_16 geschlossen")
    return;
    }
[...]    
Es funktioniert und scheint keine Auswirkungen auf irgendwas anderes zu haben. :-)
bis dann, Steinspiel

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

Re: HashMap in Rule erweitern / hinzufügen ?

Beitrag von udo1toni »

Ja, genau, das sollte passen.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Antworten