Item Strukturen bequem kopieren
Bei Verwendung von relativer Item Adressierung können Teile des Item-Baumes einfach kopiert werden, um sie an anderer Stelle im Item-Baum zu verwenden.
Es sollen Fensterkontakte ausgewertet werden (zwei Kontakte je Fenster oder z.B. Hoppe Fenstergriffe). Hierbei ergeben zwei Kontakte drei sinnvolle Stati (verschlossen, gekippt, offen). Die Auswertung setzt die Informationen der zwei Kontakte auf eigene Items für die drei Stati um.
Diese Lösung soll mit möglichst wenig Aufwand für alle Fenster des Objekts kopiert werden. Mit normaler (absoluter) Item Adressierung kann das folgendermaßen gelöst werden:
Test:
Buero:
Reed1:
type: num
knx_dpt: 1
knx_cache: 4/1/5
visu_acl: rw
Reed2:
type: num
knx_dpt: 1
knx_cache: 4/1/6
visu_acl: rw
zu:
type: bool
enforce_updates: yes
eval: True if sh.Test.Buero.Reed1() == 1 and sh.Test.Buero.Reed2() == 1 else False
eval_trigger:
- Test.Buero.Reed1
- Test.Buero.Reed2
gekippt:
type: bool
enforce_updates: yes
eval: True if sh.Test.Buero.Reed1() == 0 and sh.Test.Buero.Reed2() == 1 else False
eval_trigger:
- Test.Buero.Reed1
- Test.Buero.Reed2
offen:
type: bool
enforce_updates: yes
eval: True if sh.Test.Buero.Reed1() == 0 and sh.Test.Buero.Reed2() == 0 else False
eval_trigger:
- Test.Buero.Reed1
- Test.Buero.Reed2
Wenn dieser Block für weitere Fenster kopiert wird, muss jedoch außer der Anpassung der Adressen für
Reed1
und Reed2
auch noch Buero
an diversen Stellen ersetzt werden, was einen gewissen Aufwand
erfordert und auch noch fehlerträchtig ist.
Mit relativer Item Adressierung kann das einfacher gelöst werden. Dann müssen nach dem Kopieren des Blocks nur
noch die Adressen für Reed1
und Reed2
angepasst werden:
Test:
Buero:
Reed1:
type: num
knx_dpt: 1
knx_cache: 4/1/5
visu_acl: rw
Reed2:
type: num
knx_dpt: 1
knx_cache: 4/1/6
visu_acl: rw
zu:
type: bool
enforce_updates: yes
eval: True if sh...Reed1() == 1 and sh...Reed2() == 1 else False
eval_trigger:
- ..Reed1
- ..Reed2
gekippt:
type: bool
enforce_updates: yes
eval: True if sh...Reed1() == 0 and sh...Reed2() == 1 else False
eval_trigger:
- ..Reed1
- ..Reed2
offen:
type: bool
enforce_updates: yes
eval: True if sh...Reed1() == 0 and sh...Reed2() == 0 else False
eval_trigger:
- ..Reed1
- ..Reed2
..<item>
referenziert hierbei ein Geschwister-Item. Es ist darauf zu achten, dass dort wo Items über
sh.<item>()
angesprochen werden (wie im eval
Attribut) dann drei statt der erwarteten zwei Punkte stehen.
Ausführliche Informationen zur relativen Item Adressierung sind unter relative Itemreferenzen zu finden.
Das Beispiel ließe sich noch weiter vereinfachen, indem die Einträge durch structs referenziert werden. Detaillierte Informationen hierzu gibt es auf structs (Item Strukturen)