Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Items in eine Logic übergeben und ändern

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

    - √ - Items in eine Logic übergeben und ändern

    Hallo an alle SmartHome.py Freunde,

    ich meine, dies schon gelesen zu haben und habe sowohl das Forum wie auch die Dokumentation durchforstet, bin aber nicht fündig geworden. Daher bitte ich um Hilfe für folgendes:

    Ich möchte eine Logic für mehrere Items, bzw. mehrere Gruppen von Items verwenden. Es müsste möglich sein, mehrere Einträge für die gleiche Logic in der logic.conf zu konfigurieren und die Items jeweils als Attribute dort anzugeben. Dies funktioniert soweit, wenn der Name der Items verwendet wird; funktioniert aber noch nicht, wenn diese Items geändert werden sollen.

    Zur geplanten Funktionsweise der Logic: Die Logik setzt Telegramme von Wippen in Telegramme zur Aktivierung der Treppenhauslichtfunktion eines Aktors um. Die Wippen werden entsprechend der Statustelegramme des Aktors nachgeführt.

    items.conf:
    Code:
    [aa]
    	name = Aussenanlage
        sv_page = room
        sv_img = scene_garden.png
        [[licht]]
        	[[[west]]]
            	name = West
    			type = bool
    			visu_acl = rw
    			knx_dpt = 1
    			knx_cache = 8/3/223
    			knx_send = 8/3/223
    	    	[[[[status]]]]
        	    	name = Status
    				type = bool
    				visu_acl = rw
    				knx_dpt = 1
    				knx_cache = 8/1/223
    				knx_send = 8/1/223
    	    	[[[[treppenhauslichtfunktion]]]]
        	    	name = Treppenhauslichtfunktion
    				type = bool
    				visu_acl = rw
    				knx_dpt = 1
    				knx_cache = 8/3/224
    				knx_send = 8/3/224
    	    	[[[[dauerein]]]]
        	    	name = Dauer Ein
    				type = bool
    				visu_acl = rw
    				knx_dpt = 1
    				knx_cache = 8/3/225
    				knx_send = 8/3/225
    logic.conf:
    Code:
    [aussenbeleuchtung_west]
    	filename = aussenbeleuchtung.py
    	watch_item = aa.licht.west | aa.licht.west.status
    	rocker_item = aa.licht.west
    	status_item = aa.licht.west.status
    	switch_item = aa.licht.west.treppenhauslichtfunktion
    aussenbeleuchtung.py:
    Code:
    import logging
    
    logger.info("starte")
    try:
      logic.rocker_item
      logic.status_item
      logic.switch_item
    except NameError:
    	logger.error("The following 3 attributes must be defined when calling this logic: rocker_item, status_item, switch_item")
    else:
    	logger.debug("Parameters ok.")
    changed_item = sh.return_item(trigger['source'])
    if changed_item.changed_by().startswith('KNX:'):
    	logger.debug('item geändert durch Telegramm vom Bus.')
    	##### dies funktioniert: #####
    	if trigger['source'].endswith(logic.rocker_item):
    		if trigger['value']:
    	##### dies funktioniert NICHT: #####
    			sh.item[logic.switch_item](1)
    		else:
    			sh.aa.licht.west.treppenhauslichtfunktion(0)
    			sh.aa.licht.west.dauerein(0)
    	elif trigger['source'].endswith("aa.licht.nord.status"):
    		if trigger['value']:
    			sh.aa.licht.west(1)
    		else:
    			sh.aa.licht.west(0)
    else:
    	logger.debug('item geändert durch smartHome, keine Aktion.')
    Log:
    Code:
    2014-09-29 18:52:44,239 DEBUG    Main         knx: 1.1.4 set 8/3/223 to True -- __init__.py:parse_telegram:190
    2014-09-29 18:52:44,247 DEBUG    Main         Item aa.licht.west = True via KNX 1.1.4 8/3/223 -- item.py:__update:363
    2014-09-29 18:52:44,254 DEBUG    Main         Triggering aussenbeleuchtung_west - by: Item source: aa.licht.west dest: None value: True -- scheduler.py:trigger:162
    2014-09-29 18:52:44,268 INFO     aussenbeleuchtung_west starte -- aussenbeleuchtung.py:<module>:15
    2014-09-29 18:52:44,273 DEBUG    aussenbeleuchtung_west Parameters ok. -- aussenbeleuchtung.py:<module>:21
    2014-09-29 18:52:44,278 DEBUG    aussenbeleuchtung_west item geändert durch Telegramm vom Bus. -- aussenbeleuchtung.py:<module>:24
    2014-09-29 18:52:44,285 ERROR    aussenbeleuchtung_west Logic: aussenbeleuchtung_west, File: /usr/smarthome/logics/aussenbeleuchtung.py, Line: 27, Method: <module>, Exception: 'SmartHome' object has no attribute 'item' -- scheduler.py:_task:334
    Traceback (most recent call last):
      File "/usr/smarthome/lib/scheduler.py", line 327, in _task
        exec(obj.bytecode)
      File "/usr/smarthome/logics/aussenbeleuchtung.py", line 27, in <module>
        sh.item[logic.rocker_item](1)
    AttributeError: 'SmartHome' object has no attribute 'item'
    Vielen Dank!

    #2
    Hallo,

    was soll denn der Aufruf von sh.item[logic.rocker_item](1) bewirken?
    Es gibt keine Methode in sh die item heist.

    Bis bald

    Marcus

    Kommentar


      #3
      Hallo Marcus,

      ich möchte in der Logic aussenbeleuchtung.py Items verwenden und ändern, das als Attribute zur Logic konfiguriert sind. Im Python Script würden diese dann z.B. rocker_item, status_item, switch_item genannt werden und auf die "echten" Items aa.licht.west, aa.licht.west.status, aa.licht.west.treppenhauslichtfunktion verweisen.

      Hintergrund dafür ist der Gedanke, das gleiche Python Script aussenbeleuchtung.py dann - anders konfiguriert - auch für Nord, Ost, Süd usw. verwenden zu können, etwa wie folgt:

      Code:
      [aussenbeleuchtung_nord]
      	filename = aussenbeleuchtung.py
      	watch_item = aa.licht.nord | aa.licht.nord.status
      	rocker_item = aa.licht.nord
      	status_item = aa.licht.nord.status
      	switch_item = aa.licht.nord.treppenhauslichtfunktion
      [aussenbeleuchtung_west]
      	filename = aussenbeleuchtung.py
      	watch_item = aa.licht.west | aa.licht.west.status
      	rocker_item = aa.licht.west
      	status_item = aa.licht.west.status
      	switch_item = aa.licht.west.treppenhauslichtfunktion
      [aussenbeleuchtung_ost]
      	filename = aussenbeleuchtung.py
      	watch_item = aa.licht.ost | aa.licht.ost.status
      	rocker_item = aa.licht.ost
      	status_item = aa.licht.ost.status
      	switch_item = aa.licht.ost.treppenhauslichtfunktion
      [aussenbeleuchtung_sued]
      	filename = aussenbeleuchtung.py
      	watch_item = aa.licht.sued | aa.licht.sued.status
      	rocker_item = aa.licht.sued
      	status_item = aa.licht.sued.status
      	switch_item = aa.licht.sued.treppenhauslichtfunktion
      Da die Attribute - und nun verzeiht mir, ich bin kein Python Spezialist! - wohl als str interpretiert werden, fehlt mir jetzt der Weg, von einem str (hier switch_item) zu einem sh Item zu kommen und dies dann zu ändern.

      Oder kurz: die von Dir genannte Zeile soll das gleiche bewirken wie
      Code:
      sh.aa.licht.west.treppenhauslichtfunktion(1)
      Viele Grüße!

      Kommentar


        #4
        Hi,

        da muss man Marcus nicht bemühen, nur die Doku

        Code:
        sh.return_item(path)
        
        Returns an item object for the specified path. E.g. sh.return_item('first_floor.bath')
        Gruß, Waldemar
        OpenKNX www.openknx.de

        Kommentar


          #5
          Vielen Dank!

          Ich werde erst am Wochenende wieder zuhause sein, um es auszuprobieren.
          Wäre das folgende Konstrukt dann korrekt?

          Code:
          sh.return_item(switch_item)(1)
          Viele Grüße,

          Erik

          Kommentar


            #6
            Vielen Dank!

            Hier noch einmal zusammengefasst die funktionsfähige Konfiguration:

            Die Logik setzt Telegramme von Wippen in Telegramme zur Aktivierung der Treppenhauslichtfunktion eines Aktors um. Die Wippen werden entsprechend der Statustelegramme des Aktors nachgeführt.

            Da die Logik für alle derart verwendeten Ausgänge des Aktors verwendet werden soll, wird sie in der logic.conf mehrmals für unterschiedliche Items bzw. Gruppen von Items konfiguriert.

            items.conf:
            Code:
            [aa]
            	name = Aussenanlage
                sv_page = room
                sv_img = scene_garden.png
                [[licht]]
                	[[[west]]]
                    	name = West
            			type = bool
            			visu_acl = rw
            			knx_dpt = 1
            			knx_cache = 8/3/223
            			knx_send = 8/3/223
            	    	[[[[status]]]]
                	    	name = Status
            				type = bool
            				visu_acl = rw
            				knx_dpt = 1
            				knx_cache = 8/1/223
            				knx_send = 8/1/223
            	    	[[[[treppenhauslichtfunktion]]]]
                	    	name = Treppenhauslichtfunktion
            				type = bool
            				visu_acl = rw
            				knx_dpt = 1
            				knx_cache = 8/3/224
            				knx_send = 8/3/224
            	    	[[[[dauerein]]]]
                	    	name = Dauer Ein
            				type = bool
            				visu_acl = rw
            				knx_dpt = 1
            				knx_cache = 8/3/225
            				knx_send = 8/3/225
                ....
            logic.conf:
            Code:
            [aussenbeleuchtung_nord]
            	filename = aussenbeleuchtung.py
            	watch_item = aa.licht.nord | aa.licht.nord.status
            	continuous_item = aa.licht.nord.dauerein 
            	rocker_item = aa.licht.nord 
            	status_item = aa.licht.nord.status 
            	switch_item = aa.licht.nord.treppenhauslichtfunktion 
            [aussenbeleuchtung_west]
            	filename = aussenbeleuchtung.py
            	watch_item = aa.licht.west | aa.licht.west.status
            	continuous_item = aa.licht.west.dauerein 
            	rocker_item = aa.licht.west 
            	status_item = aa.licht.west.status 
            	switch_item = aa.licht.west.treppenhauslichtfunktion 
            [aussenbeleuchtung_sued]
            	filename = aussenbeleuchtung.py
            	watch_item = aa.licht.sued | aa.licht.sued.status
            	continuous_item = aa.licht.sued.dauerein 
            	rocker_item = aa.licht.sued 
            	status_item = aa.licht.sued.status 
            	switch_item = aa.licht.sued.treppenhauslichtfunktion
            aussenbeleuchtung.py:
            Code:
            import logging
            
            logger.info("starting")
            changed_item = sh.return_item(trigger['source'])
            if changed_item.changed_by().startswith('KNX:') or changed_item.changed_by().startswith('Visu:'):
                if trigger['source'].endswith(logic.rocker_item):
                    if trigger['value']:
                        sh.return_item(logic.switch_item)(1)
                    else:
                        sh.return_item(logic.switch_item)(0)
                        sh.return_item(logic.continuous_item)(0)
                elif trigger['source'].endswith(logic.status_item):
                    if trigger['value']:
                        sh.return_item(logic.rocker_item)(1)
                    else:
                        sh.return_item(logic.rocker_item)(0)
            else:
                logger.debug('item.changed_by() indicates item changed by smartHome: no Action.')
            logger.info("done")
            Vielen Grüße,

            fivesails

            Kommentar

            Lädt...
            X