Ankündigung

Einklappen
Keine Ankündigung bisher.

LinKNX: Diskussionen zu Tipps, Tricks und Beispiele

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

  • Merlin123
    antwortet
    Vorab: Ich hab den Thread hier nur überflogen und das meiste (noch) nicht verstanden. Deshalb mal ne ganz blöde Frage:

    Kann ich mit linknx folgendes realisieren:
    Ich sende für eine (an keinen Aktor gebundene) GA eine "1" (z.B. an die 2/0/1).
    Dann soll linknx einen Schaltaktor (1/1/1) und einen Jalousieaktor (1/2/1) auf "1" setzen.
    Geht das?
    Wenn ja: Wäre jemand so nett mit eine komplette Beispielkonfig zu geben, in der genau das abgebildet wird? Dann könnte ich darauf aufbauend mal probieren ob ich hinter die Logik komme.

    Danke schonmal!

    Zusatzfrage (erst mal nur aus Neugier): Kann ein Jalousieaktor auch X Sekunden angesteuert werden? (Da reicht erst mal ein Ja/Nein, bis ich sowas einbinde hab ich noch andere einfache Sachen die gehen sollen )

    EDIT:

    Würde das so ungefähr aussehen?

    Code:
    <?xml version="1.0" ?>
    <config>
        <services>
            <knxconnection url="ip:127.0.0.1" />
            <xmlserver type="inet" port="1028"/>
        </services>
        <objects>
            <object type="1.001" id="licht_on_off" gad="1/1/1">Licht</object>
            <object type="3.008" id="rolladen" gad="1/2/1">Rolladen</object>
            <object type" " id="AufrufGA" gad="2/0/1>AufrufGA</object>
        </objects>
        <rules>
            <rule id="Szene1">
                <condition type="Object-src" id="AufrufGA" trigger="true">
                </condition>
                <actionlist>
                    <action type="set-value" id="licht_on_off" value="1" />
                    <action type="set-value" id="rolladen" value="1" />
                </actionlist>
            </rule>
        </rules>
    </config>

    Einen Kommentar schreiben:


  • mumpf
    antwortet
    Hi Michi,

    freut mich, wenn ich helfen konnte. Wie gesagt, vergiss nicht, das r-Flag zu setzen - sonst wunderst Du dich irgendwann mal, dass was nicht funktioniert.

    Gruß, Waldemar

    Einen Kommentar schreiben:


  • Michixx
    antwortet
    Hallo Waldemar,

    es lag wirklich am s-Flag.

    Wenn man nicht weiß wo der Fehler liegt, dann kann man natürlich lange suchen, so wie ich.
    Jetzt wo ich es weiß habe ich auch rausgefunden, dass Du dies hier schon einmal beschrieben hast.
    Jetzt funktioniert es so wie es soll.

    Und vielen Dank für Deine ausführliche Erklärung.
    Und natürlich auch an Othmar, Ihr habt mir beide sehr geholfen.

    Gruß
    Michi

    Einen Kommentar schreiben:


  • mumpf
    antwortet
    Hallo Michi,

    das mit den doppelten Einträgen kann ich erklären...
    Du hast Dein Temp-Objekt mit dem s-Flag deklariert. Damit werden auch Werte, die gleich dem vorherigen Wert sind, wie neue Werte behandelt (triggern conditions).
    Bei Dir passiert nur folgendes:
    • Per XML-Schnittstelle kommt ein Temperaturwert
    • Dieser Wert ist ein neuer Wert, wird somit ins Log geschrieben, triggert conditions etc.
    • Da dieser Wert nicht vom Bus kommt (so gesehen also inten in linknx geändert wurde), wird er auf den Bus geschickt
    • Auf dem Bus ist nun ein Temperaturwert auf dieser GA
    • Durch das s-Flag wird er wie ein neuer Wert behandelt, er wird ins Log geschrieben, triggert conditions etc.
    • Da der Wert vom Bus kam, wird er nicht erneut geschrieben (sonst würde das eine Art Schleife ergeben)

    Man sieht das ganz gut im linknx-Log, wenn man den DEBUG-Modus einschaltet.

    Ob das nun ein Fehler ist, ist Ansichtssache, es ist sicherlich ein Nachteil von Objekten mit s-Flag, die auch in linknx verändert werden. Das mit den dppelten Werten im Log ist ein Schönheitsfehler, kritischer ist, dass alle conditions mehrfach getriggert werden.

    In Deinem Fall sollte aber ausreichen, wenn Du das s-Flag rausnimmst.

    Gruß, Waldemar

    P.S.: Ich würde auch noch das r-Flag dazu machen, damit linknx eventuelle Read-Requests vom Bus beantworten kann, denn Du hast ja keine andere Stelle, in der das Objekt verwaltet wird und die Read-Requests beantworten kann.

    Einen Kommentar schreiben:


  • Michixx
    antwortet
    Hallo Ihr,

    Zitat von Tru Beitrag anzeigen
    Oder eine Alternative: du könntest den Wert statt mit groupwrite auf den Bus zu schreiben, den Wert mittels write-Befehl direkt an linknx liefern.
    Mit linknx und dem "write object" Befehl geht es nun.
    Aber jetzt verstehe ich nicht, warum schreibt linknx immer doppelte Einträge in das Log-File.

    Arbeitszimmer_Temperatur.log
    Code:
    2013-2-6 19:9:58 > 20.5
    2013-2-6 19:9:58 > 20.5
    2013-2-6 19:14:58 > 20.6
    2013-2-6 19:14:58 > 20.6
    Hier der Log von linknx.log
    Code:
    2013-02-06 19:09:57 [ INFO] TimerManager: TimerTask execution. 1360174197
    2013-02-06 19:09:57 [ INFO] Rule: Evaluate rule sendArbeitszimmerTemp
    2013-02-06 19:09:57 [ INFO] Condition: TimerCondition evaluated as '1'
    2013-02-06 19:09:57 [ INFO] Rule: Rule sendArbeitszimmerTemp evaluated as 1, prev value was 0
    2013-02-06 19:09:57 [ INFO] Rule: Evaluate rule sendArbeitszimmerTemp
    2013-02-06 19:09:57 [ INFO] Condition: TimerCondition evaluated as '0'
    2013-02-06 19:09:57 [ INFO] Rule: Rule sendArbeitszimmerTemp evaluated as 0, prev value was 1
    2013-02-06 19:09:57 [ INFO] PeriodicTask: Rescheduled at 2013-2-6 19:14:57 (1360174497)
    2013-02-06 19:09:57 [ INFO] Action: Execute ShellCommandAction: /home/rrdtool/update_database_az.sh
    2013-02-06 19:09:58 [ INFO] KnxConnection: write(gad=0/1/11, buf, len=4)
    2013-02-06 19:09:58 [ INFO] Object: New value 20.5 for object Arbeitszimmer_Temperatur (type: 9.xxx)
    2013-02-06 19:09:58 [ INFO] FilePersistentStorage: Writing log'20.5' for object 'Arbeitszimmer_Temperatur'
    2013-02-06 19:09:58 [ INFO] Object: New value 20.5 for object Arbeitszimmer_Temperatur (type: 9.xxx)
    2013-02-06 19:09:58 [ INFO] FilePersistentStorage: Writing log'20.5' for object 'Arbeitszimmer_Temperatur'
    linknx.xml
    Code:
    <objects>
        <object id="Arbeitszimmer_Temperatur" gad="0/1/11" type="9.xxx" flags="cwtus" log="true">Arbeitszimmer_Temperatur</object>
    </objects>
     
    </rule>
    <!-- update der Arbeitszimmer Temp alle 5min -->
      <rule id="sendArbeitszimmerTemp">
        <condition type="timer" trigger="true">
          <every>300</every>
        </condition>
       <actionlist>
         <action type="shell-cmd" cmd="/home/rrdtool/update_database_az.sh"/>
       </actionlist>
    </rule>
    update_database_az.sh
    Code:
    #!/bin/bash
    cd /home/rrdtool
     
    # Read temperature from sensor Arbeitszimmer
    OBJECTID="Arbeitszimmer_Temperatur"
     
    #Will man nur 2 Kommastellen oder weniger angezeigt bekommen, muss man einfach nur den scale Wert anpassen (0,1,2,3...) 
     
    tempread=`echo "scale=1; $(grep 't=' /sys/bus/w1/devices/w1_bus_master1/28-00000400b1b3/w1_slave | awk -F 't=' '{print $2}') / 1000" | bc -l`
     
    printf '<write><object id="%s" value=%s /></write>\4' "$OBJECTID" "$tempread" | netcat localhost 1028 > /dev/null 2>&1
    Den Befehl printf '<write><object id="%s" value=%s /></write>\4' "$OBJECTID" "$tempread" | netcat localhost 1028 > /dev/null 2>&1
    habe ich mir hier https://knx-user-forum.de/knx-eib-fo...us-linknx.html abgeschaut.

    Ich denke hier wird irgendwo der Fehler liegen.
    Kann mir da noch jemand helfen?

    Besten Dank erstmal.

    Gruß
    Michi

    Einen Kommentar schreiben:


  • Tru
    antwortet
    Zitat von Michixx Beitrag anzeigen
    Wenn ich den Temperaturwert mit groupwrite auf den Bus sende, dann muß ich doch eine GA mit geben. Kann ich mir da einfach eine freie Adresse ausdenken?
    Das würde ich mir so denken, ja. Hab das aber selbst noch nie versucht.
    Zitat von Michixx Beitrag anzeigen
    Und noch eine Frage, den Temperaturwert muß ich dann doch vorher auf HEX umrechnen, oder liege ich da falsch?
    Korrekt.

    Oder eine Alternative: du könntest den Wert statt mit groupwrite auf den Bus zu schreiben, den Wert mittels write-Befehl direkt an linknx liefern. Das würde dir das umrechnen ersparen. Siehe dazu unter SourceForge.net: Interacting with Linknx - linknx Wenn ich mich richtig erinnere gibt es auch ein PHP-Script, das man als Prototyp abwandeln kann. Linknx übernimmt dann gemäss Objekt-Definition das Schreiben auf den Bus.

    Gruss, Othmar

    Einen Kommentar schreiben:


  • Michixx
    antwortet
    Hallo Othmar,
    man sollte das Pferd nicht von hinten aufzäumen, so wie ich es versucht hatte.
    Die Idee mit groupwrite ist gut, das wird die sauberste Lösung sein, darauf bin ich gar nicht gekommen.

    Zitat von Tru Beitrag anzeigen
    Du kannst in linknx.xml problemlos virtuelle Objekte ohne GA erstellen. Ich nehme an, mit GA sollte auch kein Problem sein.
    Wenn ich den Temperaturwert mit groupwrite auf den Bus sende, dann muß ich doch eine GA mit geben. Kann ich mir da einfach eine freie Adresse ausdenken?

    Und noch eine Frage, den Temperaturwert muß ich dann doch vorher auf HEX umrechnen, oder liege ich da falsch?



    Zitat von Tru Beitrag anzeigen
    Oder ist die Frage wegen dem Initiieren der Abfrage?
    Nein, das werde ich über Time-Trigger machen.

    Besten Dank.

    Gruß
    Michi

    Einen Kommentar schreiben:


  • Tru
    antwortet
    Zitat von Michixx Beitrag anzeigen
    Ich hoffe Ihr habt verstanden was ich meine.
    Ich möglicherweise nicht ... aber ich habe auch keine Erfahrung mit dieser Problemstellung.

    Zitat von Michixx Beitrag anzeigen
    Aber wie kann ich nun ein virtuelles nicht vorhandendes Object mit einer GA erstellen und den Wert vom 1-Wire mit Linknx abfragen?
    Du kannst in linknx.xml problemlos virtuelle Objekte ohne GA erstellen. Ich nehme an, mit GA sollte auch kein Problem sein. Allerdings wird linknx beim Start wohl einen Read-Request auf den Bus schicken, wahrscheinlich lässt sich das aber mit einem init-Wert beherrschen.

    Zum Thema abfragen: könntest du dein Script nicht einfach ein groupwrite ausführen lassen? Dann wird es über eibd auf den Bus geschickt und linknx bekommt es automatisch mit.

    Oder ist die Frage wegen dem Initiieren der Abfrage? Das liesse sich wohl über crontab oder einen "every" Time-Trigger im linknx einrichten.

    Gruss, Othmar

    Einen Kommentar schreiben:


  • Michixx
    antwortet
    1-Wire Werte nach Linknx übergeben

    Hallo,

    ich habe an meinem Raspberry einen 1-Wire Sensor angeschlossen.
    Den Temperaturwert lese ich über einen Bash Script aus, das funktioniert auch soweit.

    Code:
    #!/bin/bash
    cd /home/rrdtool
    # Read temperature from sensor Arbeitszimmer
    #Will man nur 2 Kommastellen oder weniger angezeigt bekommen, muss man einfach nur den scale Wert anpassen (0,1,2,3...) 
    tempread=`echo "scale=1; $(grep 't=' /sys/bus/w1/devices/w1_bus_master1/28-00000400b1b3/w1_slave | awk -F 't=' '{print $2}') / 1000" | bc -l`
    Aber wie bekomme ich jetzt den Wert nach Linknx?
    Meine Linknx.xml siehz jetzt so aus.
    Code:
    <persistence type="file" path="/var/lib/linknx" />
    </services>
    <objects>
    <object id="Weather_Temperature" gad="1/0/9" type="9.xxx" flags="cwu" init="persist" log="false">Weather_Temperature</object>
    <object type="1.001" id="LampeJanina" gad="2/2/1">Objet test</object>
    <object id="Wohnzimmer_Temperature" gad="1/4/5" type="9.xxx" flags="cwu" init="persist" log="true">Wohnzimmer_Temperature</object>
    </objects>
    <rules>
    <rule id="Aussen_TEMP_LOG">
    <condition type="object" id="Weather_Temperature" trigger="true" />
    <actionlist type="if-true">
    <action type="shell-cmd" cmd="/home/rrdtool/update_database.sh"/>
    </actionlist>
    </rule>
    <rule id="Wohnzimmer_TEMP_LOG">
    <condition type="object" id="Wohnzimmer_Temperature" trigger="true" />
    <actionlist type="if-true">
    <action type="shell-cmd" cmd="/home/rrdtool/update_database_wz.sh"/>
    </actionlist>
    </rule>
     
    </rules>
    </config>
    Hier ein Beispiel von einem KNX Aussensensor, der ist ja auch in der ETS eingefügt und körperlich vorhanden.
    <object id="Weather_Temperature" gad="1/0/9" type="9.xxx" flags="cwu" init="persist" log="false">Weather_Temperature</object>

    Aber wie kann ich nun ein virtuelles nicht vorhandendes Object mit einer GA erstellen und den Wert vom 1-Wire mit Linknx abfragen?
    Den möchte ich nämlich später an die CometVisu übergeben.

    Ich hoffe Ihr habt verstanden was ich meine.

    Besten Dank schon einmal.

    Gruß
    Michi

    Einen Kommentar schreiben:


  • JuMi2006
    antwortet
    Danke ... doch so einfach

    Einen Kommentar schreiben:


  • Tru
    antwortet
    Zitat von JuMi2006 Beitrag anzeigen
    Ist es möglich in einer Regel/Logik einen Vergleich mit einem festen Wert herzustellen?
    Ja, sicher. Hier ein Beispiel von mir: Wenn die Aussentemperatur zum ersten Mal über 25 Grad steigt, dann soll die Szene 8 Beschattung ausgelöst werden.

    Code:
            <rule id="temp-heiss" init="false">
                <condition type="and">
                    <condition type="object" id="aussentemp" op="gt" value="25" trigger="true" />
                    <condition type="object" id="temp-heiss-set" value="off" trigger="true" />
                </condition>
                <actionlist>
                    <action type="set-value" id="temp-heiss-set" value="on" />
                    <action type="set-value" id="szene8" value="on" />
                </actionlist>
            </rule>
    Gruss, Othmar

    Einen Kommentar schreiben:


  • JuMi2006
    antwortet
    Vergleich mit festem Wert

    Ist es möglich in einer Regel/Logik einen Vergleich mit einem festen Wert herzustellen?

    Ich möchte für das Licht über der Dusche gern ein automatisches Einschalten sobald die Zirkulationstemperatur > 24°C und die Decken- oder Spiegelbeleuchtung eingeschaltet sind.

    Grundsätzlich ist mir das klar, nur ich finde nichts darüber wie ich den Vergleich mit einem festen Wert mache. Immer wird nur vom Vergleich zweier Objekte gesprochen.

    Grüße

    Einen Kommentar schreiben:


  • mumpf
    antwortet
    Zitat von mode Beitrag anzeigen
    Kann mir jemand verraten was ich tun muss, um die XSD Datei von mumpf in Eclipse zu nutzen?

    VG
    Hi,

    sorry dass es so lange gedauert hat, aber ich bin derzeit dienstlich viel unterwegs...

    Ich hab soeben nochmal versucht, das xsd in eclipse zu nutzen:
    • Neues Projekt erzeugen (New->Other->General->Project)
    • Mit Import das XSD und das XML-File hinzufügen (Import->General->File System...)
    • Dann einfach im XML-File editieren, Vorschläge kommen automatisch bzw. per Ctrl-Space, wie in eclipse üblich


    Wie gesagt, die Unterstützung hier ist nicht soooo toll, es gibt z.B. keine Tooltips und somit nicht die von mir zugefügten Kommentare, die beschreiben, welches Attribut wann gilt.

    Aber es hilft, Rechtschreibfehler zu vermeiden...

    Gruß, Waldemar

    Einen Kommentar schreiben:


  • mode
    antwortet
    Noch was wahrscheinlich was Einfaches zum Schluss
    Code:
    <object type="1.001" id="lastue_koch_r" gad="1/2/3" init="off"></object>
    Erwarten würde ich, dass das Obejekt erst triggert, wenn es mit einer 1 beschrieben wird.

    Ich habe dieses Objekt in einer triggerrelevanten Kondition verwendet.
    Code:
    <condition type="object" id="lastue_koch_l" value="off" trigger="true" />
    Leider wird diese Rule verarbeitet sobald die GA 1/2/3 erstmalig eine 0 sendet. Danach richtigerweise nicht mehr. Warum ist das so? Ich gebe doch mit init="off" den Startwert 0 vor. Und da es sich um ein dynamisches Objekt handelt, dürfte doch die Rule garnicht evaluiert werden, da sich das Objekt nicht geändert hat.

    Doch im Log sieht das so aus:
    Code:
    [ INFO] Object: New value off for object lastue_koch_r (type: 1.001)
    [ INFO] Rule: Evaluate rule szene_test
    Gute Nacht


    Edit:
    Weitere Erkenntnis:
    Ein Objekt, dass mit init =on oder =off definiert wurde, erzeugt bei der ersten Benutzung durch eine
    linknx Rule kein Read auf dem Bus. Es wird der mit init eingestellt Wert angenommen.
    Wird ein Objekt dass mit init = off definiert wurde nach dem Start von Linknx von KNX mit off
    beschrieben, so triggern erstmalig trotzdem alle triggerrelevanten Rules. Und das obwohl das Objekt
    weder statisch ist, noch seinen Wert geändert hat. Warum?

    Mode

    Einen Kommentar schreiben:


  • mode
    antwortet
    Heute ist Linknx Tag :-)

    Edit:

    Habe den Fehler bereits gefunden. Man darf eben if-true nicht mit if_true verwechseln. Denn if_true gibt es nicht und dann wird on-true angenommen was ja auch zu dem Verhalten passt. Ich lass den Post trotzdem mal drin weil
    a) Habt ihr was zu lachen ;-)
    b) Vielleicht sensibilisiert das den ein oder anderen für solche Fehler
    c) Nettes Beispiel wie man 2 Rules in eine packen kann.



    Habe eine weitere Frage:
    Ich habe 2 Regeln, die ein besonders smartes Sperren meines Wohnzimmerlichts bewerkstelligen:
    Code:
            <rule id="licht_wz_on">
                <condition type="and"> 
                    <condition type="object" id="sperr_pm_wohnbereich" value="off" trigger="false" />
                    <condition type="object" id="licht_pm_wohnbereich" value="on" trigger="true" />
                </condition>
                <actionlist type="on-true">
                    <action type="set-value" id="szene_pm_wohnbereich" value="1" />
                </actionlist>
            </rule>
    
            <rule id="licht_wz_off">
                <condition type="and"> 
                    <condition type="object" id="sperr_pm_wohnbereich" value="off" trigger="false" />
                    <condition type="object" id="licht_pm_wohnbereich" value="off" trigger="true" />
                </condition>
                <actionlist type="on-true">
                    <action type="set-value" id="szene_pm_wohnbereich" value="0" />
                </actionlist>
            </rule>
    Das funktioniert wunderbar.
    Nun finde ich es kosmetisch unschön, je eine Regel für on und für off zu haben. Daher hier mein Versuch die beiden Regel in einer zu verschmelzen.

    Code:
            <rule id="licht_wz">
                <condition type="and"> 
                    <condition type="object" id="sperr_pm_wohnbereich" value="off" trigger="false" />
                    <condition type="object" id="licht_pm_wohnbereich" trigger="true" />
                </condition>
                <actionlist type="[B]if_true[/B]">
                    <action type="conditional">
                        <condition type="object" id="licht_pm_wohnbereich" value="on" />
                        <action type="set-value" id="szene_pm_wohnbereich" value="1" />
                    </action>
                    <action type="conditional">
                        <condition type="object" id="licht_pm_wohnbereich" value="off" />
                        <action type="set-value" id="szene_pm_wohnbereich" value="0" />
                    </action>
                </actionlist>
            </rule>
    Leider funktioniert diese Regel nur extakt einmal. Wenn Sie dann einmal wahr war, werden trotz if_true die Conditional Bedingungen nicht verarbeitet. Kann es sein, dass if_true und Conditional nicht zusammen verwendet können?

    Log dazu (2. Schalten)
    Code:
    2013-01-20 17:45:43 [ INFO] Rule: Evaluate rule licht_wz
    2013-01-20 17:45:43 [ INFO] ObjectValue: SwitchingObjectValue: Compare value_m='0' to value='0'
    2013-01-20 17:45:43 [ INFO] Condition: ObjectCondition (id='sperr_pm_wohnbereich') evaluated as '1'
    2013-01-20 17:45:43 [ INFO] Condition: ObjectCondition (id='licht_pm_wohnbereich') evaluated as '1'
    2013-01-20 17:45:43 [ INFO] Rule: Rule licht_wz evaluated as 1, prev value was 1
    VG

    Mode

    Einen Kommentar schreiben:

Lädt...
X