Hallo zusammen,
kann ich irgendwie bestimmen, dass eine Logik nur dann ausgeführt wird, wenn das watch_item NUR via KNX und nicht über eine andere Logik verändert wurde?
Kann ich das in der Logik irgendwie abfragen? In Folge die Erklärung, vielleicht habe ich in der Implementierung auch einen Denkfehler, wenn ja, dann stehe ich gerade auf dem Schlauch...
Problem ist meine Lüftersteuerung mit 6 Eingangs und 6 Rückmeldungskanälen. Ich habe mir dazu einen current_mode definiert, den ich aus der Visu setze.
Wird diese mode verändert, wird der jeweilige Mode am Lüfter via KNX geschalten. Im Gerät wird beim Schalten eines Kanals etwas zeitverzögert der neue Rückmeldungskanal auf 1 gesetzt, der alte auf 0. Der erste Eintrag ist zum Ausschalten aller Kanäle (ergo des Lüfters).
Damit ich auch bei Drücken eines Schalters im Raum ein Update des current_mode bekomme, habe ich eine weitere Logik gebaut. Diese wird implizit leider auch durch Schalten via Visu ausgelöst. Ist der neue Rückmeldungskanal noch nicht belegt, schaltet in Folge mein gesetzter current_mode auf den alten zurück. Daher würde ich die untenstehende Logik gerne nur dann ausführen, wenn der sh.office.ventilation.modeX via KNX geändert wurde.
Meine Logik 1 triggert nun bei Änderung des Mode die 2te Logik. Da die Rückmeldung aber noch nicht zwingend umgestellt ist, führt das dazu, dass das Schalten oft nicht funktioniert. Anbei noch die Itemdefinition.
Danke für eure Hilfe!
kann ich irgendwie bestimmen, dass eine Logik nur dann ausgeführt wird, wenn das watch_item NUR via KNX und nicht über eine andere Logik verändert wurde?
Kann ich das in der Logik irgendwie abfragen? In Folge die Erklärung, vielleicht habe ich in der Implementierung auch einen Denkfehler, wenn ja, dann stehe ich gerade auf dem Schlauch...
Problem ist meine Lüftersteuerung mit 6 Eingangs und 6 Rückmeldungskanälen. Ich habe mir dazu einen current_mode definiert, den ich aus der Visu setze.
Wird diese mode verändert, wird der jeweilige Mode am Lüfter via KNX geschalten. Im Gerät wird beim Schalten eines Kanals etwas zeitverzögert der neue Rückmeldungskanal auf 1 gesetzt, der alte auf 0. Der erste Eintrag ist zum Ausschalten aller Kanäle (ergo des Lüfters).
Code:
[VentilationLogic] filename = ventilation.py watch_item = office.ventilation.current_mode
Code:
if sh.office.ventilation.current_mode()==0: sh.office.ventilation.mode1(0) sh.office.ventilation.mode2(0) sh.office.ventilation.mode3(0) sh.office.ventilation.mode4(0) sh.office.ventilation.mode5(0) sh.office.ventilation.mode6(0) elif sh.office.ventilation.current_mode()==1 and not sh.office.ventilation.mode1(): sh.office.ventilation.mode1(1) elif sh.office.ventilation.current_mode()==2 and not sh.office.ventilation.mode2(): sh.office.ventilation.mode2(1) elif sh.office.ventilation.current_mode()==3 and not sh.office.ventilation.mode3(): sh.office.ventilation.mode3(1) elif sh.office.ventilation.current_mode()==4 and not sh.office.ventilation.mode4(): sh.office.ventilation.mode4(1) elif sh.office.ventilation.current_mode()==5 and not sh.office.ventilation.mode5(): sh.office.ventilation.mode5(1) elif sh.office.ventilation.current_mode()==6 and not sh.office.ventilation.mode6(): sh.office.ventilation.mode6(1)
Code:
[VentilationLogicSwitchOffice] filename = ventilation_switch_office.py watch_item = office.ventilation.mode1 | office.ventilation.mode2 | office.ventilation.mode3 | office.ventilation.mode4 | office.ventilation.mode6 | office.ventilation.mode6
Code:
if not sh.office.ventilation.mode1() and not sh.office.ventilation.mode2() and not sh.office.ventilation.mode3() and not sh.office.ventilation.mode4() and not sh.office.ventilation.mode5() and not sh.office.ventilation.mode6(): sh.office.ventilation.current_mode(0) if sh.office.ventilation.mode1() and not sh.office.ventilation.current_mode()==1: sh.office.ventilation.current_mode(1) if sh.office.ventilation.mode2() and not sh.office.ventilation.current_mode()==2: sh.office.ventilation.current_mode(2) if sh.office.ventilation.mode3() and not sh.office.ventilation.current_mode()==3: sh.office.ventilation.current_mode(3) if sh.office.ventilation.mode4() and not sh.office.ventilation.current_mode()==4: sh.office.ventilation.current_mode(4) if sh.office.ventilation.mode5() and not sh.office.ventilation.current_mode()==5: sh.office.ventilation.current_mode(5) if sh.office.ventilation.mode6() and not sh.office.ventilation.current_mode()==6: sh.office.ventilation.current_mode(6)
Code:
[[ventilation]] [[[current_mode]]] type = num visu_acl = rw [[[mode1]]] type = bool visu_acl = rw knx_dpt = 1 knx_send = 2/3/101 knx_cache = 2/3/107 [[[mode2]]] type = bool visu_acl = rw knx_dpt = 1 knx_send = 2/3/102 knx_cache = 2/3/108 [[[mode3]]] type = bool visu_acl = rw knx_dpt = 1 knx_send = 2/3/103 knx_cache = 2/3/109 [[[mode4]]] type = bool visu_acl = rw knx_dpt = 1 knx_send = 2/3/104 knx_cache = 2/3/110 [[[mode5]]] type = bool visu_acl = rw knx_dpt = 1 knx_send = 2/3/105 knx_cache = 2/3/111 [[[mode6]]] type = bool visu_acl = rw knx_dpt = 1 knx_send = 2/3/106 knx_cache = 2/3/112
Kommentar