Aber gern.
Die TS2plus liefern als Betriebsart ein Byte. Dabei ist Bit 4 immer gesetzt (+32) und die einzelnen Betriebsarten sind den unteren 4 Bits zugeordnet,
Die Wahl der Betriebsart erfolgt aber über einen Zahlenwert 1 bis 4 (entsprechend Bitposition +1, also Bit0 -> 1 ... Bit3 -> 4)
Beim Steuern versende ich also direkt den Zahlenwert 1 bis 4, für die Rückmeldung werte ich die Bits aus.
Ein Thing (die anderen sehen genauso aus)
Items:
rule:
Die TS2plus liefern als Betriebsart ein Byte. Dabei ist Bit 4 immer gesetzt (+32) und die einzelnen Betriebsarten sind den unteren 4 Bits zugeordnet,
- 0 (Wert 1) -> Komfort,
- 1 (Wert 2) -> Standby,
- 2 (Wert 4) -> Nachtabsenkung ,
- 3 (Wert 8) -> Frostschutz.
Die Wahl der Betriebsart erfolgt aber über einen Zahlenwert 1 bis 4 (entsprechend Bitposition +1, also Bit0 -> 1 ... Bit3 -> 4)
Beim Steuern versende ich also direkt den Zahlenwert 1 bis 4, für die Rückmeldung werte ich die Bits aus.
Ein Thing (die anderen sehen genauso aus)
Code:
Thing device GiraTSplus1_1_113 "TS2plus Wozi" @ "KNX" [
address="1.1.113",
fetch=false,
pingInterval=600,
readInterval=0
] {
Type number : tempIs "Temperatur ist" [ ga="<3/7/23" ]
Type number : tempSet "Temperatur soll" [ ga="9.001:3/7/26+<3/7/50" ]
Type number : opMode "Betriebsart ist" [ ga="5.005:<3/7/36" ]
Type number : opSet "Betriebsart soll" [ ga="5.005:3/7/28" ]
Type switch-control : heat "Heizen" [ ga="3/7/37" ]
}
Code:
Group GHeat "Heizung" <heating> (All)
Group GHeat_Mode "Betriebsart Nr." <heating> (GHeat)
Group GHeat_Set "Betriebsart" <heating> (GHeat)
//RTR Betriebsart ist
Number TS2plusBadEG_OpMode "Betriebsart ist" (GHeat_Mode) {channel="knx:device:bridge:GiraTSplus1_1_120:opMode"}
Number TS2plusBadOG_OpMode "Betriebsart ist" (GHeat_Mode) {channel="knx:device:bridge:GiraTSplus1_1_220:opMode"}
Number TS2plusEltern_OpMode "Betriebsart ist" (GHeat_Mode) {channel="knx:device:bridge:GiraTSplus1_1_210:opMode"}
Number TS2plusFlur_OpMode "Betriebsart ist" (GHeat_Mode) {channel="knx:device:bridge:GiraTSplus1_1_100:opMode"}
Number TS2plusKueche_OpMode "Betriebsart ist" (GHeat_Mode) {channel="knx:device:bridge:GiraTSplus1_1_130:opMode"}
Number TS2plusLaura_OpMode "Betriebsart ist" (GHeat_Mode) {channel="knx:device:bridge:GiraTSplus1_1_240:opMode"}
Number TS2plusMatty_OpMode "Betriebsart ist" (GHeat_Mode) {channel="knx:device:bridge:GiraTSplus1_1_230:opMode"}
Number TS2plusTechnik_OpMode "Betriebsart ist" (GHeat_Mode) {channel="knx:device:bridge:GiraTSplus1_1_140:opMode"}
Number TS2plusWozi_OpMode "Betriebsart ist" (GHeat_Mode) {channel="knx:device:bridge:GiraTSplus1_1_113:opMode"}
//
//RTR Betriebsart soll
Number TS2plusBadEG_OpSet "Betriebsart soll" (GHeat_Set) {channel="knx:device:bridge:GiraTSplus1_1_120:opSet"}
Number TS2plusBadOG_OpSet "Betriebsart soll" (GHeat_Set) {channel="knx:device:bridge:GiraTSplus1_1_220:opSet"}
Number TS2plusEltern_OpSet "Betriebsart soll" (GHeat_Set) {channel="knx:device:bridge:GiraTSplus1_1_210:opSet"}
Number TS2plusFlur_OpSet "Betriebsart soll" (GHeat_Set) {channel="knx:device:bridge:GiraTSplus1_1_100:opSet"}
Number TS2plusKueche_OpSet "Betriebsart soll" (GHeat_Set) {channel="knx:device:bridge:GiraTSplus1_1_130:opSet"}
Number TS2plusLaura_OpSet "Betriebsart soll" (GHeat_Set) {channel="knx:device:bridge:GiraTSplus1_1_240:opSet"}
Number TS2plusMatty_OpSet "Betriebsart soll" (GHeat_Set) {channel="knx:device:bridge:GiraTSplus1_1_230:opSet"}
Number TS2plusTechnik_OpSet "Betriebsart soll" (GHeat_Set) {channel="knx:device:bridge:GiraTSplus1_1_140:opSet"}
Number TS2plusWozi_OpSet "Betriebsart soll" (GHeat_Set) {channel="knx:device:bridge:GiraTSplus1_1_113:opSet"}
//
Code:
rule "Betriebsart RTR"
when
Member of GHeat_Mode changed
then
var Integer newMode
val mode = (triggeringItem.state as DecimalType).toBigDecimal.toBigInteger // nur für BigInteger steht testBit() zur Verfügung
val iName = triggeringItem.name.split("_").get(0).toString // erster Teil des Namens des Item, welches die Rule getriggert hat
logDebug("rtr","Name is: {}, Mode is: {}",iName,mode)
switch (mode) {
case mode.testBit(0) :newMode = 1 // Bit 0 -> 1
case mode.testBit(2) :newMode = 3 // Bit 2 -> 4
case mode.testBit(3) :newMode = 4 // Bit 3 -> 8
default :newMode = 2 // falls nichts anders zutrifft
}
var myItem = GHeat_Set.members.filter[ f | f.name.startsWith(iName) ].head // passendes Item aus der 2. Gruppe heraussuchen
var Integer oldMode = 0
if(myItem.state instanceof Number) oldMode = (myItem.state as Number).intValue // alten Modus bestimmen
if(oldMode != newMode) { // falls abweichend von neuem Modus
logDebug("rtr","Name is: {}, oldMode is: {}, newMode is: {}",myItem.name,oldMode,newMode)
myItem.postUpdate(newMode) // neuen Modus setzen
}
end



weil es bei mir auch ohne Probleme funktioniert. Sollwertverschiebung ist eigentlich nur dann interessant, wenn man über eine "externe" Schaltwippe per Impuls die Solltemperatur ändern will.
Kommentar