Zwei items in eine Selection

GUI Relevanten, PaperUI, BasicUI, HabPanel ...

Moderatoren: seppy, udo1toni

Antworten
julianpe
Beiträge: 31
Registriert: 28. Sep 2020 11:38

Zwei items in eine Selection

Beitrag von julianpe »

Hallo zusammen,

ich beschäftige mich gerade mit meiner KNX Installation mit Präsenzmeldern und den ext. Tastern lang / kurz, um ein dauerhaftes Übersteuern des Präsenzmelders mit AN oder AUS zu realisieren.
Das funktioniert an den Tastern soweit schon sehr gut. Gerne würde ich nun dieses Verhalten auch gerne in meine Openhab Sitemap integrieren.

Der KNX Part:

Code: Alles auswählen

Objekt: Bad-Ext-Taster-lang, Schreibend, GA: 2/7/4
Objekt: Bad-Ext-Taster-kurz, Schreibend, GA: 2/7/5
Objekt: Bad-Handbetrieb-Status, Lesend, GA: 2/7/3
Wie kann ich diese drei Informationen sinnvollerweise in ein Item Element der Sitemap integrieren?
Hierzu habe ich aus dem Wiki Beispiel folgendes Element gefunden:

Code: Alles auswählen

            Selection item=LR_TV_Channel mappings=[0="off", 1="DasErste", 2="BBC One", 3="Cartoon Network"]
Hier kann man dem item drei unterschiedliche Befehle zuordnen, bspw:

Code: Alles auswählen

Bezeichnung: Automatik, Wert: 0, GA-Zuordnung: 2/7/4 = AUS, 2/7/5 = AUS
Bezeichnung: Dauer EIN: Wert: 1, GA-Zuordnung: 2/7/4 = AUS, 2/7/5 = EIN
Bezeichnung: Dauer AUS: Wert: 2, GA-Zuordnung: 2/7/4 = EIN, 2/7/5 = AUS 
Wie bekomme ich diese Informationen nun kombiniert?

Vielen Dank im Voraus

Gruß
Julian

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

Re: Zwei items in eine Selection

Beitrag von udo1toni »

Da Du hier mit zwei GA arbeiten musst, wird Dir nichts anderes übrig bleiben, als eine Rule zu verwenden (bzw. derer zwei).

Ich gehe davon aus, dass Du noch ein weiteres Item hast, anhand dessen Du den Status der zweiten GA erkennen kannst. Sieht dann etwa so aus:

Code: Alles auswählen

rule "set override"
when
    Item MeinNumberItem received command // Das Item wurde über die UI geschaltet
then
    val nValue = if(receivedCommand instanceof Number) (receivedCommand as Number) else 0
    switch(nValue) {
        case 0: {
            automatik.sendCommand(0)
            licht.sendCommand(0)
        }
        case 2: {
            automatik.sendCommand(1)
            licht.sendCommand(0)
        }
        case 3: {
            automatik.sendCommand(1)
            licht.sendCommand(1)
        }
    }
end

rule "set override"
when
    Item licht changed or // Licht wurde geschaltet
    Item automatik changed // Automatik wurde geschaltet
then
    var Integer iValue = if(licht.state == ON) 1 else 0
    iValue += if(automatik.state == ON) 2 else 0
    MeinNumberItem.postUpdate(iValue)
end
Die erste Rule schaltet abhängig von der UI die Zwangssteuerung ein oder aus und gleichzeitg das Licht an oder aus. Zu beachten ist, dass die Tasten 0, 2 und 3 codieren, nicht 0,1 und 2. Das höherwertige Bit codiert die Zwangssteuerung, das niederwertige Bit den Zustand des Lichts.

Die zweite Rule reagiert auf Zustandsänderungen (Zwangssteuerung vom Bus aus) und setzt das Item für die UI entsprechend.

Die erste Rule kann mit Tricks auch kürzer gestaltet werden:

Code: Alles auswählen

rule "set override"
when
    Item MeinNumberItem received command // Das Item wurde über die UI geschaltet
then
    if(!(receivedCommand instanceof Number))
        return;
    val mode = (receivedCommand as DecimalType).toBigDecimal.toBigInteger

    automatik.sendCommand(mode.testBit(1))
    licht.sendCommand(mode.testBit(0))
end
Allerdings ist da vielleicht nicht so gut erkennbar, was genau passiert...
openHAB2.5.12 in einem Debian-Container (Proxmox, LXC)

Antworten