Ankündigung

Einklappen
Keine Ankündigung bisher.

Fensterkontakte und Rolos mit LinKNX steuern...

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

    Fensterkontakte und Rolos mit LinKNX steuern...

    Moin Jungs,

    gleich noch eine LinKNX Herausforderung:

    Habe folgende Idee:

    Ich setzte Waveline Fenstermelder von Busch-Jaeger ein, die die Stellung des Fensterriegels erkennen. Sobald ein Fenster geöffnet wird, sollen die Rollos aufgehen und gesperrt werden, sobald das Fenster wieder geschlossen wird, soll das Rollo wieder in den alten Zustand gehen (also offen bleiben, wenn es offen war oder runter, wenn es unten war).

    Es gibt noch eine zweite kleine Herausvorderung: Die Fenstermelder liefern einen Wert von 0 bis 255 je nach Zustand:

    255 bei Fenster geöffnet - Riegel quer
    76 bei Fenster gekippt - Riegel nach oben

    Da man nun bei Kipp ja kurz über "Riegel quer" geht, wird einmal der Wert 255 gesendet.

    Nun müsste man eine kleine Verzögerung einbauen - so frei nach dem Prinzip:

    Wert 255 bekommen und 2 Sekunden keinen anderen Wert...dann lege los mit der Aktion.


    Für die Rollos selbst, muss ich mir wohl bei der Steuerung der Rollos per Timer (via LinKNX) oder per Taster die letzte Position in einer Variablen speichern.

    Sobald die Fensterkontakte 255 liefern (und für mindestens 2 Sekunden halten) muss ich eine "1" auf die Gruppenadresse (Hoch und Sperren) senden (was kein Problem ist).

    Schwierig wird es nun bei dem Punkt, wenn die Fenster wieder geschlossen werden, sprich der Kontakt auf 0 geht. Hier muss ich eine "0" auf die Gruppenadresse (Hoch und Sperren) senden und dannach die Rollos auf den alten Zustand fahren. Sprich, wenn Sie offen waren muss ich gar nix machen, wenn Sie zu waren (Wert in der Variablen), dann muss ich sie wieder runterfahren.

    Im Moment scheitere ich leider schon daran, mir die Werte in LinKNX abzuspeichern, daher hoffe ich, dass mir jemand helfen kann.

    Oder denke ich viel zu kompliziert???


    Danke...Netsrac

    #2
    Hallo Carsten,

    auch hier (aus Zeitgründen) nur kurz einen Tipp:

    Du brauchst eigentlich eine sog. "Anzugsverzögerung", um zwischen auf und gekippt zu unterscheiden. Die habe ich auf die Schnelle in LINKNX nicht gefunden, aber Du könntest mit Cycle-On-off und 2 s Dauer das abbilden - also wenn der Wert 255 kommt, Cycle-On-off starten und wenn dieser cycle wieder off ist - dann ist offen. Wenn zwischendrin ein anderer Wert kommt, kann man diesen Cycle befehl auch wieder abbrechen.

    Das Schließen der Fenster ist ganz einfach, wenn Du die Zwangsstellung des Aktors verwendest - also offen: Zwangsstellung und dann wieder zurücknehmen. Dann müsste der Aktor wieder in seine Pos. fahren.

    Viele Grüße,

    Stefan
    Mein Sammelsurium: TS2, Zennio Z38, Siemens LOGO!, Medeodata 140 S, Weinzierl KNX ENO 620, Eibmarkt IP Router, MDT KNX IP IF, Wiregate, Node-Red mit KNX Ultimate, MDT Smart II, diverse Aktoren verschiedener Hersteller ...

    Kommentar


      #3
      Zitat von lobo Beitrag anzeigen
      Du brauchst eigentlich eine sog. "Anzugsverzögerung", um zwischen auf und gekippt zu unterscheiden. Die habe ich auf die Schnelle in LINKNX nicht gefunden, aber Du könntest mit Cycle-On-off und 2 s Dauer das abbilden - also wenn der Wert 255 kommt, Cycle-On-off starten und wenn dieser cycle wieder off ist - dann ist offen. Wenn zwischendrin ein anderer Wert kommt, kann man diesen Cycle befehl auch wieder abbrechen.
      Tja, da habe ich mal etwas probiert, aber das will irgendwie nicht. Habe den Eindruck, dass der Cycle-On-Off Befehl nicht abgebrochen wird.

      Das Schließen der Fenster ist ganz einfach, wenn Du die Zwangsstellung des Aktors verwendest - also offen: Zwangsstellung und dann wieder zurücknehmen. Dann müsste der Aktor wieder in seine Pos. fahren.
      Nein, dass ist bei BJ leider nicht so. Ich kann einfach Sperren oder den Windwächter (Hoch oder runter Fahren und dann Sperren) nutzen. Leider passiert bei einer Freigabe einfach gar nix.

      Also muss man sich den Zustand schon noch irgendwo merken...

      Aber Danke trotzdem schonmal...

      Gruß, Netsrac

      Kommentar


        #4
        Okay...dann werde ich hier mal selber antworten...vielleicht hilft das ja auch Anderen.

        Man installiere bitte die aktuelle LinKNX Version aus dem CVS, denn hier gibt es eine neue Timer Condition "Time Counter Condition":

        <rule id="Window_opened">
        <condition type="time-counter" threshold="3" reset-delay="0">
        <condition type="object" id="Waveline_position" value="255" trigger="true" />
        </condition>
        <actionlist >
        <action type="set-value" id="window_open" value="on" />
        </actionlist>
        <actionlist type="on-false">
        <action type="set-value" id="window_open" value="off" />
        </actionlist>
        </rule>

        Dabei sort die neue Timer-Condition dafür, dass ein Zustand für eine gewisse Zeit anstehen muss. Der "reset-delay" gibt die Zeit an, wann der interne Timer zurück gesetzt werden muss. Der Trick hierbei, dass es immer sofort zurück gesetzt wird, wenn sich ein Wert ändert. Demnach muss es wirklich 3 Sekunden in der Position verweilen bis "Window_open" auf On gesetzt wird.

        Kommentar


          #5
          Hallo Netsrac,
          ups, habe gerade noch gesehen, daß jef eine Version 0.0.1.28 released hat. Damit erübrigt sich der Hinweis mit dem CVS natürlich.
          (Die Funktion ist seit mindestens Version 0.0.1.26 schon drin - hatte aber bis 0.0.1.27 einen bug, der die restlichen Timer langsam gelöscht hat).

          Jef hatte das damals entwickelt, um ein Babyphon zu überwachen...:-)
          Ich finde diese Funktion extrem praktisch, um Timer zu implementieren, die man
          a) verlängern kann
          b) stoppen kann
          (Flurlicht o.ä.)
          Das kann man nämlich mit dem "delay" nicht machen.

          Oder als weitere Idee: ich habe mit dieser Funktion auch eine automatische "Abwesenheitsfunktion" implementiert: Wenn über 8 Stunden keine Bewegungsmelder (im Flur) angesprochen hat, geht das Haus auf "Abwesend". Wer keinen Bewegungsmelder hat, kann ja auch überwachen, ob das Licht im Bad + Küche + Wozi für mindestens 16h(?) nicht eingeschaltet wurde... so viele Möglichkeiten! :-)

          ---------
          zu dem zweiten Teil Deiner Frage:
          Wahrscheinlich kann man das auch mit LUA machen, aber ich habe mich mit LUA noch nicht befaßt. Man kann es aber auch scripten und zwar beispielsweise so:
          1) Wenn Du in Deiner Objekt-definition das Objekt, daß den Wert der Jalousie übermittelt mit 'init="persist"' anlegst, wird der Wert bei Änderung automatisch in eine Datei geschrieben, die so heißt wie das Objekt.
          (vorher in der <services> section einen Pfad angeben, z.B.
          Code:
          <persistence type="file" path="/opt/linknx/persist" logpath="/opt/linknx/log"/>
          2) wenn die erste Bedingung eintritt, bei der Du Dir den Wert merken möchstest, einfach als erstes ein shell script ausführen, daßs diese "Wertedatei" kopiert, der Aufruf erforlgt in linknx mit: (beispielsweise)
          Code:
             <action type="shell-cmd" cmd="/opt/linknx/scripts/<yourscript>.sh" />
          in dem shellscript schreibst Du dann einfach was in der Art:
          "cp <wertedatei> <merkdatei>"

          3) wenn die Bedingung eintritt, daß Du den vorherigen wert zurückstellen möchstes, rufst Du wieder ein shellscript auf, was dieses mal den Wert aus der <merkdatei> mit groupswrite (aus dem bcusdk) auf den Bus schreibt...

          Klingt schwierig, ist es aber nicht. :-)
          Viel Erfolg!

          Kommentar


            #6
            PS: ich habe im linknx wiki auch mal zwei Grafiken abgelegt, damit man sich das time-counter verhalten besser Vorstellen kann.
            Die funktion kann nämlich auch Zustände mit kurzen Unterbrechungen "messen".
            Siehe hier:
            SourceForge.net: Condition's Syntax - linknx
            Beste Grüße, Jens

            Kommentar


              #7
              Zitat von AutoMate Beitrag anzeigen
              Ich finde diese Funktion extrem praktisch, um Timer zu implementieren, die man
              a) verlängern kann
              b) stoppen kann
              (Flurlicht o.ä.)
              Das kann man nämlich mit dem "delay" nicht machen.
              Ich glaube es auch...vermutlich sollte man einfach mal ein paar Beispiele machen, die die Logik etwas besser verständlich machen :-)

              Oder als weitere Idee: ich habe mit dieser Funktion auch eine automatische "Abwesenheitsfunktion" implementiert: Wenn über 8 Stunden keine Bewegungsmelder (im Flur) angesprochen hat, geht das Haus auf "Abwesend". Wer keinen Bewegungsmelder hat, kann ja auch überwachen, ob das Licht im Bad + Küche + Wozi für mindestens 16h(?) nicht eingeschaltet wurde... so viele Möglichkeiten! :-)
              Okay...genau da wäre jetzt ein Beispiel gut:

              Also setzt Du den Treshold auf 1 und den Reset Delay auf 8h? Meine Bewegungemelder senden einfach eine "1" auf den Bus, wenn Bewegung erkannt wird.


              Wahrscheinlich kann man das auch mit LUA machen, aber ich habe mich mit LUA noch nicht befaßt. Man kann es aber auch scripten und zwar beispielsweise so:
              Gibt es eigentlich eine Anleitung zu LUA?

              Klingt schwierig, ist es aber nicht. :-)
              Ja...danke für die Tipps...ist auch nicht schwer, habe über den Umweg via Shell Scripts nicht gedacht...

              Kommentar


                #8
                Hi,
                Hier ist der Beispielcode für die Bewegungsmelder:
                Code:
                <rule id="Is_Away_8h"> 
                  <condition type="time-counter" threshold="8h" >
                  <condition type="and">
                    <condition type="object" id="EG_Flur_Bewegung_Meldung" value="off" trigger="true" />
                    <condition type="object" id="OG_Flur_Bewegung_Meldung" value="off" trigger="true" />
                    <condition type="object" id="DG_Flur_Bewegung_Meldung" value="off" trigger="true" />
                   </condition>     
                  </condition>     
                  <actionlist>
                   <action type="set-value" id="Status_Abwesend_8h" value="on" />
                  </actionlist> 
                 </rule>
                Es gibt dann noch eine regel, die bei Bewegung den Wert von Status_Abwesend_8h wieder zurückschaltet.

                beste Grüße, jens

                Kommentar


                  #9
                  Hi,
                  um ein Objekt auf einen Wert aus einer datei zu setzen kannst Du auch jef's script benutzen, daß er im linknx forum eingestellt hatte:
                  SourceForge.net: Linknx: Topic: Evaluate Condition based on file

                  LUA infos gibt's auch im WiKi:
                  SourceForge.net: Lua Scripting - linknx
                  und weiterführende Links zur Quelle:
                  Lua 5.1 Reference Manual - contents

                  Ich hoffe das hilft,
                  Beste Grüße, jens

                  Kommentar

                  Lädt...
                  X