Ankündigung

Einklappen
Keine Ankündigung bisher.

Taster-Doppelklick via Logik

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

    #16
    So ganz will es noch nicht.. aber fast
    Hier mein Item:
    Code:
      [[Playlist_Andy]]
          [[[Load]]]
          type = bool
          enforce_updates = true
          visu_acl = rw        
          knx_listen=2/2/1
          knx_dpt=1
          multiclick
          click_count = 2
            [[[[singleclick]]]]
                    type = bool
                    enforce_updates = true
                    visu_acl = rw 
                    knx_dpt=1
            [[[[multiclick]]]]
                    type = bool
                    enforce_updates = true
                    visu_acl = rw
                    knx_dpt = 1
                    knx_send = 9/0/0
                    squeezebox_send = <playerid> playlist index -1
    Das meine (theoretische) logic.conf:
    Code:
    [Mehrfachklick]
    filename = multiclick.py
    watch_item = *:multiclick
    Und hier mein multiclick.py:
    Code:
    #!/usr/bin/env python   
    logger.info(trigger)
    
    invalue = trigger['value']
    item = sh.return_item(trigger['source'])
    scitem = sh.return_item(trigger['source']+'.singleclick')
    mcitem = sh.return_item(trigger['source']+'.multiclick')  
    if 'click_count' in item.conf: 
        count = int(item.conf['click_count'])
        if hasattr(logic, 'save_state_' + item.id()):
           if item.prev_update_age() < 0.8:
              val = int(getattr(logic, 'save_state_' + item.id())) + 1
              setattr(logic, 'save_state_' + item.id(), val)
              logger.debug("Klickcount: "+str(val))
           else:
              setattr(logic, 'save_state_' + item.id(), 1)  
    
        else:
             setattr(logic, 'save_state_' + item.id(), 1) 
    
        if int(getattr(logic, 'save_state_' + item.id())) > count-1:       
           #sh.scheduler.remove('singleclick')
           sh.scheduler.change('singleclick', active=False)
           setattr(logic, 'save_state_' + item.id(), 0)
           logger.debug("Fuehre Multiclickitem aus")
           mcitem(1)
        else: 
           logger.debug("Fuehre Singleclickitem aus")  
           next_time = sh.now() + dateutil.relativedelta.relativedelta(seconds=1)
           sh.scheduler.add('singleclick', scitem, prio=3, cron=None, cycle=None, value=invalue, offset=None, next=next_time)
           #sh.scheduler.trigger('singleclick', obj=scitem, by='multiclick', source=None, value=invalue, dest=None, prio=3, dt=next_time)
    So far so good. Das mit dem scheduler.remove wollte irgendwie nicht funktionieren, keine Ahnung warum!? Mit add statt trigger und change statt remove habe ich derzeit zumindest die gewünschte Funktionalität. Der Debug-Code kommt hier:
    Code:
    2014-05-22 00:52:00,428 DEBUG    Main         knx: 0.0.0 set 2/2/1 to True -- __init__.py:parse_telegram:202
    2014-05-22 00:52:00,439 DEBUG    Main         Item Squeezebox_KG.Playlist_Andy.Load = True via KNX 0.0.0 2/2/1 -- item.py:__update:363
    2014-05-22 00:52:00,446 DEBUG    Main         Triggering Mehrfachklick - by: Item source: Squeezebox_KG.Playlist_Andy.Load dest: None value: True -- scheduler.py:trigger:162
    2014-05-22 00:52:00,454 INFO     Mehrfachklick {'dest': None, 'source': 'Squeezebox_KG.Playlist_Andy.Load', 'by': 'Item', 'value': True} -- multiclick.py:<module>:2
    2014-05-22 00:52:00,460 DEBUG    Mehrfachklick Fuehre Singleclickitem aus -- multiclick.py:<module>:28
    2014-05-22 00:52:01,023 DEBUG    Main         knx: 0.0.0 set 2/2/1 to True -- __init__.py:parse_telegram:202
    2014-05-22 00:52:01,037 DEBUG    Main         Triggering Mehrfachklick - by: Item source: Squeezebox_KG.Playlist_Andy.Load dest: None value: True -- scheduler.py:trigger:162
    2014-05-22 00:52:01,043 INFO     Mehrfachklick {'dest': None, 'source': 'Squeezebox_KG.Playlist_Andy.Load', 'by': 'Item', 'value': True} -- multiclick.py:<module>:2
    2014-05-22 00:52:01,051 DEBUG    Mehrfachklick Klickcount: 2 -- multiclick.py:<module>:14
    2014-05-22 00:52:01,056 INFO     Mehrfachklick Deactivating logic: singleclick -- scheduler.py:change:261
    2014-05-22 00:52:01,061 DEBUG    Mehrfachklick Fuehre Multiclickitem aus -- multiclick.py:<module>:25
    2014-05-22 00:52:01,067 DEBUG    Mehrfachklick Item Squeezebox_KG.Playlist_Andy.Load.multiclick = True via Logic None None -- item.py:__update:363
    2014-05-22 00:52:01,083 DEBUG    Main         knx: 0.0.0 set 9/0/0 to 01 -- __init__.py:parse_telegram:193
    Sieht ja im Großen und Ganzen alles gut aus.. allerdings habe ich folgende Probleme:

    - Problem 1: das *:multiclick im watch_item will nicht funktionieren. Habe kompletten Smarthomeordner gelöscht und mittels git clone -b develop git://github.com/mknx/smarthome.git auf den Developerbranch umgestellt. Allerdings wird hier die Logik einfach nicht geschalten, sondern nur, wenn ich explizit mein Item angebe
    - Problem 2: Das multiclick-Item wird wohl ausgeführt, da das knx_send 9/0/0 funktioniert. Allerdings funktioniert das squeezebox_send nicht. Das Abstruse an der Sache: Forme ich das mcitem so um, dass es ein anderes Item mit genau dem gleichen Inhalt (squeezebox_send = ...) aufruft, passt alles. Es scheint also irgendwie am "Unteritem multiclick" zu liegen!???

    Vielen Dank für die hoffentlich letzte Hilfestellung

    Kommentar


      #17
      Kurze Info.. ich habe jetzt die Squeezebox-Sache durch ein eval und eval_trigger in einem eigenen Item gelöst, das auf das multiclick verweist. Ist aber alles andere als übersichtlich und nobel.. Hat wer ne Idee, warum es anders nicht funktioniert?

      Über Hinweise bezüglich *:multiclick wäre ich auch froh.
      Thanks!

      Kommentar


        #18
        Wär's möglich, das prev_update_age in den Develop-Branch zu commiten? Die Einträge sind nach einem git pull immer weg.. dabei scheint es die einzige Möglichkeit zu sein, sowas wie einen Mehrfachklick zu realisieren. prev_age funktioniert definitiv nicht

        Merci vielmals!
        Und falls wer ne Idee wegen meinen obigen Anmerkungen hat - gerne

        Kommentar


          #19
          Hallo,

          ich muss mich mal mit dem Thema Multiklick beschäftigten, das dauert aber noch ein bisschen. Wenn ich eine Lösung anbiete, sollte diese so generisch nutzbar sein, das man zwischen 1,2,3... Klicks unterscheiden kann.

          Wenn man seinen Änderungen lokal eincheckt, so sollten diese bei einem git pull erhalten bleiben.

          Bis bald

          Marcus

          Kommentar


            #20
            Perfekt. Ja, das mit git commit hab ich mal gemacht - schauen, ob das so klappt wie es soll

            Das mit nem Multiklick direkt mit einzubinden wäre genial.

            Kommentar


              #21
              Möchte das hier nochmals kurz ausgraben... wäre echt genial, wenn das integriert werden könnte, sodass es auch ohne der oben angesprochenen Probleme funktioniert.

              Die Sache mit den Unterelementen hatte ich übrigens bei einem anderen Plugin / bei einer Logik auch. Elemente erster Rangordnung haben funktioniert, bei Unterelementen klappte es dann nicht mehr. Glaub es war bei der Wunderground-Logik, kann mich aber leider nicht mehr ganz erinnern

              Anyhow, Danke schon mal!

              Kommentar


                #22
                Hallo,
                ich krame mal den alten Thread raus.

                Wie würde man heute den KNX Doppelklick erkennen und verarbeiten?

                Danke Euch.

                Kommentar


                  #23
                  Ich binde eine Logik ein:
                  Code:
                  mehrfachklick:
                      filename: multiclick.py
                      watch_item:
                      -   '*:multiclick'
                  Logik.. könnte man sicher noch etwas optimieren:
                  Code:
                  #!/usr/bin/env python
                  # -*- coding: utf-8 -*-
                  logger.info(trigger)
                  
                  invalue = trigger['value']
                  item = items.return_item(trigger['source'])
                  scitem = items.return_item(trigger['source']+'.singleclick')
                  mcitem = items.return_item(trigger['source']+'.multiclick')
                  scheduletask = 'singleclick-'+str(item)
                  logger.debug("Multiclick getriggert durch: {0}".format(item))
                  #if item() == 1:
                  if 'click_count' in item.conf:
                      count = int(item.conf['click_count'])
                      logger.info("Previous Age: {0}".format(item.prev_update_age()))
                      if hasattr(logic, 'save_state_' + item.id()):
                         if item.prev_update_age() < 0.8:
                            val = int(getattr(logic, 'save_state_' + item.id())) + 1
                            setattr(logic, 'save_state_' + item.id(), val)
                            logger.info("Klickcount: "+str(val))
                         else:
                            setattr(logic, 'save_state_' + item.id(), 1)
                  
                      else:
                           setattr(logic, 'save_state_' + item.id(), 1)
                  
                      if int(getattr(logic, 'save_state_' + item.id())) > count-1:
                         sh.scheduler.change(scheduletask, active=False)
                         setattr(logic, 'save_state_' + item.id(), 0)
                         logger.info("Fuehre Multiclickitem aus")
                         mcitem(1)
                      else:
                         logger.info("Fuehre Singleclickitem aus")
                         next_time = shtime.now() + dateutil.relativedelta.relativedelta(seconds=1)
                         sh.scheduler.add(scheduletask, scitem, prio=3, cron=None, cycle=None, value=invalue, offset=None, next=next_time)
                         #setattr(logic, 'save_state_' + item.id(), 0)
                  Und dann die Itemstruktur:
                  Code:
                          load:
                              type: bool
                              enforce_updates: True
                              visu_acl: rw
                              knx_listen: 3/4/1
                              knx_dpt: 1
                              click_count: 2
                  
                              singleclick:
                                  type: bool
                                  enforce_updates: True
                                  visu_acl: rw
                                  knx_dpt: 1
                  
                              multiclick:
                                  type: bool
                                  enforce_updates: True
                                  visu_acl: rw
                                  knx_dpt: 1
                                  on_update: ....previous = True
                  Man könnte aber einfach nur das Item mit dem Clickcount auswerten, müsste man halt die Logik etwas umbauen. Wäre dann auch etwas flexibler, wenn man zB auch n Dreifachklick abfangen will.

                  Kommentar

                  Lädt...
                  X