Ankündigung

Einklappen
Keine Ankündigung bisher.

LinKNX: Tipps, Tricks und Beispiele

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

    LinKNX: Tipps, Tricks und Beispiele

    Hi allerseits,

    ich hatte es schon länger versprochen, jetzt ist es so weit... Ich mach mal einen Thread mit Tipps, Tricks und Beispielen zu LinKNX auf. Damit der Thread nicht zu sehr degeneriert, würde ich euch bitten, Fragen und Diskussionen in dem Parallel-Thread "LinKNX: Diskussionen zu Tipps, Tricks und Beispiele" zu führen. Beispiele und Anregungen sollen natürlich hier rein.

    Viel Spass beim Posten von Beispielen,
    Gruß, Waldemar
    OpenKNX www.openknx.de

    #2
    action type=formula (neu ab linknx 0.0.1.30)

    Ich mach auch gleich das erste Beispiel:

    Ich habe vor kurzem die formula-action für mich entdeckt und möchte sie hier vorstellen:
    Code:
    <action type="formula" id="Ergebnis-Objekt" a="1" x="Wert1-Objekt" m="1" b="1" y="Wert2-Objekt" n="1" c="0"/>
    Die Formel lautet immer id=a*x^m+b*y^n+c, implizite Typkonvertierung wird unterstützt (sofern irgendwie sinnvoll). Das Objekt id ist immer das Ergebnis, a, b, c, m, n müssen Konstanten sein, x und y können Objekte sein.
    Wenn sie nicht belegt werden, haben die Properties folgende Default-Werte: a=b=m=n=1.0, c=x=y=0.0
    Man kann damit schon sehr viel anstellen, hier einige Beispiele:
    Code:
    <action type="formula" id="E" x="E" c="1"/> <!-- E wird um 1 erhöht (E=E+1) -->
    <action type="formula" id="E" x="E" a="2"/> <!-- E wird verdoppelt (E=E*2)-->
    <action type="formula" id="E" x="E" a="0.5"/> <!-- E wird halbiert (E=E/2)-->
    <action type="formula" id="E" x="A" y="B"/> <!-- 2 Werte werden addiert (E=A+B)-->
    <action type="formula" id="E" x="A" b="-1" y="B"/> <!-- 2 Werte werden subtrahiert (E=A-B)-->
    Hier noch ein paar Tricks mit Datum und Zeit:
    Code:
    <action type="formula" id="E-Datum" x="A-Datum" y="B-Integer"/> <!-- Ein paar Tage draufrechnen-->
    <action type="formula" id="E-Datum" x="A-Datum" y="B-Integer" b="7"/> <!-- Ein paar Wochen draufrechnen-->
    <action type="formula" id="E-Zeit" x="A-Zeit" y="B-Integer"/> <!-- Ein paar Sekunden draufrechnen-->
    <action type="formula" id="E-Zeit" x="A-Zeit" y="B-Integer" b="60"/> <!-- Ein paar Minuten draufrechnen-->
    <action type="formula" id="E-Zeit" x="A-Zeit" y="B-Integer" b="3600"/> <!-- Ein paar Stunden draufrechnen-->
    Man kann in einer actionlist natürlich auch mehrere formula-actions hintereinander definieren, doch muss man hier aufpassen: Alle actions einer actionlist werden gleichzeitig parallel gestartet! Damit ist das Ergebnis womöglich nicht definiert, wenn sich eine Formel auf das Ergebnis einer anderen Formel bezieht, selbst wenn diese Formel nach der anderen hingeschrieben wird!

    Falsch (angenommen E1=6, A=3, B=9, C=4):
    Code:
    <action type="formula" id="E1" x="A" y="B"/> <!-- hier wird E1=A+B=3+9=12 berechnet -->
    <action type="formula" id="E2" x="E1" y="C"/> <!-- Hier soll E2=E1+C=12+4=16 berechnet werden-->
    <!-- Es könnte aber auch E2=E1+C=6+4=10 berechnet werden, weil E1 noch seinen alten Wert hat!!! -->
    Richtig:
    Code:
    <action type="formula" id="E1" x="A" y="B"/> <!-- hier wird E1=A+B=3+9=12 berechnet -->
    <action type="formula" id="E2" x="E1" y="C" delay="10ms"/> <!-- Hier wird E2=E1+C=12+4=16 berechnet-->
    <!-- 10ms Verzögerung hat bisher immer gereicht, wenn es aber nicht so zeitkritisch ist, nehme ich eher 100ms -->
    Viel Spaß, Waldemar

    P.S.: Fragen und Diskussionen bitte in https://knx-user-forum.de/knx-eib-fo...beispiele.html
    OpenKNX www.openknx.de

    Kommentar


      #3
      Die Sache mit dem trigger=&quot;true&quot;...

      Das hab ich mal früher zum Thema trigger geschrieben, das sollte meiner Meinung nach auch hier hin:

      Wenn man eine Bedingung formuliert, die aus mehreren Unterbedingungen besteht, kommt man ganz schnell zu dem Wunsch, dass nicht jeder Zweig der Bedingung auch zum Überprüfen der Gesamtbedingung führt.

      Mal ein Beispiel: Beim betreten des Grundstücks das Außenlicht abhängig vom Sonnenstand einschalten (ich weiß, man würde es in Abhängigkeit von der Helligkeit schalten, ist nur ein Beispiel):

      Code:
      <rule id="LichtWindfang">
        <condition type="and">
          <condition type="object" id="BWMAussen" value="1" trigger="true"/>
          <condition type="object" id="IstTag" value="0"/> 
        </condition>
        <actionlist type="if-true">
          <action type="set-value" id="AussenlichtWindfang" value="1"/>
        </actionlist>
      </rule>
      Hier sieht man den Unterschied: Wenn der BWMAussen auslöst, dann wird geschaut, ob auch IstTag=0 ist (also Nacht). Wenn aber IstTag sich ändert (von 1 auf 0), dann interessiert das die Regel nicht! Sie wird nicht evaluiert! Der Wechsel von Tag zu Nacht TRIGGERt diese Bedingung nicht!

      Deswegen ist in einfachen Conditions der Trigger immer notwendig, bei komplexeren kann man normalerweise den immer auf true setzen (im obigen Falle würde dann die Bedingung nach Sonnenuntergang auch nochmal getriggert, da aber der BWMAussen nicht 1 ist, würde das Licht trotzdem ausbleiben). Manchmal macht es sinn, Trigger bewusst zu setzen, damit z.B. nur ein Ast einer UND-Bedingung überhaupt zur Überprüfung der Bedingung führt, ist aber eher selten...

      Und in einer conditional-action ist der Trigger nicht erlaubt bzw. nicht notwendig, da die ganze Condition immer ausgewertet wird, wenn die Action getriggert wird.
      OpenKNX www.openknx.de

      Kommentar


        #4
        Hoi

        Ich hab das mit dem Sonnenaufgang aber nicht vor 06:00 als recht nützlich gefunden:
        Code:
            <rule id="morgens_wohzi_storen_rauf">
              <condition type="and">
                <condition type="timer" trigger="true">
                  <at type="sunrise" wdays="1234567" />
                  <until hour="12" min="0" />
                </condition>
                <condition type="timer" trigger="true">
                  <at hour="6" min="0" wdays="1234567" />
                  <until hour="12" min="0" />
                </condition>
              </condition>
              <actionlist>
                <action type="set-value" id="storen_wohzi_fen" value="off" />
                <action type="set-value" id="storen_wohzi_tue" value="off" />
                <action type="set-value" id="storen_wohzi_schi" value="off" />
                <action type="set-value" id="storen_kueche_tue" value="off" />
                <action type="set-value" id="storen_zimmer_1_p_l" value="50" />
                <action type="set-value" id="storen_schlafzi_no_p_l" value="50" />
                <action type="set-value" id="storen_schlafzi_so_p_l" value="50" />
                <action type="set-value" id="storen_zimmer_2_p_l" value="50" />
              </actionlist>
            </rule>
        Grüsse Bodo
        Fragen gehören ins Forum, und nicht in mein Postfach;
        EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

        Kommentar


          #5
          Für mich sehr häufig sinnvoll:

          Code:
                  <condition type="time-counter" threshold="2" reset-delay="1" >
                          <condition type="object" id="WavelineFensterEGTerrasseRechts" value="255" trigger='true' />
                  </condition>
          Der Type time-counter mit einem threshold von 2 und einem reset-delay von 1 sort dafür, dass die Condition erst dann auf True gesetzt wird, wenn das eingebettete Objekt mindestens 2 Sekunden an war, wird es innerhalb dieser 2 Sekunden wieder abgeschaltet, muss es mind. wieder für 2 Sekunden an bleiben.

          Man kann dieses sehr schön zum "entprellen" nutzen.

          Ein spezieller Anwendungsfall bei mir sind die Fenstergriffsender: Wenn ich das Fenster auf "Kipp" stelle geht es immer zuvor über die Position "open". Es wird also zuerst ein "open" und dann ein "kipp" auf den Bus gesendet. Normalerweise würde eine Condition mit "open" auch sofort ausgeführt. Mit dem obigen "time-counter" sorge ich jedoch dafür, dass diese nur ausgeführt wird wenn man auch wirklich auf der Position "open" bleibt.

          Gruß, Netsrac

          Kommentar


            #6
            Objekte, Zustände und Zustandswechsel

            Mal ein bisschen was zum Hintergrund - vielleicht hilft das ja was... ich hab das mal einem Freund geschrieben und es jetzt fürs Forum angepasst...

            Ich hab oben über das Triggern von Conditions geschrieben. Das sollte man genauer betrachten.

            LinKNX ist (wie KNX selbst) zustandsbasiert, und das gesamte Verhalten wird in object's und rule's beschrieben. Sowohl object's wie auch rule's haben Zustände. Ich fange mal mit den object's an.
            Es wird zwischen dynamischen (default) und statischen object's unterschieden. Ein dynamisches object löst einen Trigger nur bei einer Wertänderung aus, ein statisches auch bei einer Aktualisierung mit dem gleichen Wert:
            Code:
                <object id="dynamic" gad="11/0/122" type="1.001" init="1">Dynamisches Objekt</object>
                <object id="static" gad="11/0/123" type="1.001" init="1" flags="cwtus">Statisches Objekt</object>
            Ein object wird durch das s-Flag statisch. Wenn auf dem Bus jetzt sowohl 11/0/122 wie auch 11/0/123 mit einer 1 aktualisiert wird, würde das object static einen Trigger auslösen, dynamic aber nicht.

            Eine rule hat auch einen Zustand (true oder false). Der Zustand einer rule wird durch getriggerte condition's geändert. Was dann passiert, wird durch action's einer actionlist bestimmt. Es gibt 4 verschiedene Typen von actionlist:
            on-true: Wird ausgeführt, wenn die rule den Zustand von false auf true wechselt (das ist der default)
            on-false: Wird ausgeführt, wenn die rule den Zustand von true nach false wechselt.
            if-true: Wird ausgeführt, wenn die rule den Zusand true hat.
            if-false: Wird ausgeführt, wenn die rule den Zustand false hat.

            Wie man das Ganze sinnvoll anwendet, werde ich jetzt in Beispielen demonstrieren (unter Verwendung der object's von oben).
            Beispiel 1:
            Code:
                <rule id="Schaltbeispiel">
                  <condition type="or">
                    <condition type="object" id="dynamic" value="0" trigger="true"/>
                    <condition type="object" id="static" value="0" trigger="true"/>
                  </condition>
                  <actionlist type="on-true">
                    <action ...>
                  </actionlist>
                  <actionlist type="on-false">
                    <action ...>
                  </actionlist>
                </rule>
            Anfangssituation: dynamic = static = 1, rule = false. Jetzt wird dynamic = 0. Daraufhin wird die condition für dynamic getriggert und als true ausgewertet. Da bei einer or-condition nur ein Element true sein muss, wird die Gesamtcondition und damit auch die rule = true. Da sie den Zustandswechsel von false nach true macht, wird die actionlist vom Typ on-true ausgeführt.

            Jetzt wird für dynamic nochmals eine 0 gesendet. Da dynamic nicht den Zustand ändert, wird auch nichts getriggert. Es passiert einfach nichts. In diesem Falle kommt es also gar nicht zur Auswertung der rule.

            Jetzt wird static = 0 (Zustandswechsel). Die condition für static wird getriggert, die or-Gesamtcondition wird mit true ausgewertet. Die rule ist bereits true, deswegen wird keine actionlist ausgeführt.

            Jezt wird static nochmals 0. Als statisches object triggert es nochmals die condition, die abermals mit true ausgewertet wird. Die rule ist bereits true, deswegen wird keine actionlist ausgeführt.

            Jetzt wird dynamic = 1. Da Zustandswechsel vom dynamischen object, wird die condition für dynamic getriggert. Diese wertet mit false aus, die Gesamtcondition aber mit true (static ist ja noch 0). Da rule immer noch true, wird nichts ausgeführt.

            dynamic nochmals 1 ist wiederum egal, da bereits wie oben das object gar nicht triggert.

            Jetzt wird static = 1. Da static immer triggert, wird dessen condition false und die gesamtcondition auch false. Jetzt wechselt die rule von true nach false und führt die actionlist on-false aus.

            Ein erneutes static = 1 würde wiederum triggern, aber da die Gesamtcondition false bleibt und die rule somit auch, wird wiederum nichts ausgeführt.

            Mir ist klar, dass ich hier auf sehr aufwändige Weise ein einfaches OR beschrieben habe - und das jeder sagen wird, das hätt ich auch so erwartet. Trotzdem mach ich nochmal das gleiche Spielchen mit if-true bzw. if-false actionlist's.
            Beispiel 2:
            Code:
                <rule id="Schaltbeispiel">
                  <condition type="or">
                    <condition type="object" id="dynamic" value="0" trigger="true"/>
                    <condition type="object" id="static" value="0" trigger="true"/>
                  </condition>
                  <actionlist type="if-true">
                    <action ...>
                  </actionlist>
                  <actionlist type="if-false">
                    <action ...>
                  </actionlist>
                </rule>
            Anfangssituation: dynamic = static = 1, rule = false. Jetzt wird dynamic = 0. Daraufhin wird die condition für dynamic getriggert und als true ausgewertet. Da bei einer or-condition nur ein Element true sein muss, wird die Gesamtcondition und damit auch die rule = true. Da sie mit true ausgewertet, wird die actionlist vom Typ if-true ausgeführt. (Entspricht dem Verhalten von Beispiel 1)

            Jetzt wird für dynamic nochmals eine 0 gesendet. Da dynamic nicht den Zustand ändert, wird auch nichts getriggert. Es passiert einfach nichts. In diesem Falle kommt es also gar nicht zur Auswertung der rule. (Entspricht dem Verhalten von Beispiel 1)

            Jetzt wird static = 0 (Zustandswechsel). Die condition für static wird getriggert, die or-Gesamtcondition wird mit true ausgewertet. Die rule wird somit mit true ausgewertet und führt die actionlis if-true aus. (Unterschied zu Beispiel 1)

            Jezt wird static nochmals 0. Als statisches object triggert es nochmals die condition, die abermals mit true ausgewertet wird. Die rule wird somit mit true ausgewertet und führt die actionlis if-true aus. (Unterschied zu Beispiel 1)

            Jetzt wird dynamic = 1. Da Zustandswechsel vom dynamischen object, wird die condition für dynamic getriggert. Diese wertet mit false aus, die Gesamtcondition aber mit true (static ist ja noch 0). Die rule wird somit mit true ausgewertet und führt die actionlis if-true aus. (Unterschied zu Beispiel 1)

            dynamic nochmals 1 ist wiederum egal, da bereits wie oben das object gar nicht triggert. (Entspricht dem Verhalten von Beispiel 1)

            Jetzt wird static = 1. Da static immer triggert, wird dessen condition false und die gesamtcondition auch false. Jetzt wird die rule mit false ausgewertet und führt die actionlist if-false aus. (Entspricht dem Verhalten von Beispiel 1)

            Ein erneutes static = 1 würde wiederum triggern, die Gesamtcondition bleibt false. Die rule wird mit false ausgewertet und führt die actionlist if-false aus. (Unterschied zu Beispiel 1)

            Auch dies ist ein OR, nur wird hier wesentlich häufiger was ausgeführt. Die rule's mit if-true bzw. if-false zeigen ein ähnliches Verhalten wie statische object's: Sie führen ihre actionlist auch aus, wenn sie erneut den gleichen Wert bekommen. Daher nennt man sie auch statische rule's.

            Warum hab ich das so detailliert aufgeschrieben? Weil man mit dem obigen Wissen ein relativ einfaches Muster in LinKNX erkennt: Es besteht aus verschiedenen Elementen (object, condition, rule, actionlist), die miteinander über Trigger verbunden sind (object triggert condition, condition triggert rule, rule triggert actionlist). Bei object und rule hängt der Trigger davon ab, ob das sendende Element statisch oder dynamisch ist.

            Das war's auch schon! Meiner Meinung nach (ich lehn mich da mal aus dem Fenster) sind die meißten Behauptungen, dass LinKNX nicht das macht, was man erwartet, einfach an dem fehlenden Wissen über die oben beschriebenen Zusammenhänge liegen.

            Ich werde noch aus dem hier gesagten ein paar einfache Regeln ableiten und in einem der nächsten Beiträge schreiben, dazu hab ich jetzt aber keine Zeit. Das oben geschriebene habe ich wie gesagt "recycled", ich hoffe es hilft manchen - und die, die es schon wussten, können vielleicht Sachen ergänzen, die ich nicht richtig verstanden oder dargestellt habe.

            Gruß, Waldemar

            P.S.: Fragen und Diskussionen bitte in https://knx-user-forum.de/knx-eib-fo...beispiele.html
            OpenKNX www.openknx.de

            Kommentar


              #7
              Debugging von LinKNX

              Hi,

              ich finde den Tipp von netsrac zum Debugging Gold wert:

              Zitat von netsrac Beitrag anzeigen
              Super simpel, Du legst einfach eine separate Config an, die Dein Development-Kram enthält. Klar musst Du hier die verwendeten Objects nochmal neu definieren.

              Code:
              oscar     2607     1  0 Oct01 ?        00:01:22 linknx --config=/usr/local/lib/linknx/linknxDEV.xml --daemon=/var/linknx/linknxDEV.log
              oscar     5621  2591  0 Oct01 pts/2    00:00:10 tail -20f /var/linknx/linknxDEV.log
              oscar    28205     1  0 Oct08 ?        00:00:21 linknx --config=/usr/local/lib/linknx/linknx.xml --daemon=/var/linknx/linknx.log
              Ich rufe dann einfach linKNX nochmal mit der zweiten Config auf und gebe in ein separates Logfile aus. Macht nicht nur das debuggen einfacher, sondern sorgt auch dafür, dass die funktionierende Logik nicht unterbrochen wird, wenn ich mal was "probiere".
              Vielen Dank dafür,
              Gruß Waldemar

              P.S.: Fragen und Diskussionen bitte in https://knx-user-forum.de/knx-eib-fo...beispiele.html
              OpenKNX www.openknx.de

              Kommentar


                #8
                delay in actions

                Hi,

                in actions kann man mit delay die Verzögerung angeben, mit der die action ausgeführt wird. Die Verzögerung wird in Sekunden angegeben. Man kann auch die Einheit angeben (d=Tage, h=Stunden, m=Minuten, s=Sekunden). Seit LinKNX 0.0.1.28 auch ms=Millisekunden.
                Beispiel:
                Code:
                  <action type="set-value" id="dynamic" value="on" delay="250ms"/><!-- nach 250 Millisekunden einschalten -->
                  <action type="set-value" id="dynamic" value="off" delay="2"/><!-- nach 2 Sekunden ausschalten -->
                In meinen tests habe ich festgestellt, dass delay kleiner 20ms nicht funktioniert, wobei ich nicht weiss, ob es an meinem System oder an LinKNX selbst liegt.

                Das ist vor allem wichtig bei formula-actions, wenn man diese in definierter Reihenfolge ausführen will. Ich habe mich oben in meinem Beispiel verschrieben, da steht (leider) 10ms hätten immer gereicht, da sollte 20ms hin!

                Gruß, Waldemar
                OpenKNX www.openknx.de

                Kommentar


                  #9
                  Aussenbewegungsmelder weckt Haus bei Abwesenheit

                  Ich habe eine Szene 2 für "Alles aus", welche über einen Taster 1.1.24 über dem Bett für "Schlafen" und über ein Touchpanel 1.1.254 für "Ausser Haus" genutzt wird. Dann gibt es eine Aussenlampe licht_i, welche über einen Aussenbewegungsmelder kurzzeitig einschaltet wird.

                  Ich habe nun diese Elemente zu einer Art Alarmschaltung verknüpft, welche bei Abwesenheit dafür sorgt, dass eine Aktivierung der Aussenlampe das Haus weckt, um Anwesenheit vorzutäuschen und ein Mail schickt, das auf meinem Handy als SMS ankommt.

                  Als erstes verwende ich ein internes Objekt ohne GA, welches den Alarmzustand scharf/nicht-scharf speichert.

                  Code:
                  <object type="1.001" id="alarm-set" log="true">Status Alarm</object>
                  Bei Aktivierung "Schlafen" wird der Alarm deaktiviert, wir wollen nicht wegen einem streunenden Vierbeiner erschrecken.

                  Code:
                  <rule id="auto-szene2-Schlafzimmer" init="false">
                     <condition type="object-src" id="szene" src="1.1.24" value="2" trigger="true" />
                     <actionlist type="if-true">
                       <action type="set-value" id="alarm-set" value="off" />
                     </actionlist>
                  </rule>
                  Beim Verlassen der Wohnung wird der Alarm scharf gestellt.
                  Code:
                  <rule id="auto-szene2-Ausgang" init="false">
                    <condition type="object-src" id="szene" src="1.1.254" value="2" trigger="true" />
                      <actionlist type="if-true">
                         <action type="set-value" id="alarm-set" value="on" delay="1" />
                      </actionlist>
                  </rule>
                  Wenn die Aussenlampe bei Abwesenheit einschaltet, dann wird Aktivität erzeugt und eine Meldung an mein Handy geschickt
                  Code:
                  <rule id="alarm-execute" init="false">
                    <condition type="and">
                      <condition type="object" id="licht_i" value="on" trigger="true" />
                      <condition type="object" id="alarm-set" value="on" />
                    </condition>
                    <actionlist>
                      <action type="set-value" id="licht_d" value="on" delay="3" />
                      <action type="set-value" id="licht_f" value="on" delay="7" />
                      <action type="set-value" id="licht_k" value="on" delay="4" />
                      <action type="set-value" id="licht_p" value="on" delay="2" />
                      <action type="set-value" id="licht_z" value="on" delay="1" />
                      <action type="set-value" id="steckdose_g" value="on" delay="1" />
                      <action type="set-value" id="store3_stop" value="0" delay="3" />
                      <action type="send-email" to="<meine-sms-gateway-mail-adresse>" subject="Alarm">Aussenlicht ist aktiviert worden
                      </action>
                    </actionlist>
                  </rule>
                  EIB/KNX, VISU mit knxd + linknx + knxweb, Steuerbefehle via SMS und Email mit postfix + procmail

                  Kommentar


                    #10
                    Status-GA richtig lesen

                    Hi,

                    für Geräte mit Status-GA nutzt man in LinKNX ja das Pattern
                    Code:
                        <object id="LichtTreppenhaus" gad="11/0/1" init="request">
                          <listener gad="11/0/11"/>
                          Licht im Treppenhaus
                        </object>
                    wobei der listener das Status-Objekt angibt. Bei Untersuchungen zu diesem Problem hab ich festgestellt, dass nicht alle meine Aktoren auf ein Read-Request auf die Schaltadresse antworten. Um zu erreichen, dass der Read-Request auf die listener-Adresse geht, muss man
                    Code:
                          <listener gad="11/0/11" read="true"/>
                    noch das read-Attribut setzen. Das geht ab Version 0.0.1.28, ich habs erst jetzt entdeckt und dachte, das interessiert vielleicht noch jemanden...

                    Gruß, Waldemar

                    P.S.: Fragen und Diskussionen bitte in https://knx-user-forum.de/knx-eib-fo...beispiele.html
                    OpenKNX www.openknx.de

                    Kommentar


                      #11
                      Email &amp; Variablen

                      Nachdem ich mit Waldemar etwas probiert habe, hier ein Beispiel, wie man in die Emails auch Informationen packen kann.
                      Code:
                      <object id="zirkulation_temp" type="9.xxx" gad="3/1/224" flags="cwtus" log="true">Zirkulation Temp</object>
                      
                      ...
                      ...
                      
                      <actionlist type="if-true">
                                       <action type="cycle-on-off" id="zirkulation" on="120" off="180" count="1"/>
                                       <action type="send-email"  to="root@localhost" var="true" subject="Zirkulation"> ${zirkulation_temp} °C Pumpe läuft für 2 Minuten.</action>
                      </actionlist>
                      Derzeit zwischen Kistenauspacken und Garten anlegen.
                      Baublog im Profil.

                      Kommentar


                        #12
                        LinKNX Editier-Erleichterung

                        Hi,

                        auf mehrfachen Wunsch stelle ich hier das von mir kommentierte linknx.xsd ein (für linknx 0.0.1.30) und ein kurzes Video, das zeigt, wie es bei einem xml-Editor, der xsd unterstützt, aussehen kann.

                        Die mir bekannten Editoren, die xsd-Unterstützung bieten, sind:
                        • Visual Studio 2012 (kostenpflichtig, mit diesem Editor entstand die Demo)
                        • Visual Studio 2012 express (kostenlos)
                        • Visual Studio 2010 express (kostenlos)
                        • Eclipse (kostenlos, der XML-Editor ist leider nicht so gut)
                        • oXygen (kostenpflichtig, bisher nicht getestet)

                        Es gibt bestimmt noch mehr...

                        Natürlich kann ich nicht für die Fehlerfreiheit garantieren - use it at your own risk! Andererseits - es ist ein xsd, es macht somit auch nichts kaputt, das xml kann man immer auch ohne xsd-Unterstützung editieren.

                        Bin natürlich am Feedback interessiert, auch an Fehlermeldungen, wenn was angemeckert wird, was eigentlich gehen sollte. Das aber dann wie üblich in
                        https://knx-user-forum.de/knx-eib-fo...beispiele.html

                        Gruß, Waldemar

                        P.S.: Das pdf-File ist eigentlich ein zip, in dem wiederum das linknx.xsd und ein mp4-Video drin ist, das zeigt, wie man editiert.

                        P.P.S.: Bevor dumme Kommentare kommen: Ja, ich habe in dem Video trigger="true" vergessen...
                        Angehängte Dateien
                        OpenKNX www.openknx.de

                        Kommentar


                          #13
                          Werte von Objekten in Strings

                          Hi,

                          noch ein kurzer Nachtrag zum Beitrag von greentux:

                          Bei den Actions vom Typ shell-cmd, send-email, send-sms, ioport-tx steht im Body normalerweise der zu sendende Text. Setzt man das Attribut var="true", dann kann man in dem Text auch Werte von Objekten angeben: Ein ${object-id} wird dann ersetzt durch den Wert, den das Objekt mit der id="object-id" hat.

                          Das funktioniert (laut changelog) seit LinKNX 0.0.1.28.

                          Gruß, Waldemar
                          OpenKNX www.openknx.de

                          Kommentar


                            #14
                            Hallo,

                            das ist ja genial. Danke!

                            Welchen Editor nutzt du da?

                            Gruß,
                            Hendrik

                            Kommentar


                              #15
                              Hi Hendrik,

                              schön, dass es Dir gefällt - ich würde nicht mehr ohne editieren wollen, mach ich genau so mit der Comet-Visu...
                              Ich hab die Liste der Editoren nochmal aktualisiert (es stand schon vorher drin, dass ich Visual Studio 2012 nutze).

                              Da ich es gut fände, wenn dieser Thread nur Tipps und Tricks enthält und nicht durch Diskussionen verwässert wird, bitte weitere Diskussionen in
                              https://knx-user-forum.de/knx-eib-fo...beispiele.html.

                              Danke und Gruß,
                              Waldemar
                              OpenKNX www.openknx.de

                              Kommentar

                              Lädt...
                              X