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

    #61
    Danke ... doch so einfach
    Umgezogen? Ja! ... Fertig? Nein!
    Baustelle 2.0 !

    Kommentar


      #62
      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

      Kommentar


        #63
        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
        EIB/KNX, VISU mit knxd + linknx + knxweb, Steuerbefehle via SMS und Email mit postfix + procmail

        Kommentar


          #64
          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

          Kommentar


            #65
            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
            EIB/KNX, VISU mit knxd + linknx + knxweb, Steuerbefehle via SMS und Email mit postfix + procmail

            Kommentar


              #66
              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

              Kommentar


                #67
                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.
                OpenKNX www.openknx.de

                Kommentar


                  #68
                  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

                  Kommentar


                    #69
                    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
                    OpenKNX www.openknx.de

                    Kommentar


                      #70
                      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>
                      Gruß,
                      Oliver

                      Kommentar


                        #71
                        Zitat von Merlin123 Beitrag anzeigen
                        Würde das so ungefähr aussehen?
                        Fast richtig, so sollte es funktionieren (wenn der DPT 3.008 für den Rollladen-Aktor korrekt ist):
                        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="rollladen" gad="1/2/1" >Rollladen</object>
                                <object type="1.001" id="AufrufGA" gad="2/0/1" >AufrufGA</object>
                            </objects>
                            <rules>
                                <rule id="Szene1">
                                    <condition type="object" id="AufrufGA" value="1" trigger="true" />
                                    <actionlist>
                                        <action type="set-value" id="licht_on_off" value="1" />
                                        <action type="set-value" id="rollladen" value="1" />
                                    </actionlist>
                                </rule>
                            </rules>
                        </config>

                        Kommentar


                          #72
                          Danke!
                          Muss ich heute abend mal testen.
                          Im Wiki steht wegen dem DPT

                          3.008: blinds (control of blinds using close/open/stop)

                          Müsste das ja dann sein, oder?
                          Gruß,
                          Oliver

                          Kommentar


                            #73
                            Ja, den Datentyp gibt es, aber meine Aktoren verwenden z.B. eine GA für Auf/Ab und eine für Stopp., d.h. du musst schauen, welchen Typ dein Aktor verwendet.

                            Kommentar


                              #74
                              Hab getrennte GAs für Auf/ab und für Lamellenstellung. Wenn ich auf die erste GA was schicke fährt er komplett hoch/runter, bei der anderen stoppt er dann bzw. zuckt nur recht kurz.
                              Welche DPT wäre dann richtig? (Kann es aber auch einfach ausprobieren. Sollte ja nichts kaputt gehen können)
                              Gruß,
                              Oliver

                              Kommentar


                                #75
                                Dann sind es beide DPT 1.001

                                Kommentar

                                Lädt...
                                X