Ankündigung

Einklappen
Keine Ankündigung bisher.

Dimmer einbinden

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

    Dimmer einbinden

    Hallo zusammen,

    falls ich den entscheidenden Eintrag bei der Suche übersehen habe, bitte ich um einen passenden Hinweis.

    Ich möchte gerne mittels eines MDT-Tasters, der Start-Stop-Dimmen unterstützt, einen Dimmwert setzen (konkret für eine Milight-Leuchte, aber das ist sekundär). Der Taster sendet keine Absolutwerte, sondern nur "Dimmen starten" beim Drücken und "Dimmen beenden" beim Loslassen. Der sich ergebende Wert soll DPT5 sein (bzw. 0...255).

    Wie kann ich das erreichen? Kann das sh.py von Hause aus, oder muss ich dafür Code schreiben?

    Max

    #2
    Hi Max,

    ich würde das mit einer Logik und einem Fade machen. Bei dem Stop, das Item einfach noch mal mit dem aktuellen Wert setzen, dann wir das fade beendet.

    Bis bald

    Marcus

    Kommentar


      #3
      Zitat von mknx Beitrag anzeigen
      Hi Max,

      ich würde das mit einer Logik und einem Fade machen. Bei dem Stop, das Item einfach noch mal mit dem aktuellen Wert setzen, dann wir das fade beendet.
      Danke, habe mit dem Ansatz mal angefangen. Wenn´s funktioniert, poste ich das Ergebnis mal hier.
      Alternativ würde ich mir überlegen, ein generelles Plugin für DPT3.007 zu schreiben. Theoretisch müsste man das ja im KNX-Plugin einbauen, aber das fasse ich lieber nicht an.

      Max

      Kommentar


        #4
        Zitat von l0wside Beitrag anzeigen
        Danke, habe mit dem Ansatz mal angefangen. Wenn´s funktioniert, poste ich das Ergebnis mal hier.
        Alternativ würde ich mir überlegen, ein generelles Plugin für DPT3.007 zu schreiben. Theoretisch müsste man das ja im KNX-Plugin einbauen, aber das fasse ich lieber nicht an.

        Max
        Wenn du ein Plugin hast, würde ich das auch gerne mal probieren :-)

        Gruß
        René

        Kommentar


          #5
          Zitat von mknx Beitrag anzeigen
          Hi Max,

          ich würde das mit einer Logik und einem Fade machen. Bei dem Stop, das Item einfach noch mal mit dem aktuellen Wert setzen, dann wir das fade beendet.

          Bis bald

          Marcus
          Hallo Marcus,

          ich kriege das Fade nicht beendet, wenn es mal losgelaufen ist, rennt es bis zum Maximalwert.
          Logik:
          Code:
          data = trigger['value']
          parent = sh.return_item(trigger['source']).return_parent().id()
          pvalue = eval ("sh." + parent + "()")
          logger.info("Parent value is {0}".format(pvalue))
          
          if (len(data) != 2):
              logger.warning(trigger['source'] + " has wrong length")
              quit()
          
          if (pvalue > 255):
              logger.warning("{0} out of range ({1}), setting to 255".format(parent,pvalue))
              eval("sh." + parent + "(255)")
          if (eval("sh." + parent + "()") < 0):
              logger.warning("{0} out of range ({1}), setting to 0".format(parent,pvalue))
              eval("sh." + parent + "(0)")
          if (parent.endswith('rgbw')):
              logger.info("RGBW")
              if (data[1] == 0):
                  logger.info("RGBW stop")
                  logger.info("sh." + parent + ".fade(pvalue,1,0.5)")
                  eval("sh." + parent + ".fade(pvalue,1,0.5)")
              else:
                  if (data[0] == 1):
                      logger.info("RGBW up")
                      if (pvalue > 247):
                          eval("sh." + parent + "(0)")
                      logger.info("sh." + parent + ".fade(255,8,0.5)")
                      eval("sh." + parent + ".fade(255,8,0.5)")
                  else:
                      logger.info("RGBW down")
                      if (pvalue < 9):
                          eval("sh." + parent + "(255)")
                      logger.info("sh." + parent + ".fade(0,8,0.5)")
                      eval("sh." + parent + ".fade(0,8,0.5)")
          if (parent.endswith('dim')):
              if (data[1] == 0):
                  logger.info("Brightness stop")
                  logger.info("sh." + parent + ".fade(pvalue,1,0.5)")
                  eval("sh." + parent + ".fade(pvalue,1,0.5)")
              else:
                  if (data[0] == 1):
                      logger.info("Brightness up")
                      eval("sh." + parent + ".fade(255,8,0.5)")
                  else:
                      logger.info("Brightness down")
                      eval("sh." + parent + ".fade(0,8,0.5)")
          logic.conf:
          Code:
          [rgbw]
              filename = rgbw.py
              watch_item = *.rgbw.knx | *.dim.knx
          items.conf:
          Code:
                      [[[[bett]]]]
                          type = bool
                          knx_dpt = 1
                          knx_listen = 1/3/43
                          milight_sw = 1^M
                          enforce_updates = On
                          [[[[[rgbw]]]]]
                              type = num
                              milight_col = 1
                              [[[[[[knx]]]]]]
                                  type = list
                                  knx_dpt = 3
                                  knx_listen = 1/3/46^M
                          [[[[[dim]]]]]
                              type = num
                              milight_dim = 1
                              [[[[[[knx]]]]]]
                                  type = list
                                  knx_dpt = 3
                                  knx_listen = 1/3/44^M
          Die Lösung mit eval ist nicht gerade befriedigend, aber ich habe sonst das Problem, dass die Referenzen auf ein Item (gerade wenn ich über die diversen Funktionen darauf zugreife), entweder
          - ein Wert (Integer)
          - ein String
          - ein Objekt (Item)
          sein können. Das war mir irgendwann zu komplex und unübersichtlich.

          Die Stop-Funktion evaluiert zu
          sh.dg.west.leuchten.bett.rgbw.fade(pvalue,1,0.5)
          pvalue ist dabei korrekt auf den aktuellen Wert gesetzt. Sie wird auch aufgerufen, nur dimmt es fröhlich weiter.

          Mache ich etwas falsch? Ich verwende das 1.0-Release, habe nur das Milight-Plugin aus develop kopiert.

          Max

          Kommentar


            #6
            Gelöst - Patchvorschlag

            Hallo Marcus,

            habe mir das mal in item.py angesehen. Das Problem liegt hier:
            Code:
            def _fadejob(item, dest, step, delta):
                if item._fading:
                    return
                else:
                    item._fading = True
            Hier ist des Pudels Kern, ein laufender Fade-Vorgang kann nicht unterbrochen werden.

            Vorschlag zur Änderung:
            Code:
            def _fadejob(item, dest, step, delta):
                if step == 0:
                    item._fading = False
                    return
                if item._fading:
                    return
                else:
                    item._fading = True
            So kann man mit einer Dummy-Schrittweite von 0 das Fading beenden. Die restliche Funktionalität wird nicht beeinflusst.

            Im Log sieht das schon ziemlich gut aus. Allerdings ist die Leuchte für den finalen Test gerade nicht verfügbar, Kind schläft endlich

            Max

            Kommentar


              #7
              Hallo Max,

              ein faden kannst Du mit dem Setzen eines Wertes beenden.

              Also in Deinem Fall: sh.dg.west.leuchten.bett.rgbw(pvalue)

              Bis bald

              Marcus

              Kommentar


                #8
                Zitat von mknx Beitrag anzeigen
                Ein faden kannst Du mit dem Setzen eines Wertes beenden.
                Hallo Marcus,

                nein, genau das funktioniert im Release nicht. Das entscheidende Stück Code hatte ich oben dargestellt.
                Mag im Develop anders sein - ist das so?

                Max

                Kommentar


                  #9
                  Hallo Max,

                  bei mir klappt das mit dem aktuellen master.

                  Logik
                  Code:
                  import time
                  
                  sh.dev.fade(100, 1, 1)
                  
                  time.sleep(5)
                  
                  sh.dev(42)
                  Wenn ich Zeile 363, den change_logger eine Ebene hochhole, dann erhalte ich folgendes Log:

                  Code:
                  2014-09-19 15:25:03,335 INFO     dev          Item dev = 1 via fader None None -- item.py:__update:363
                  2014-09-19 15:25:04,338 INFO     dev          Item dev = 2 via fader None None -- item.py:__update:363
                  2014-09-19 15:25:05,340 INFO     dev          Item dev = 3 via fader None None -- item.py:__update:363
                  2014-09-19 15:25:06,341 INFO     dev          Item dev = 4 via fader None None -- item.py:__update:363
                  2014-09-19 15:25:07,342 INFO     dev          Item dev = 5 via fader None None -- item.py:__update:363
                  2014-09-19 15:25:08,341 INFO     Dev          Item dev = 42 via Logic None None -- item.py:__update:363
                  Danach kommt keine Erhöhung mehr.

                  Auf Anhieb, kann ich den Fehler in Deiner Logik nicht sehen, poste doch aber mal Dein aktuelle Logik.

                  Generell zu empfehlen ist es auf das eval zu verzichten.
                  Bei parent das id() weglassen und bei den Outputs ein parent.id() verwenden.

                  Bis bald

                  Marcus

                  Kommentar


                    #10
                    Hallo Marcus,

                    ich habe mal eine Logik gebaut, die ein relativen KNX Dimmbefehl DPT 3 auf einen absoluten Item Wert umsetzt. Das habe ich wie beschrieben mit fade() gemacht. Was mir auffällt:

                    1. wenn ich den gleichen wert setze, den ich ausgelesen habe (ich will ihn ja nicht verändern, sondern nur fade() stoppen, dann läuft fade weiter. Lösung: ich setze wert +1. Dann bleibt fade () stehen.

                    Habe auch den Grund gefunden, da in item.py ab Zeile 353 in develop
                    Code:
                            if value != self._value:
                                _changed = True
                                self.__prev_value = self._value
                                self._value = value
                                self.__prev_change = self.__last_change
                                self.__last_change = self._sh.now()
                                self.__changed_by = "{0}:{1}".format(caller, source)
                                if caller != "fader":
                                    self._fading = False
                    der Fader nur dann gestoppt wird, wenn ein unterschiedlicher Wert gesendet wird. Für den sehr unwahrscheinlichen Fall (leider ist meiner einer davon), dass es der gleiche Wert ist, kommt self._fading = False nie zum Zug. Sollte aus meiner Meinung aus dem if value != self._value: herausgenommen werden.

                    2. das Item, welches ich mit fade() dimme, kann ich leider nicht als Item für einen eval_trigger verwenden. Eval wird nie ausgeführt, weil die Triggerbedingung anscheinend nicht ausgewertet wird, falls der Atem durch fade() verändert wird.

                    Anbei die Beispiele:
                    Das Item control wird durch eval berechnet.
                    eval_trigger ist auf hue_01_01.hue gesetzt.
                    hue_01_01.hue wird mit fade() aus einer Logik (s.u.) verändert.

                    Code:
                    [[hue_01_01]]
                        	[[[on_off]]]
                            	type = bool
                            	hue_id = 1
                                    knx_dpt = 1
                                    knx_cache = 8/0/1
                        	[[[dim]]]
                            	type = list
                                    knx_dpt = 3
                                    knx_cache = 8/0/12
                                    dim_max = 65535
                                    dim_step = 500
                                    dim_time = 0.5
                                    dim_item = kg.hue_01_01.hue
                            [[[bri]]]
                            	type = num
                            	cache = on
                            [[[sat]]]
                            	type = num
                            	cache = on
                            [[[hue]]]
                            	type = num
                            	cache = on
                            	enforce_updates = yes
                            [[[control]]]
                            	type = dict   
                            	cache = on
                            	hue_id = 1
                            	eval = dict({'sat': sh.kg.hue_01_01.sat(),'bri': sh.kg.hue_01_01.bri(),'hue': sh.kg.hue_01_01.hue()})
                            	eval_trigger = kg.hue_01_01.bri | kg.hue_01_01.sat | kg.hue_01_01.hue
                    hier noch die Logik:
                    Code:
                    #!/usr/bin/env python
                    ##logger.info("Hello World!")
                    #
                    # (c) 2014 Michael Würtenberger
                    # 
                    # logik, um bei relativen dimmsignalen ein item absolut zu verändern
                    # 
                    # es werden bis zu 3 parameter ausgewertet: dimmrampe sprich schrittweite und maximalwert und zeit
                    #
                    
                    #
                    # festellen, wer die logic aufgerufen hat
                    #     
                    triggerItem = trigger['source']
                    #
                    # testausgabe der knxwerte
                    #
                    logger.warning("KNX Wert {0}".format(sh.return_item(triggerItem)()))
                    
                    #
                    # wenn kein dict vorhanden, dann leeres anlegen
                    #  
                    dimmerObjectItem = sh.return_item(triggerItem).conf['dim_item']
                    
                    if (sh.return_item(triggerItem)()[1] == 1):
                        logger.warning('Dimmen start')
                        logger.warning(dimmerObjectItem)
                        #
                        # start den fadens für das objekt
                        #
                        if sh.return_item(triggerItem)()[0] == 1:
                             #
                             # hochfaden
                             #
                             sh.return_item(dimmerObjectItem).fade(float(sh.return_item(triggerItem).conf['dim_max']), float(sh.return_item(triggerItem).conf['dim_step']), float(sh.return_item(triggerItem).conf['dim_time']))
                        else:
                             #
                             # herunterfaden auf 0
                             #
                             sh.return_item(dimmerObjectItem).fade(0, float(sh.return_item(triggerItem).conf['dim_step']), float(sh.return_item(triggerItem).conf['dim_time']))
                    else:
                        #
                        # gleiches in die andere richtung: wenn dimmen stop, dann wird das objekt ausgetragen
                        # es wird nicht der explizite stop befehl = 0 ausgewertet, sonder alle anderen, damit alle fälle berücksichtig sind
                        #
                        logger.warning('Dimmen stop')
                        logger.warning(sh.return_item(dimmerObjectItem))
                        #
                        # das faden stoppen, das geht indem man dem item den aktuellen wert nochmals schickt.
                        #
                        sh.return_item(dimmerObjectItem)(sh.return_item(dimmerObjectItem)()+1,'MW')
                        sh.return_item(dimmerObjectItem)(sh.return_item(dimmerObjectItem)()-1,'MW')
                    Weitere Beobachtung: Ich habe auf der smartvisu einen slider, der ebenfalls das item hue_01_01.hue verändert. Wenn ich den bewege, dann kommt erwartungsgemäß eval_trigger zum Zug. Wenn ich das über die Dimmbefehle mache halt nicht (s.o.), aber der Slider in der Visu läuft korrekt mit hoch !
                    Was mache ich denn falsch ?

                    Danke für die Hilfe.

                    Michel

                    Kommentar


                      #11
                      Hallo,

                      die Zwischenschritte bei einem Fade lösen den Trigger nicht aus. Nur die finalen/absoluten Werte.

                      Das mit dem item.py ab Zeile 353 muss ich noch mal ansehen.

                      Bis bald

                      Marcus

                      Kommentar


                        #12
                        Hallo,

                        danke für die schnelle Rückmeldung. War das so beabsichtigt oder nur so nicht eingebaut ? Wenn es nicht einfach für mich einbaubar ist (weil eher kontraproduktiv), dann muss ich mir die Sachen mit den Philips Hue und das Dimmen der Farben usw. nochmal anders, komplett in einer Logik überlegen.

                        Danke !

                        Michel

                        Kommentar


                          #13
                          Hi,

                          ja, ist so beabsichtigt.
                          Plugins werden aber, bei jeder Änderung, getriggert.

                          Bis bald

                          Marcus

                          Kommentar


                            #14
                            Hallo Martin,

                            Ich habe es einmal ausprobiert mit dem Plugin. Ich komme genau an die gleiche stellenweise in der Logik. Visu wird upgedated, kein Trigger der update Methode im Plugin. Kann es sein, dass die fade Methode den aller des Plugins erbt und daher die Methode nicht aufruft (eigene Aufrufe werden ja ausgeschlossen.

                            Ich stehe da ganz doll auf dem Schlauch.

                            Michel

                            Kommentar


                              #15
                              Hallo Michel,


                              Zitat von Orion Beitrag anzeigen
                              dass die fade Methode den aller des Plugins erbt
                              ???

                              btw. mein Name ist Marcus.

                              bis bald

                              Marcus

                              Kommentar

                              Lädt...
                              X