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

    Moin moin...

    mal 'ne doofe Frage: Ich möchte mit LinKNX gerne einen Intervall-Timer erstellen. Es geht darum, dass ich alle aa Minuten meinen Zirkulationsplumpe für xx Minuten laufen lassen will und das in Abhängigkeit von drei Situationen:

    1)
    Tagsüber in der Zeit von 7:00 bis 22:00 soll die Zirkulationspumpe alle 30min für 5 min anspringen.

    2)
    Nachts - also in der Zeit von 22-7 Uhr soll sie alle 60 min für 5 min anspringen

    3)
    Wenn abwesend (den Status habe ich), dann soll sie alle 3h einmal für 15 Min angehen.

    Danke...Netsrac

    Kommentar


      Hi,

      wo ist das Problem?

      Mal im Ernst: Ich mach solche Dinger immer, indem ich die timer-condition mit every immer laufen lasse (in den erwarteten Intervallen) und als action eine conditional action nehme. In die condition der conditional action kommen dann mit and alle Bedinungen rein, die für eine Auslösung nötig sind.

      Also ganz Grob bei Dir:
      Code:
      		<rule id="UmwaelzpumpeTagNacht">
      			<condition type="timer" trigger="true">
      				<every>3600</every>
      			</condition>
      			<actionlist>
      				<action type="conditional">
      					<condition type="and">
      						<condition type="object" id="Anwesend" value="1"/>
      					</condition>
      					<action type="set-value" id="Umwaelzpumpe" value="1"/>
      					<action type="set-value" id="Umwaelzpumpe" value="0" delay="5m"/>
      				</action>
      				<action type="conditional">
      					<condition type="and">
      						<condition type="object" id="Anwesend" value="1"/>
      						<condition type="object" id="IstTag" value="1"/>
      					</condition>
      					<action type="set-value" id="Umwaelzpumpe" value="1" delay="30m"/>
      					<action type="set-value" id="Umwaelzpumpe" value="0" delay="35m"/>
      				</action>
      			</actionlist>
      		</rule>
      Hoffe, der Code ist einigermaßen selbsterklärend. Ist jetzt nur für die Punkte 1 und 2, für 3 kannst Du es ja analog lösen.

      Gruß, Waldemar
      OpenKNX www.openknx.de

      Kommentar


        linknx und php

        Hallo
        Ich habe linknx mit dem Script von Ferengi
        http://cnc-selbstbau.info/KNX/cometsetup.sh auf einem Raspberry Pi installiert.

        Ich kann die Werte mit einem kleinen PHP5-CLI Script auslesen.
        Dazu muss ich immer die gad mit angeben.

        Wie bekomme ich es hin das ich auf den BUS mit Hilfe von PHP u. linknx horchen kann?

        Eine Ausgabe von gad und Wert reicht.
        So wie in der linknx.log da steht z.B.
        "1406641168 INFO Object : New value 29.74 for object aussentemp (type: 9.xxx)" drin.

        Gruß NetFritz

        Code:
        #!/usr/bin/php5   
        <?php
        
        function knxread($fp, $name)
        {
            $in = "<read><object id='$name'/></read>\n\4";
        
            fwrite($fp, $in);
        
            $ret = '';
            $cnt = 0;
            while ($cnt < 4 && $fp && !feof($fp)) {
                $ret .= fgets($fp, 128);
                $c = fgetc($fp);
                if ($c == "\4") {
                    if (ereg ("<read status='success'>([^<]+)</read>", $ret,$regs))
                      $ret = $regs[1];
                    break;
                }
                $ret .= $c;
                $cnt++;
            }
            return $ret;
        }
        
        #$gad = "test_on_off";
        
        $gad = "aussentemp";
        $address = "127.0.0.1";
        $port = 1028;
        
        $fp = fsockopen($address, $port, $errno, $errstr, 30);
        if (!$fp) {
            echo "$errstr ($errno)<br />\n";
        }
        else {
        print knxread($fp,$gad) ."\n";
        }
        ?>
        KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
        WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
        PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

        Kommentar


          Hallo
          Mit einem Script kann man wohl die Schnittstelle nicht Event geteuert abfragen.
          Um da an die Werte zu kommen muss man immer mit
          $in = "<read><object id='$name'/></read>\n\4"; fwrite($fp, $in);
          ein read schicken.

          Ich habe mal meine linknx.xml so angepasst das mit Hilfe von Lua ein PHP-Script aufgerufen wird.
          Dem Script sollen beim aufruf die id und value mitgegeben werden.
          Code:
              <objects>
                  <object type="1.001" id="test_on_off" gad="2/1/1">Objet test</object>
                  <object type="9.xxx" id="MD0" gad="5/3/8">aussentemp</object>
                  <object type="9.xxx" id="MD1" gad="5/3/5">feuchte</object>
              </objects>
          <rules>
          
          <rule id="MD1">
             <condition type="or">
                  <condition type="object" id="MD0" trigger="true"/>
                  <condition type="object" id="MD1" trigger="true"/>
             </condition>
             <actionlist type= "if-true">
              <!--  <action type="script">os.execute("/var/www/test.php 42 '"..obj("MD0").."' '"..obj("value").."' add");</action> -->
                    <action type="script">os.execute("/var/www/test9.php 42 '"..obj("MD0").."' add");</action>
             </actionlist>
          </rule>
          
          </rules>
          Das PHP-Script wird aufgerufen, aber mit den übergabe Werten geht es so nicht.
          Ich habe es nach diesem Thread versucht:https://knx-user-forum.de/knx-eib-fo...ell-cmd-2.html
          Was kann ich da machen?

          In rule habe ich "<rule id="MD1">", kann ich da jeden belibigen Namen eintragen?

          Gruß NetFritz
          KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
          WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
          PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

          Kommentar


            Hi,

            der LUA-Aufruf sieht richtig aus... Du bist sicher, dass Dein php-Script 3 Argumente empfangen kann? Ich kenn mich mit PHP nicht so aus...

            Das mit der rule-id sollte so gehen, wobei ich es immer vermeide, doppelte ID's zu vergeben.

            Gruß, Waldemar
            OpenKNX www.openknx.de

            Kommentar


              Hallo
              Du bist sicher, dass Dein php-Script 3 Argumente empfangen kann?
              Wie kommst Du auf 3 Argumente.

              PHP kann noch mehr Argumente empfangen.
              Die Übergabe beim Start sieht so aus:
              Code:
              /var/www/test.php?arg1="test1"&arg2="test2"
              Im Script test.php steht dann:
              Code:
              #!/usr/bin/php5   
              <?php
              echo $_GET["arg1"];
              echo $_GET["arg2"];
              ?>
              So geht es auch nicht.
              Code:
               <action type="script">os.execute("/var/www/test.php?arg1= '"..obj("MD0").."' add");</action>
              bekomme in der log diese Ausgabe:
              Code:
              sh: 1: /var/www/test.php?arg1=: not found
              Gruß NetFritz
              KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
              WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
              PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

              Kommentar


                Hi,

                mit der Zeile
                Code:
                          <action type="script">os.execute("/var/www/test9.php 42 '"..obj("MD0").."' add");</action>
                setzt Du folgende Kommandozeile ab (angenommen, MD0 hat den Wert 20.2):
                Code:
                /var/www/test9.php 42 '20.2' add
                Du kannst also per Kommandozeile testen, was Dein Script mit dem Aufruf macht. Ich habe bisher nur bash scripte benutzt, und die interpretieren bei diesem Aufruf 3 Argumente.

                Übrigens: Die Zeile
                Code:
                /var/www/test.php?arg1="test1"&arg2="test2"
                ist bestimmt nicht über Kommandozeile eingegeben, oder? Geht doch über Adressleiste des Browsers (denke ich). Da sitzt dann ja noch der Webserver zwischen, der dann dein php script aufruft. Über LUA os.execute setzt Du aber direkt Befehle auf der Kommandozeile ab.

                Gruß, Waldemar
                OpenKNX www.openknx.de

                Kommentar


                  Alles was Ihr mit einem "?" unter das PHP Script hängt wird normalerweise vom webbrowser über den QUERYSTRING an das PHP Script weitergeleitet und dort das so aufbereitet, dass man es über $_GET abrufen kann.

                  Rufst Du PHP über die Kommandozeile auf, so klappt das nicht.

                  Hier musst Du dann - ähnlich wie bei Shell-Scripten auf die argv zugreifen.

                  Der erste Parameter ist dann z.B.:

                  Code:
                  $argv[1]
                  Alternativ kannst Du Dein PHP Script natürlich auch via eines Webrequests aufrufen - also bei Shell-Kommando sowas wie:

                  Code:
                  curl [URL]http://my.server.de/myscript?arg1=aaa&arg2=bbb&arg3=ccc[/URL]
                  Damit könntest Du dann über linKNX z.B. auch Daten auf einen anderen Server bringen.

                  Wenn Du jetzt noch Probleme hast, dann zeige doch einfach mal Dein PHP Script.

                  Gruß, netsrac

                  Kommentar


                    Achja, und wenn mal ein PHP Script direkt ausführbar machen will, dann müss man folgendes oben ins Script schreiben:

                    Code:
                    #!/usr/bin/php
                    <?php
                      .....
                    Dann machst Du das script executable z.b. mit "chmod 755 filename.php"

                    Kommentar


                      Hallo

                      Vielen Dank für die Ausführungen zu PHP.
                      Ich hatte PHP als CLI-Script benutzt.

                      Inzwischen bin ich auf Perl umgestiegen, das übergeben einer Variable geht auch.

                      Code:
                      <action type="script">os.execute("/var/www/test.pl '"..obj("MD1").."' add");</action>
                      Ich bekomme value vom object mit der id=MD1 im Perl-Script angezeigt.

                      Da ich aber mehre objecte habe, die bei value änderung die action aufrufen, muß ich beim Aufruf vom Perl-Scribt die id vom geänderten Object mit angeben.
                      Ich möchte auch den Scribt auch die id mit übergeben.
                      Wie kann man das machen?

                      Gruß NetFritz
                      KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
                      WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
                      PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

                      Kommentar


                        Zitat von NetFritz Beitrag anzeigen
                        Da ich aber mehre objecte habe, die bei value änderung die action aufrufen, muß ich beim Aufruf vom Perl-Scribt die id vom geänderten Object mit angeben.
                        Ich möchte auch den Scribt auch die id mit übergeben.
                        Wie kann man das machen?
                        Hmm....verstehe Deine Frage nicht so richtig,.

                        Also, Du kannst doch einfach verschiedene Rules in linKNX machen und die entsprechende ID dann dem Script statisch als Parameter übergeben - also statt der Variablen einfach eine statische ID.

                        Kommentar


                          Hallo
                          Hier mal meine linknx.xml.
                          Code:
                              <objects>
                                  <object type="9.xxx" id="MD0" gad="5/3/8">aussentemp</object>
                                  <object type="9.xxx" id="MD1" gad="5/3/5">feuchte</object>
                                  <!-- hier kommen noch weitere Objecte rein -->
                              </objects>
                          <rules>
                          
                          <rule id="MD">
                              <condition type="or">
                                  <condition type="object" id="MD0" trigger="true"/>
                                  <condition type="object" id="MD1" trigger="true"/>
                                  <!-- hier kommen noch weitere Conditions rein -->
                              </condition>
                              <actionlist type= "if-true">
                                 <action type="script">os.execute("/var/www/test.pl '"..obj("MD1").."' add");</action>
                              </actionlist>
                          </rule>
                          
                          </rules>
                          Die Action wird ausgeführt wenn sich Value von MD0 oder MD1 ändert.
                          In Action soll aber dynamisch bei obj() MD0 oder MD1 (später noch mehre) eingetragen werden.
                          Dem Perl-Sript sol dan dynamisch Value und Id übergeben werden.

                          Ich hoffe das ich mich jetzt klarer ausgedrückt habe.

                          Gruß NetFritz
                          KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
                          WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
                          PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

                          Kommentar


                            Zitat von NetFritz Beitrag anzeigen
                            Hallo
                            Hier mal meine linknx.xml.
                            Code:
                                <objects>
                                    <object type="9.xxx" id="MD0" gad="5/3/8">aussentemp</object>
                                    <object type="9.xxx" id="MD1" gad="5/3/5">feuchte</object>
                                    <!-- hier kommen noch weitere Objecte rein -->
                                </objects>
                            <rules>
                            
                            <rule id="MD">
                                <condition type="or">
                                    <condition type="object" id="MD0" trigger="true"/>
                                    <condition type="object" id="MD1" trigger="true"/>
                                    <!-- hier kommen noch weitere Conditions rein -->
                                </condition>
                                <actionlist type= "if-true">
                                   <action type="script">os.execute("/var/www/test.pl '"..obj("MD1").."' add");</action>
                                </actionlist>
                            </rule>
                            
                            </rules>
                            Die Action wird ausgeführt wenn sich Value von MD0 oder MD1 ändert.
                            In Action soll aber dynamisch bei obj() MD0 oder MD1 (später noch mehre) eingetragen werden.
                            Dem Perl-Sript sol dan dynamisch Value und Id übergeben werden.

                            Ich hoffe das ich mich jetzt klarer ausgedrückt habe.

                            Gruß NetFritz

                            Okay, das klappt dann nicht - generell schon deswegen nicht, da Du innerhalb der actionlist nicht weißt, welche Wertänderung per Trigger die Rule aufgerufen hat.

                            Es bleibt Dir also nix weiter übrig, als für jede Wertänderung (oder wie Du es nennst, ID) eine eigene Rule zu machen und dort dann die ID statisch dem Script zu übergeben. Ist zwar etwas mehr schreibarbeit, aber Performance-Mäßig wirkt sich das nicht aus...


                            Gruß, Netsrac

                            Kommentar


                              Hallo
                              Okay, das klappt dann nicht - generell schon deswegen nicht, da Du innerhalb der actionlist nicht weißt, welche Wertänderung per Trigger die Rule aufgerufen hat.
                              Ist schade.
                              Ich hätte erwartet das man die id in etwa so auskesen könnte:
                              obj.id()
                              und Value so:
                              obj(obj.id)

                              Ich werde es mal mit einigen Rules versuchen.
                              Gruß NetFritz
                              KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
                              WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
                              PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

                              Kommentar


                                Naja, ebend genau deswegen - eine dieser conditions triggert die Rule:
                                Code:
                                    <condition type="or">         <condition type="object" id="MD0" trigger="true"/>         <condition type="object" id="MD1" trigger="true"/>         <!-- hier kommen noch weitere Conditions rein -->     </condition>
                                Nur weiß eben die Actionlist nicht, welches Objekt es war.

                                Keine Ahnung, was Du mit den Daten in Deinem Script machst. Ich mache sowas ähnliches, und schicke immer alle Werte an mein Script. Dieses greift dann intern auf 'ne Datenbank zu und weiß daher, welche Werte sich seit dem letzten Mal verändert haben.

                                Kommentar

                                Lädt...
                                X