Ankündigung

Einklappen
Keine Ankündigung bisher.

Quittierung Licht/DALI

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

    Quittierung Licht/DALI

    Ich möchte unter einer bestimmten Konstellation, dass mein DALI-Gerät kurz blinkt. Dazu habe ich mir ein entsprechendes Item angelegt, wo ich die Anzahl der Blinkvorgänge setzen kann. Schalten und dimmen funktionieren. Ich kann zwar den Wert setzen, aber der Rest des items "quittieren" wird nicht ausgeführt.

    Code:
                    WW:
                        schalten:
                            type: bool
                            knx_dpt: 1
                            knx_send: 5/0/34
                            knx_listen: 5/2/34
                            knx_init: 5/2/34
                            enforce_updates: yes
                            visu_acl: rw
                        dimmen:
                            type: num
                            knx_dpt: 5
                            knx_send: 5/3/34
                            knx_listen: 5/3/34
                            knx_init: 5/3/34
                            enforce_updates: yes
                            visu_acl: rw
                        quittieren:
                            type: num
                            value: 0
                            enforce_updates: yes
                            cycle: 1
                            eval: value - 1 if value > 0 else 0
                            on_update: ..schalten = not sh...schalten() if value > 0 else None
    Wo liegt der Fehler?

    #2
    Hi,

    das ist mutig... mit cycle wird quittieren jede Sekunde getriggert, ganz egal, ob das Item was macht oder nicht, dass sollte Dir klar sein.
    Ferner ist die Syntax
    Code:
    cycle: <dauer> = <wert>
    Da Du keinen Wert angegeben hast, läuft es nicht. Da laut Doku aber nur konstante Werte gehen, wird das gar nicht mit cycle gehen.
    Mach mal folgendes, das könnte klappen:
    Code:
    quittieren:
        type: num
        value: 0
        autotimer: 1 = .self()
        eval: value - 1 if value > 0 else 0
        on_change: ..schalten = not sh...schalten() if value > 0 else None
    Da autotimer auch Item-Referenzen als Werte erlaubt, könnte das mit .self() klappen. Und Du solltest das auf jeden Fall ohne enforce_updates machen und nur on_change verwenden.

    Gruß, Waldemar

    Kommentar


      #3
      Zitat von mumpf Beitrag anzeigen
      das ist mutig... mit cycle wird quittieren jede Sekunde getriggert, ganz egal, ob das Item was macht oder nicht, dass sollte Dir klar sein.
      So richtig gefällt mir das auch nicht. Ich sah aber keine andere, bessere Lösung. Den Wert habe ich mit on_update aus einem anderen item gesetzt. Der Wert wird auch gesetzt, wird aber nicht heruntergezählt.

      Code:
                      CheckTastSperren:
                          type: bool
                          enforce_updates: yes
                          eval: True if not sh.OG.Kind.DALI.Decke.WW.externerTaster() and sh.OG.Kind.TagNacht() else False
                          eval_trigger: OG.Kind.DALI.Decke.WW.externerTaster
                          on_update:
                              - OG.Kind.DALI.Decke.WW.sperren = value
                              - OG.Kind.DALI.Decke.WW.quittieren = 6
      Sperren sperrt hier übrigens nicht das Licht, sondern nur den Präsenzmelder für diesen Kanal.

      Zitat von mumpf Beitrag anzeigen
      Mach mal folgendes, das könnte klappen: Code:

      quittieren: type: num value: 0 autotimer: 1 = .self() eval: value - 1 if value > 0 else 0 on_change: ..schalten = not sh...schalten() if value > 0 else None
      Da autotimer auch Item-Referenzen als Werte erlaubt, könnte das mit .self() klappen. Und Du solltest das auf jeden Fall ohne enforce_updates machen und nur on_change verwenden.
      Geht leider auch nicht. Und das Problem ist im Logfile zu finden, auch wenn ich es erst nicht gesehen habe, war es bei mir schon falsch. Das ist der Fehler:

      WARNING OG.Kind.DALI.Decke.WW.quittieren-eval Item OG.Kind.DALI.Decke.WW.quittieren: problem evaluating value - 1 if value > 0 else 0: unorderable types: str() > int()

      Ich würde also meinen, dass das mit value nicht geht, aber mit .self() habe ich auch probiert. Geht genauso wenig. Die Script-Sprache ist mir zu wider ...

      Kommentar


        #4
        Dann enthält value einen String und keine Zahl. Deshalb schlägt, wie der Log Eintrag Dir verrät der Vergleich value > 0 fehl. Warum das so ist kannst Du ja mal erforschen.
        Abhilfe sollte schaffen, wenn Du int(value) - 1 if int(value) > 0 else 0 schreibst.

        Das hat aber erstmal nichts mit Deiner Aversion zu Python zu tun.

        P.S.: Wenn Du Python so überhaupt nicht magst, wieso bist Du dann auf SmartHomeNG verfallen?
        Viele Grüße
        Martin

        Kommentar


          #5
          Zitat von Msinn Beitrag anzeigen
          Dann enthält value einen String und keine Zahl. Deshalb schlägt, wie der Log Eintrag Dir verrät der Vergleich value > 0 fehl. Warum das so ist kannst Du ja mal erforschen.
          Abhilfe sollte schaffen, wenn Du int(value) - 1 if int(value) > 0 else 0 schreibst.
          Ist ja als num definiert. Deshalb unlogisch. Ich habe deinen Vorschlag mal getestet. Auch wieder Fehlanzeige:

          WARNING OG.Kind.DALI.Decke.WW.quittieren-eval Item OG.Kind.DALI.Decke.WW.quittieren: problem evaluating int(value) - 1 if int(value) > 0 else 0: invalid literal for int() with base 10: '.self()'

          Ich vermute also, dass das mit value gar nicht so geht.
          Zitat von Msinn Beitrag anzeigen
          P.S.: Wenn Du Python so überhaupt nicht magst, wieso bist Du dann auf SmartHomeNG verfallen?
          In Kombination mit der SmartVISU war das eine tolle Lösung. Und laut vielen auch die, die auch am leichtesten zu handhaben ist. Das ich solche Schwierigkeiten mitd er Skriptsprachen haben würde, war mir nicht bewusst. Es ist zu viel probiere, bis mal was läuft.

          Kommentar


            #6
            Also dias mit dem falschen Typen lag an dem hier "autotimer: 1 = .self()" ... aber zum Laufen kriege ich das dennoch nicht. Ich hatte nicht erwartet, dass ein "simples" blinken von einer Lampe so aufwendig ist.

            Kommentar


              #7
              Was soll Deiner Meinung nach

              Code:
               eval: value - 1 if value > 0 else 0
              ergeben?

              Wenn der Wert vorher 0 ist: wird der else Zweig ausgeführt -> also 0
              Wenn der Wert vorher 1 ist: wird der then Zweig ausgeführt -> 1 - 1 -> also auch 0
              Zuletzt geändert von Msinn; 14.07.2018, 00:30.
              Viele Grüße
              Martin

              Kommentar


                #8
                Zitat von Msinn Beitrag anzeigen
                Was soll Deiner Meinung nach
                Code:

                eval: value - 1 if value > 0 else 0
                ergeben?
                Es soll vom aktuellen Wert 1 abgezogen werden (also quasi value = value - 1). value wird von mir von außen gesetzt:

                Code:
                CheckTastSperren:
                type: bool
                enforce_updates: yes
                eval: True if not sh.OG.Kind.DALI.Decke.WW.externerTaster() and sh.OG.Kind.TagNacht() else False
                eval_trigger: OG.Kind.DALI.Decke.WW.externerTaster
                on_update:
                    - OG.Kind.DALI.Decke.WW.sperren = value
                    - OG.Kind.DALI.Decke.WW.quittieren = 6
                Und das ist das verwirrende an dieser Scriptsprache. Von der Logik her, würde ich es nämlich so schreiben, wenn ich weiß, dass value mein item-Wert ist? Ist es das überhaupt oder ist .shelf() der Wert meines Items?

                Code:
                if value > 0 value -= 1
                aber so gehtd as ja nicht

                Kommentar


                  #9
                  Hör einfach auf Dich über Python zu beschweren. Daran wird hier keiner etws ändern können.
                  Viele Grüße
                  Martin

                  Kommentar


                    #10
                    Zitat von Msinn Beitrag anzeigen
                    Hör einfach auf Dich über Python zu beschweren. Daran wird hier keiner etws ändern können.
                    Du hast recht. :-)

                    Gibt es für das Problem eine Lösung. Also quasi, wie ziehe ich von dem Item-Wert eins ab, jedes Mal, wenn das Item getriggert wird?

                    Kommentar


                      #11
                      Hi,

                      da ich den Vorschlag "verbrochen" habe, habe ich das auch mal ausprobiert. Ich glaube, ich habe einen Bug gefunden

                      Aber erstmal: Ich verwende die Syntax nicht so oft, deswegen habe ich zwar nochmal in der Doku nachgeschaut, aber es trotzdem falsch gelesen (obwohl es da korrekt drin steht) - es hätte sh..self() heißen müssen.

                      Wir reden über folgendes:
                      Code:
                      Test: 
                          Decrement: 
                              type: num
                              value: 0
                              autotimer: 1 = sh..self()
                              eval: int(value) - 1 if int(value) > 0 else 0
                      Wenn ich jetzt im CLI
                      Code:
                      up Test.Decrement = 5
                      mache, sehe ich im Log folgendes:
                      Code:
                      2018-07-14  15:07:47 DEBUG    lib.scheduler     Triggering Test.Decrement-eval - by: CLI source: 127.0.0.1:34550 dest: None value: {'dest': None, 'value': '5', 'source': '
                      2018-07-14  15:07:47 DEBUG    lib.item          Item Test.Decrement = 4 via CLI 127.0.0.1:34550 None
                      2018-07-14  15:07:48 DEBUG    lib.scheduler     Triggering Test.Decrement-eval - by: Autotimer source: None dest: None value: {'dest': None, 'value': 4, 'source': Non
                      2018-07-14  15:07:48 DEBUG    lib.item          Item Test.Decrement = 3 via Autotimer None None
                      Mehr nicht. Man sieht, dass initial das Item vom CLI mit der 5 getriggert wird und demzufolge value - 1 = 4 setzt. Durch die Wertänderung wird der autotimer gestartet und der triggert nach einer Sekunde wieder mit sh..self() = 4 das Item, das dann auf value - 1 = 3 gesetzt wird. Eigentlich sollte diese Wertänderung jetzt wieder den autotimer starten, das passiert aber nicht. Meine Vermutung ist, das sich der Autotimer nicht aus einem Autotimer-Trigger selbst starten kann. Ich würde das für einen Bug halten, es kann aber auch Absicht sein, um Endlosschleifen zu vermeiden. Hierzu kann Msinn vielleicht was sagen.

                      Als Lösung kann ich Dir folgendes anbieten:
                      Code:
                      Test:
                          Zaehler: 
                              type: num
                              value: 0
                              Decrement: 
                                  type: bool
                                  autotimer: 1 = 0
                                  eval: int(value) > 0
                                  eval_trigger: ..
                                  on_change: .. = sh...() - 1 if sh...() > 0 and not value else None
                      Das funktioniert, habe ich auch ausprobiert. Das liegt daran, dass autotimer nur mittels on_change den Zähler setzt. Gestartet wird der autotimer durch den eval_trigger. Somit sind Wertänderung und Start vom autotimer entkoppelt.

                      Zähler ist das Item, an das Du Deine Aktionen hängen kannst und das Du mit einer Zahl belegen musst. Decrement zählt dann das Zähler-Item runter bis 0 im Sekundentakt.

                      Gruß, Waldemar


                      Kommentar


                        #12
                        Zitat von mumpf Beitrag anzeigen
                        Das funktioniert, habe ich auch ausprobiert. Das liegt daran, dass autotimer nur mittels on_change den Zähler setzt. Gestartet wird der autotimer durch den eval_trigger. Somit sind Wertänderung und Start vom autotimer entkoppelt.

                        Zähler ist das Item, an das Du Deine Aktionen hängen kannst und das Du mit einer Zahl belegen musst. Decrement zählt dann das Zähler-Item runter bis 0 im Sekundentakt.
                        Gut, dass du das "verbrochen" hast. Ich habe es auch schon erfolgreich getestet. Die Lösung ist aber noch nicht ganz fertig. Ich werde dazu mehr schreiben, wenn ich mit der Lösung zufrieden bin. Insgesamt geht es darum, den PM zu sperren, wenn es Nacht ist und das optisch zu quittieren.

                        Schön wäre es natürlich, wenn in SmartHomeNG noch Zeiten von weniger als einer Sekunde funktionieren würden. Also z.B. 500ms oder sowas ind er Art. Gern auch konsequent die Übergabe von Minuten und Stunden durchziehen, denn das funktioniert nicht überall.

                        Kommentar


                          #13
                          Ich stell dir hier heute nachmittag meine Lösung fürs blinken ein (bin derzeit unterwegs), das ist zwar eine Logik, aber da kann man dann wählen wie das Puls-Pausen-Verhältnis ist und sonst noch einige Kleinigkeiten.
                          Gruß Waldemar

                          Kommentar


                            #14
                            Hi,

                            hier ist meine Blinken-Lösung:

                            Datei logics/blinken.py:
                            Code:
                            #!/usr/bin/env python
                            #
                            # Abstrakte blink-Logik, blinkt wenn das Item <> 0 ist - ist somit für num und bool items geeignet
                            #
                            # blinken_ga (string, verpflichtend) ist das watch-Attribut, hat als argument die blink-GA
                            # blinken_not (bool, default false) lässt blinken, wenn das Item 0 ist
                            # blinken_anzahl (num, default 7, max 100) ist die Anzahl der Blinkvorgsenge
                            # blinken_puls (num, default 10, in Sekunden/10) ist die Laenge des "an"-blinkens
                            # blinken_pause (num, default 10, in Sekunden/10) ist die Laenge des "aus"-blinkens
                            # blinken_invert (bool, defalut false) invertiert Puls/Pause (für negative Anzeige)
                            # blinken_final (string, Item, default leer) setzt den Zustand des Items als letzten Blinkwert
                            # logger.info("blinken")
                            # print(trigger)
                            # logik nur, wenn von Item getriggert
                            if trigger['by'] == 'Item':
                                lItem = sh.return_item(trigger['source'])
                                lGA = lItem.conf['blinken_ga']
                                lAnzahl = int(lItem.conf['blinken_anzahl']) if 'blinken_anzahl' in lItem.conf else 7
                                lPuls = int(lItem.conf['blinken_puls']) if 'blinken_puls' in lItem.conf else 10
                                lPause = int(lItem.conf['blinken_pause']) if 'blinken_pause' in lItem.conf else 10
                                lFinal = lItem.conf['blinken_final'] if 'blinken_final' in lItem.conf else ""
                                lInvert = 'blinken_invert' in lItem.conf
                                lNot = 'blinken_not' in lItem.attr
                                logger.info("Blinken {3} mal auf {0} mit ({1}/{2}), invertiert: {4}".format(lGA, lPuls, lPause, lAnzahl, lInvert))
                                lContinue = (lItem() > 0) != lNot
                                while lContinue and lAnzahl > 0:
                                    lAnzahl = lAnzahl - 1
                                    logger.debug("Blinken: GA {0} => {1}".format(lGA,int(not lInvert)))
                                    sh.knx.groupwrite(lGA, not lInvert, '1')
                                    time.sleep(lPuls/10.0)
                                    logger.debug("Blinken: GA {0} => {1}".format(lGA,int(lInvert)))
                                    sh.knx.groupwrite(lGA, lInvert ,'1')
                                    lContinue = (lItem() > 0) != lNot
                                    if lContinue: time.sleep(lPause / 10.0)
                                if lFinal != "":
                                    lValue = sh.return_item(lFinal)()
                                    logger.debug("Blinken final: GA {0} => {1}".format(lGA,lValue))
                                    sh.knx.groupwrite(lGA, lValue, '1')
                            In etc/logic.yaml hinzufügen:
                            Code:
                            blinken:
                                filename: blinken.py
                                watch_item: "*:blinken_ga"
                                visu_acl: False
                            Beispiel PM-Sperre:
                            Code:
                            Zimmer:
                                Licht:
                                    Schalten:
                                        type: bool
                                        knx_dpt: 1
                                        knx_send: xx/y/zzz
                                PM:
                                    Sperren:  
                                        type: bool
                                        knx_dpt: 1
                                        knx_cache: xx/z/yyy
                                        blinken_ga: xx/y/zzz
                                        blinken_anzahl: 5
                                        blinken_puls: 3
                                        blinken_pause: 7
                                        blinken_final: Zimmer.Licht.Schalten
                            Im Beispiel wird beim setzen der Sperre das Licht 5 mal blinken lassen, wobei das Licht 3/10 Sekunden an ist und 7/10 aus. Nach den 5 Blinkvorgängen oder falls die Sperre vorher wieder aufgehoben wird, wird das Licht auf den Zustand vom Item Zimmer.Licht.Schalten gesetzt.

                            Was die blinken_* Attribute bedeuten, steht in den Kommentaren in blinken.py. blinken_final unterstützt nur ablsolute (keine relativen) Itemnamen. Die Logik geht davon aus, dass das knx-Plugin einfach nur knx heißt.

                            Vielleicht hilft es ja, sollten noch Fragen sein, melde Dich.
                            Gruß, Waldemar
                            Zuletzt geändert von mumpf; 18.07.2018, 09:15.

                            Kommentar


                              #15
                              Zitat von mumpf Beitrag anzeigen
                              Im Beispiel wird beim setzen der Sperre das Licht 5 mal blinken lassen, wobei das Licht 3/10 Sekunden an ist und 7/10 aus. Nach den 5 Blinkvorgängen oder falls die Sperre vorher wieder aufgehoben wird, wird das Licht auf den Zustand vom Item Zimmer.Licht.Schalten gesetzt.
                              Ich habe das gestern kurz probiert und bei mir ging es erst einmal auf anhieb nicht. Ich muss das aber noch mal genauer unter die Lupe nehmen. "blinken_ga" ist die Gruppenadresse, die blinken soll richtig? Das könnte also im Falle eines Falles auch die gleiche sein, wie Zimmer.Licht.Schalten? Ich schaue mir die Lösung aber noch mal genauer an. :-)

                              Sonst habe ich hier mal meine Item-Lösung, die ich mal an hand des Schlafzimmers poste:

                              Dieser Teil reagiert auf den Tastsensor im Schlafzimmer. Dabei soll der Präsenzmelder Tags entsperrt sein und nachts manuell gesperrt werden können. Sperren tue ich den nachts mit einfachem Ausschalten und entsperren mit Einschalten oder Tag wird wieder aktiv. Als "Parameter" kann man die Helligkeit und die Anzahl des Blinkens übergeben. Hier im Beispiel 10% Helligkeit und 5 x blinken.

                              Code:
                              OG:
                                  Schlafen:         
                                      Praesenz:
                                          Sperren:
                                              # beim Aussschalten des Lichts in der Nacht, wird der Präsenzmelder gesperrt
                                              # und beim Einschalten wieder entsperrt
                                              CheckTastSperren:
                                                  type: bool
                                                  eval: True if not sh.OG.Schlafen.DALI.Decke.WW.externerTaster() and sh.OG.Schlafen.TagNacht() else False
                                                  eval_trigger: OG.Schlafen.DALI.Decke.WW.externerTaster
                                                  on_change:
                                                      - OG.Schlafen.DALI.Decke.WW.sperren = value
                                                      - OG.Schlafen.DALI.Decke.WW.externerTaster = True if value == False else None
                                                      - OG.Schlafen.DALI.Decke.WW.quittieren = 10 * 256 + 5 if value == True else 0
                                              # beim Umschalten auf den Tag-Betrieb wird der Präsenzmelder entsperrt
                                              CheckTagEntsperren:
                                                  type: bool
                                                  eval: sh.OG.Schlafen.TagNacht()
                                                  eval_trigger: OG.Schlafen.TagNacht
                                                  on_change: OG.Schlafen.DALI.Decke.WW.sperren = not value
                                                  #on_change: OG.Schlafen.DALI.Decke.WW.sperren = False if not value else None
                              Das ist der Teil, der dem DALI (kann auch jede andere Lichtquelle sein) zugeordnet ist. Sperren bezieht sich im übrigen nicht auf den DALI-Kanal, sondern den Präsenzmelder.

                              Code:
                                  Schlafen:
                                      DALI:
                                          Decke:
                                              CW:
                                                  schalten:
                                                      type: bool
                                                      knx_dpt: 1
                                                      knx_send: 5/0/29
                                                      knx_listen: 5/2/29
                                                      knx_init: 5/2/29
                                                      enforce_updates: yes
                                                      visu_acl: rw
                                                  dimmen:
                                                      type: num
                                                      knx_dpt: 5
                                                      knx_send: 5/3/29
                                                      knx_listen: 5/3/29
                                                      knx_init: 5/3/29
                                                      enforce_updates: yes
                                                      visu_acl: rw
                                              WW:
                                                  schalten:
                                                      type: bool
                                                      knx_dpt: 1
                                                      knx_send: 5/0/28
                                                      knx_listen: 5/2/28
                                                      knx_init: 5/2/28
                                                      enforce_updates: yes
                                                      visu_acl: rw
                                                  dimmen:
                                                      type: num
                                                      knx_dpt: 5
                                                      knx_send: 5/3/28
                                                      knx_listen: 5/3/28
                                                      knx_init: 5/3/28
                                                      enforce_updates: yes
                                                      visu_acl: rw
                                                  sperren:
                                                      type: bool
                                                      knx_dpt: 1
                                                      knx_send: 5/4/1
                                                      knx_listen: 5/4/1
                                                      knx_init: 5/4/1
                                                      enforce_updates: yes
                                                      visu_acl: rw
                                                  quittieren:
                                                      type: num
                                                      value: 0
                                                      decrement:
                                                          type: bool
                                                          autotimer: 1 = 0
                                                          eval: int(value) > 0
                                                          eval_trigger: ..
                                                          on_change:
                                                              - .. = sh...() - 1 if sh...() % 256 > 0 and not value else None
                                                              - ...dimmen = 0 if sh....dimmen() > 0 and value > 0 else sh...() / 256 if sh...() % 256 > 0 and value > 0 else None

                              Kommentar

                              Lädt...
                              X