Ich zeige mal meine funktionierende Steuerung der RTR-Betriebsart.
Alle Devices sind bei mir gleichartig angelegt. Deshalb hier nur ein RTR Device (es handelt sich um einen Gira TS2plus, wie leicht am Thing zu erkennen - andere Channel wie z.B. Temperaturmessung lasse ich mal außen vor):
Code: Alles auswählen
Thing device GiraTSplus1_1_120 "TS2plus Bad EG" @ "KNX" [
address="1.1.120"
] {
Type number : opMode "Betriebsart ist" [ ga="5.005:<1/7/36" ] // letzter Teil der GA
Type number : opSet "Betriebsart soll" [ ga="5.005:1/7/28" ] // entspricht KO-Nummer
}
Die Items dazu:
Code: Alles auswählen
Group GHeat_Mode "Betriebsart Nr." <heating>
Group GHeat_Set "Betriebsart" <heating>
Number TS2plusBadEG_OpMode "Betriebsart ist" (GHeat_Mode) {channel="knx:device:bridge:GiraTSplus1_1_120:opMode"}
Number TS2plusBadEG_OpSet "Betriebsart soll" (GHeat_Set) {channel="knx:device:bridge:GiraTSplus1_1_120:opSet"}
Die Gruppenzugehörigkeit ist der Schlüssel für den nächsten Schritt. Alle Items aller RTR bei mir sind exakt so angelegt, d.h. die Gruppenzugehörigkeit ist exakt die selbe, der erste Teil des Itenmnamens ist pro RTR identisch, derzweite Teil des Itemnamens ist pro Funktion identisch (und damit innerhalb einer Gruppe identisch). Nun brauche ich exakt eine Rule (egal, wie viele RTR ich nutze):
Code: Alles auswählen
rule "Betriebsart RTR"
when
Member of GHeat_Mode changed
then
var Integer newMode
val mode = (triggeringItem.state as DecimalType).toBigDecimal.toBigInteger
val iName = triggeringItem.name.split("_").get(0).toString
logDebug("rtr","Name is: {}, Mode is: {}",iName,mode)
switch (mode) {
case mode.testBit(0) : newMode = 1
case mode.testBit(2) : newMode = 3
case mode.testBit(3) : newMode = 4
default : newMode = 2
}
val myItem = GHeat_Set.members.filter[ f | f.name.startsWith(iName) ].head
var Integer oldMode = 0
if(myItem.state instanceof Number) oldMode = (myItem.state as Number).intValue
if(oldMode != newMode) {
logDebug("rtr","Name is: {}, oldMode is: {}, newMode is: {}",myItem.name,oldMode,newMode)
myItem.postUpdate(newMode)
}
end
In der Sitemap ist das Item so eingetragen:
Code: Alles auswählen
Switch item=TS2plusBadEG_OpSet label="Betriebsart soll" mappings=[1="Komf",2="Stby",3="N8",4="Frost"]
Ich sende also die Zahlen 1, 2, 3 oder 4, wenn ich über die UI die Betriebsart auswähle. Ändere ich die Betriebsart am RTR direkt, so sendet knx die neue Betriebsart im Beispiel oben über die GA 1/7/36 an openHAB, woraufhin die Rule triggert (ein Member der Gruppe GHeat_Mode wurde geändert).
Die Rule zerlegt den Input in die entscheidenden Informationen, die in einer lokalen Konstanten gespeichert werden. mode enthält den neuen Status, und zwar als BigInteger. Für BigInteger stehen nette Bit-Operationen zur Verfügung.
Der erste Teil des Namens des Items, welches die Rule getriggert hat, wird in iName gespeichert.
Nun wird über das switch-case-Konstrukt die neue Betriebsart bestimmt und in der Integer Variablen newMode gespeichert.
Die Konstante myItem nimmt nun stellvertretend die Funktion des Zielitems ein (das ist dasjenige Item, welches sich in der Gruppe GHeat_Set befindet und mit dem gleichen Teilstring beginnt, wie iName)
In der Variablen oldMode landet der alte Modus.
Wenn sich die beiden Modi oldMode und newMode unterscheiden, wird das ZielItem per postUpdate auf die neue Betriebsart gesetzt.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet