Ankündigung

Einklappen
Keine Ankündigung bisher.

Logik nur ausführen, wenn das watch_item über KNX verändert wurde

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Logik nur ausführen, wenn das watch_item über KNX verändert wurde

    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).

    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)
    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.

    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)
    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.

    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
    Danke für eure Hilfe!

    #2
    Naja, Du kannst ja mal das trigger Objekt in Deiner Logik zu Hilfe nehmen, z.B.:
    Code:
    logger.info('Triggered by:'+trigger['by'])    # e.g. 'scheduler'
    
    if trigger['source'] is not None:
        logger.info('Triggersource:'+trigger['source'])
        
    if trigger['dest'] is not None:
        logger.info('Trigger dest:'+trigger['dest'])
        
    logger.info('Triggervalue:'+str(trigger['value']))
    Damit bekommst Du ein paar Details heraus wer wo getriggert hat

    Kommentar


      #3
      Hi,

      falls Du mit trigger nicht weiter kommst: Mach einfach zu jedem modeX-Item ein modeXknx-Unteritem. Diese sind genau so wie die modeX-Items, nur ohne knx_send und visu_acl, dafür aber mit enforce_updates = true. Den watch_item für die 2. Logik machst Du dann von diesen modelXknx-Items abhängig. Jetzt wird Deine 2. Logik erst über den Status getriggert.

      Eine 3. Alternative wäre, ganz auf die 2. Logik zu verzichten, dem current_mode eine GA zu geben und mit den Tastern auf diese GA direkt nummerische Werte zu senden. Dann brauchst Du aber auch eine Taste für current_mode = 0.

      Gruß, Waldemar
      OpenKNX www.openknx.de

      Kommentar

      Lädt...
      X