Ankündigung

Einklappen
Keine Ankündigung bisher.

linknx - Telegrammfolge als condition

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

    linknx - Telegrammfolge als condition

    Hallo linknx Profis,

    ich möchte mit linknx auf eine Telegrammfolge innerhalb einer bestimmten Zeit reagieren um damit eine Art Codetaster mit normalen Tastern zu simulieren. Beispiel:

    GA 1/1/1 (Taste 1) = 1, danach innerhalb 1 Sekunde GA 1/1/2 (Taste 3) = 1, danach innerhalb 1 Sekunde GA 1/1/2 (Taste 4) = 0, danach innerhalb 1 Sekunde GA 1/1/1 (Taste 1) = 1, ...

    Ist das mit linknx überhaupt möglich? Über eine gute Idee oder einen Lösungsansatz würde ich mich freuen!

    Viele Grüße

    Micha

    #2
    Hi,

    ich hab zu Hause was ähnliches laufen, muss aber nachschauen. Kann frühestens morgen Abend was antworten - und falls es nicht klappt, erst am Pfingstmontag...

    Auf jeden Fall geht es und ist relativ straight forward - ich erinnere mich nur, dass man um einen linknx-Fehler drumrum kommen muss, damit es zuverlässig läuft, ich weiss leider nur nicht mehr, welchen...

    Gruß, Waldemar
    OpenKNX www.openknx.de

    Kommentar


      #3
      Hi,

      ich hab mal nachgeschaut und mein Zeug ein bisschen abgewandelt:

      Code:
      	<objects>
      		<object id="BusTime" gad="7/0/101" type="10.001" flags="cwt"/>
      		<object id="Code1" gad="12/1/1" type="1.001" flags="crwts"/>
      		<object id="Code2" gad="12/1/2" type="1.001" flags="crwts"/>
      		<object id="Counter" gad="12/1/10" type="5.xxx" flags="crwts" init="0"/>
      		<object id="Switch" gad="12/1/11" type="1.001"/>
      	</objects>
      	<rules>
      		<rule id="init" init="false">
      			<condition type="object" id="BusTime" trigger="true"/>
      		  	<actionlist>
      				<action type="set-value" id="Counter" value="0"/>
      			</actionlist>
      		</rule>
      		<rule id="ResetCounter" init="false">
      			<condition type="object" id="Counter" op="gt" value="0" trigger="true"/>
      			<actionlist type="if-true">
      				<action type="set-value" id="Counter" value="0" delay="2"/>
      			</actionlist>
      		</rule>
      		<rule id="CodeschlossSchritt1" init="false">
      			<condition type="and">
      				<condition type="object" id="Counter" value="0"/>
      				<condition type="object" id="Code1" value="1" trigger="true"/>
      			</condition>
      			<actionlist type="if-true">
      				<action type="cancel" rule-id="ResetCounter"/>
      				<action type="set-value" id="Counter" value="1" delay="50ms"/>
      			</actionlist>
      		</rule>
      		<rule id="CodeschlossSchritt2" init="false">
      			<condition type="and">
      				<condition type="object" id="Counter" value="1"/>
      				<condition type="object" id="Code2" value="1" trigger="true"/>
      			</condition>
      			<actionlist type="if-true">
      				<action type="cancel" rule-id="ResetCounter"/>
      				<action type="set-value" id="Counter" value="2" delay="50ms"/>
      			</actionlist>
      		</rule>
      		<rule id="CodeschlossSchritt3" init="false">
      			<condition type="and">
      				<condition type="object" id="Counter" value="2"/>
      				<condition type="object" id="Code2" value="0" trigger="true"/>
      			</condition>
      			<actionlist type="if-true">
      				<action type="cancel" rule-id="ResetCounter"/>
      				<action type="set-value" id="Counter" value="3" delay="50ms"/>
      			</actionlist>
      		</rule>
      		<rule id="CodeschlossSchritt4" init="false">
      			<condition type="and">
      				<condition type="object" id="Counter" value="3"/>
      				<condition type="object" id="Code1" value="1" trigger="true"/>
      			</condition>
      			<actionlist type="if-true">
      				<action type="cancel" rule-id="ResetCounter"/>
      				<action type="set-value" id="Counter" value="4" delay="50ms"/>
      			</actionlist>
      		</rule>
      		<rule id="CodeSwitch" init="false">
      			<condition type="object" id="Counter" value="4" trigger="true"/>
      			<actionlist>
      				<action type="set-value" id="Switch" value="1"/>
      			</actionlist>
      			<actionlist type="on-false">
      				<action type="set-value" id="Switch" value="0"/>
      			</actionlist>
      		</rule>
      	</rules>
      Das Problem ist hier die Initialisierung, da hat linknx einen bug. Wenn man ein internes Objekt verwendet, in das noch nie reingeschrieben wurde, werden and- und or-conditions nicht korrekt ausgeführt. Hier im Beispiel ist das der Counter. Die Frage ist, wie man korrekt eine Initialisierung ausführt.
      Ich lasse mir jede Minute die Zeit auf den Bus senden. Auf dieser Basis mache ich meine Initialisierungen nach einem Neustart von linknx. Dafür ist die init-rule. Falls Du eine andere Form der Initialisierung verwendest, musst Du das anpassen. Der init am Objekt funktioniert hier gar nicht!

      Zum testen kannst Du auch erstmal per groupwrite den Counter auf 0 setzen, danach läuft alles wie gewünscht. Der delay in der ResetCounter-rule ist die Zeit, die zwischen 2 Tastendrücken vergehen darf - derzeit sind es 2 Sekunden.

      Hoffe das hilft Dir,
      Gruß, Waldemar
      OpenKNX www.openknx.de

      Kommentar


        #4
        Super, vielen Dank für den Tip! Ich hab verstanden, wie es funktionieren soll, konnte die Rule aber heute Abend noch nicht zum Funktionieren bringen. Ich denke, mein Problem ist noch mein B.IQ Taster, den ich wieder mal davon überzeugen muss, KURZ und LANG so zu senden, wie ich es brauche...

        Viele Grüße

        Micha

        Kommentar


          #5
          Hallo Waldemar,

          danke für Deine Infos, es funktioniert wie beschrieben. Prima :-)

          Viele Grüße

          Micha

          Kommentar


            #6
            Hallo Micha,

            freut mich, dass ich helfen konnte.

            Gruß, Waldemar
            OpenKNX www.openknx.de

            Kommentar

            Lädt...
            X