Ankündigung

Einklappen
Keine Ankündigung bisher.

Quittierung Licht/DALI

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

    #16
    Zitat von Cannon Beitrag anzeigen
    Ich habe das gestern kurz probiert und bei mir ging es erst einmal auf anhieb nicht.
    Hmm, ich verwende das produktiv und hab keine Probleme . Ich hatte das nur reingestellt, weil Du meintest, dass Zeiten < 1 Sekunde schön wären. Meine Logik hat eine Auflösung von 1/10 Sekunde.

    Zitat von Cannon Beitrag anzeigen
    "blinken_ga" ist die Gruppenadresse, die blinken soll richtig?
    Ja, ich habe bewusst GA genommen und nicht Items, damit man potentielle Trigger beim Blinken nicht hat. Meistens habe ich die Blink-GA als zusätzliche hörende Adresse an jeweiligen Kommunikationsobjekt, so dass ein blinken möglichst wenig Seiteneffekte hat. Deswegen kann man mit blinken_final auch am Ende des Blinkens der GA wieder einen definierten Zustand zuweisen.

    Wenn Du schreibst, was nicht ging, kann ich Dir gerne helfen.

    Gruß, Waldemar
    OpenKNX www.openknx.de

    Kommentar


      #17
      Zitat von mumpf Beitrag anzeigen
      Wenn Du schreibst, was nicht ging, kann ich Dir gerne helfen.
      Da blinkt nix. Das geht nicht, ich finde aber den Fehler nicht. Ich glaube aber, dass die Logik gar nicht aufgerufen wird. Dazu habe ich die Datei logics.yaml erzeugt und die Sachen da eingetragen. Es existierte vorher aber nur eine logic.yaml und KEINE logis.yaml.

      Ich habe das umgebaut, um das in meine Variante nutzen zu können. Hier erst mal meine "Leuchte".

      Code:
          Wohnen:
              DALI:
                  Decke:
                      CW:
                          schalten:
                              type: bool
                              knx_dpt: 1
                              knx_send: 5/0/13
                              knx_listen: 5/2/13
                              knx_init: 5/2/13
                              enforce_updates: yes
                              visu_acl: rw
                          dimmen:
                              type: num
                              knx_dpt: 5
                              knx_send: 5/3/13
                              knx_listen: 5/3/13
                              knx_init: 5/3/13
                              enforce_updates: yes
                              visu_acl: rw
                      WW:
                          schalten:
                              type: bool
                              knx_dpt: 1
                              knx_send: 5/0/12
                              knx_listen: 5/2/12
                              knx_init: 5/2/12
                              enforce_updates: yes
                              visu_acl: rw
                          dimmen:
                              type: num
                              knx_dpt: 5
                              knx_send: 5/3/12
                              knx_listen: 5/3/12
                              knx_init: 5/3/12
                              enforce_updates: yes
                              visu_acl: rw
                          sperren:
                              type: bool
                              knx_dpt: 1
                              knx_send: 5/4/0
                              knx_listen: 5/4/0
                              knx_init: 5/4/0
                              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
                          quittierenTest:
                              type: bool
                              blinken_ga: 5/0/12
                              blinken_anzahl: 5
                              blinken_puls: 10
                              blinken_pause: 10
                              blinken_final: EG.Wohnen.DALI.Decke.WW.schalten
      Und dann noch die Sperrfunktion.. Die Sperrfunktion funktioniert auch in meiner auskommentierten Variante.

      Code:
      EG:
          Wohnen:         
              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.EG.Wohnen.DALI.Decke.WW.externerTaster() and sh.EG.Wohnen.TagNacht() else False
                          eval_trigger: EG.Wohnen.DALI.Decke.WW.externerTaster
                          on_change:
                              - EG.Wohnen.DALI.Decke.WW.sperren = value
                              - EG.Wohnen.DALI.Decke.WW.externerTaster = True if value == False else None
                              - EG.Wohnen.DALI.Decke.WW.quittierenTest = True
                              #- EG.Wohnen.DALI.Decke.WW.quittieren = 3 * 256 + 5 if value == True else 0
                      # beim Umschalten auf den Tag-Betrieb wird der Präsenzmelder entsperrt
                      CheckTagEntsperren:
                          type: bool
                          eval: sh.EG.Wohnen.TagNacht()
                          eval_trigger: EG.Wohnen.TagNacht
                          on_change: EG.Wohnen.DALI.Decke.WW.sperren = not value

      Kommentar


        #18
        Hi,

        Du hast es eigentlich schon selbst gefunden... es war ein Typo: Die Datei heißt logic.yaml und nicht logics.yaml. Sorry!

        Du könntest die "blinken_*" Attribute direkt am sperren-Item machen, da es ja blinken soll, wenn gesperrt wird. Aber so geht es natürlich auch... ist nur nicht nötig.

        Noch ein konzeptioneller Tipp: Das blinken_final bringt bei Dir nichts. Blinken geht über die GA 5/0/12, das Item EG.Wohnen.DALI.Decke.WW.schalten hört aber über knx_listen auf den Status des Aktors. Damit wird das Item durch das Blinken verändert. Blinken schaltet immer an, dann aus, somit ist nach dem 5. blinken das Ganze auch aus und wird durch blinken_final nochmal auf aus gesetzt. Postitv formuliert: Es schadet auch nichts, da es keine Auswirkung hat.

        Aber mal einen anderen Fall angenommen: Das Licht ist an, die Sperre wird gesetzt. Dann will man eigentlich, dass es 5 mal blinkt und anschließend das Licht an bleibt. Die letzte Aktion von "Blinken" ist aber ein aus. Dann kann man blinken_final dafür nutzen, den letzten Zustand vor dem Blinken wieder zu setzen. Dafür muss man aber ein Item haben, dass den Zustand gespeichert hat und dass durch das Blinken selbst nicht verändert wird.

        Oder noch anders gesagt: blinken_final auf ein Item zu setzen, dass durch das Blinken selbst beeinflusst wird, macht keinen Sinn.

        Gruß, Waldemar
        OpenKNX www.openknx.de

        Kommentar


          #19
          Zitat von mumpf Beitrag anzeigen
          Du hast es eigentlich schon selbst gefunden... es war ein Typo: Die Datei heißt logic.yaml und nicht logics.yaml. Sorry!

          Du könntest die "blinken_*" Attribute direkt am sperren-Item machen, da es ja blinken soll, wenn gesperrt wird. Aber so geht es natürlich auch... ist nur nicht nötig.
          Ich habs jetzt in der richtigen logic eingetragen. Da stehen schon einige Sachen drin, die vermutlich aus den Logiken selbst generiert werden. Allerdings geht das nicht. Sobald ich da was eintrage, erhalte ich eine Fehlermeldung:

          Code:
          [LIST][*]2018-07-18 19:40:35 ERROR CP Server Thread-8 YAML-file load error in /usr/local/smarthome/etc/logic.yaml:[*]expected '<document start>', but found '<block mapping start>'[*]in "<unicode string>", line 7, column 1:[*]blinken:[*]^ (line: 7)[/LIST]
          Zitat von mumpf Beitrag anzeigen
          Du könntest die "blinken_*" Attribute direkt am sperren-Item machen, da es ja blinken soll, wenn gesperrt wird. Aber so geht es natürlich auch... ist nur nicht nötig.
          Das schaue ich mir an, dann spart man sich den Umweg. Die Sperre allerdings muss ich ohnehin manuell über SmarthomeNG machen ...

          Zitat von mumpf Beitrag anzeigen
          Oder noch anders gesagt: blinken_final auf ein Item zu setzen, dass durch das Blinken selbst beeinflusst wird, macht keinen Sinn.
          Gut, dann brauche ich final anscheinend nicht, dass ist also für irgendwas gut, was danach passieren soll

          Kommentar


            #20
            Aus der Meldung heraus würde ich tippen, dass du ein tab im yaml verwendet hast. Yaml erlaubt nu spaces für einrückungen.

            Gruß Waldemar
            OpenKNX www.openknx.de

            Kommentar


              #21
              Zitat von mumpf Beitrag anzeigen
              Aus der Meldung heraus würde ich tippen, dass du ein tab im yaml verwendet hast. Yaml erlaubt nu spaces für einrückungen.
              Nein, das ist leider nicht der Fehler. Ich habe das Gefühl ich bin nicht in der richtigen Datei. Das steht da schon drin und ich habs danach einfach angefügt, aber irgendwie passt das nicht so recht.

              Code:
              %YAML 1.1
              --- {rolladen_runterfahren: {filename: rolladen_runterfahren.py, crontab: sunset+2}, blinken: {filename: blinken.py}}

              Kommentar


                #22
                Hi,

                hast Du die Formatierung vergessen oder steht das wirklich so drin? Sieht für mich eher wie JSON aus... aber auch nicht richtig ohne Anführungsstriche.
                Es sollte (meiner Meinung nach) so aussehen:
                Code:
                rolladen_runterfahren:
                    filename: rolladen_runterfahren.py
                    crontab: sunset+2
                blinken:
                    filename: blinken.py
                    watch_item: "*:blinken_ga"
                Wobei ich natürlich nicht weiß, was rolladen_runterfahren macht. Ist ja Deine logik... aber bei blinken hattest Du das watch_item vergessen.

                Du solltest vielleicht mal die smarthomeNG-Doku lesen und auch was über Dateiformate, speziell YAML. Die Probleme, die Du hier beschreibst, sind alle mit einem Blick in die Doku schnell gelöst...

                Gruß, Waldemar
                OpenKNX www.openknx.de

                Kommentar


                  #23
                  Zitat von mumpf Beitrag anzeigen
                  hast Du die Formatierung vergessen oder steht das wirklich so drin? Sieht für mich eher wie JSON aus... aber auch nicht richtig ohne Anführungsstriche.
                  Nein, ich habe ja nichts vergessen. DIese Sachen, die da drin stehen, werden automatisch aus SmartHomeNG generiert, wenn ich eine Logik im Logikeditor anlege, so auch dein blinken. Das funktioniert ja auch. Nur, wenn ich deinen Punkt zu füge, geht das nicht. Ich vermute also doch, dass es die falsche Datei ist. Aus der Anleitung werde ich in diesem Punkt nicht schlau, obwohl sie sonst sehr ausführlich ist. Ich habe mir das Beispiel nachdimmen mal angeschaut. Und da steht bei dem Logikteil folgendes:

                  Die Logik aktiviert man unter etc/yaml mit dem Eintrag von:

                  /usr/local/smarthome/etc/yaml

                  Code:
                  nachdimmen
                       filename: nachdimmen.py
                      watch_item: '*:nachdimm_wert'
                  Wo man jetzt also genau was eintragen soll ist mir unklar.

                  Kommentar


                    #24
                    Zitat von mumpf Beitrag anzeigen
                    rolladen_runterfahren: filename: rolladen_runterfahren.py crontab: sunset+2 blinken: filename: blinken.py watch_item: "*:blinken_ga"
                    Ich habe genau das jetzt gemacht und den autogenerierten Kram gelöscht. Jetzt werden die Logiken ordnungsgemäß geladen und gefunden. Mir ist nur unklar, wieso SmartHomeNG das erst einmal so speichert. Jetzt werden auch neue Logiken richtig gespeichert. Jetzt muss ich nur noch rausfinden, warum es dennoch nicht blinkt. Da suche ichd ann später weiter .... :-)

                    Kommentar


                      #25
                      Zitat von mumpf Beitrag anzeigen
                      lNot = 'blinken_not' in lItem.attr
                      Da war ein Fehler, deshalb ging es nicht. Anstatt "attr" muss da "conf" stehen..... jetzt geht es auch. :-)

                      Kommentar


                        #26
                        Hi,

                        Du hast vollkommen recht, aber jetzt frage ich mich, warum es bei mir blinkt... bei mir stand auch .attr drin. Ich muss mal morgen schauen, heute wird das nichts mehr.

                        Gruß, Waldemar
                        OpenKNX www.openknx.de

                        Kommentar


                          #27
                          Zitat von mumpf Beitrag anzeigen
                          jetzt frage ich mich, warum es bei mir blinkt
                          Mein SmartHomeNG ist da sensibler.

                          Ich war aber so frei, deine Logik zu erweitern. Die geht jetzt auch mit Dimmwerten, damit es nicht so hell ist. Also wenn man blinken_dimmwert_ein setzt, dann wird die Gruppenadresse als Dimmwert gesendet. Und blinken_startpause macht noch eine kleine Pause, bevor das blinken überhaupt anfängt. Das sieht dann besser aus, wenn man Soft-an und Soft-Aus-Funktion in der Lichtquelle hat. :-)

                          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, default false) invertiert Puls/Pause (für negative Anzeige)
                          # blinken_final (string, Item, default leer) setzt den Zustand des Items als letzten Blinkwert
                          # blinken_startpause (num, default 0, in Sekunden/10) wie lange wird gewartet, bevor das Blinken anfängt
                          # blinken_dimmwert_ein (num, default None) anstatt ein/aus wird der Dimmwert gesetzt, Achtung Gruppenadresse muss für Dimmwert sein
                          # blinken_dimmwert_aus (num, default 0) anstatt ein/aus wird der Dimmwert gesetzt
                          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
                              lStartPause = int(lItem.conf['blinken_startpause']) if 'blinken_startpause' in lItem.conf else 0
                              ldimmwert_ein = int(lItem.conf['blinken_dimmwert_ein']) if 'blinken_dimmwert_ein' in lItem.conf else None
                              ldimmwert_aus = int(lItem.conf['blinken_dimmwert_aus']) if 'blinken_dimmwert_aus' in lItem.conf else 0
                              lFinal = lItem.conf['blinken_final'] if 'blinken_final' in lItem.conf else ""
                              lInvert = 'blinken_invert' in lItem.conf
                              lNot = 'blinken_not' in lItem.conf
                              time.sleep(lStartPause / 10.0)
                              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)))
                                  if ldimmwert_ein == None:
                                      sh.knx.groupwrite(lGA, not lInvert, '1')
                                  else:
                                      if lInvert:
                                          sh.knx.groupwrite(lGA, ldimmwert_aus, '5')
                                      else:
                                          sh.knx.groupwrite(lGA, ldimmwert_ein, '5')
                                  time.sleep(lPuls/10.0)
                                  logger.debug("Blinken: GA {0} => {1}".format(lGA,int(lInvert)))
                                  if ldimmwert_ein == None:
                                      sh.knx.groupwrite(lGA, lInvert, '1')
                                  else:
                                      if not lInvert:
                                          sh.knx.groupwrite(lGA, ldimmwert_aus, '5')
                                      else:
                                          sh.knx.groupwrite(lGA, ldimmwert_ein, '5')
                                  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')

                          Kommentar


                            #28
                            Inzwischen reicht mir die Logik nicht mehr aus, weil ich es gern blinken lassen möchte. Aber die Anzahl möchte insowfern selbst bestimmen, dass ich das blinken starten und stoppen kann. Deshalb stellt sich für mich die Frage, wie man das umsetzen kann? Ich habe das schon ein wenig probiert, aber optimal war alles nicht. Denn zum einen kann ich die Logik nicht ewig laufen lassen und zum anderen funktioniert das ohne Logik in Items nicht so toll.

                            Hat jemand einen Lösungsansatz für das Problem?

                            Kommentar

                            Lädt...
                            X