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

  • NetFritz
    antwortet
    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

    Einen Kommentar schreiben:


  • netsrac
    antwortet
    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"

    Einen Kommentar schreiben:


  • netsrac
    antwortet
    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

    Einen Kommentar schreiben:


  • mumpf
    antwortet
    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

    Einen Kommentar schreiben:


  • NetFritz
    antwortet
    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

    Einen Kommentar schreiben:


  • mumpf
    antwortet
    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

    Einen Kommentar schreiben:


  • NetFritz
    antwortet
    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

    Einen Kommentar schreiben:


  • NetFritz
    antwortet
    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";
    }
    ?>

    Einen Kommentar schreiben:


  • mumpf
    antwortet
    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

    Einen Kommentar schreiben:


  • netsrac
    antwortet
    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

    Einen Kommentar schreiben:


  • Cneumaier
    antwortet
    Variables delay in Action

    Hallo,

    hab da mal ne Frage, bin wohl mal wieder Blind, oder es gibt hier keinen Hinweis drauf. Aber vielleicht hat das ja schon jemand umgesetzt.

    Ich möchte gerne die Delayzeit einer Action variabel gestalten z.B. über einen Infotrigger der CV.

    Wie der Code mit statischem Delay aussieht weiß ich:

    Code:
        <rule id="xxxx">   
         <condition type="and">
           <condition type="object" id="xxxx" value="on" trigger="true" />
         </condition>
    
         <actionlist type="if-true">
            <action type="set-value" id="yyyy" value="on"/>
            <action type="set-value" id="yyyy" value="off" delay="20m"/>
         </actionlist>
        </rule>
    unter sourceforge.net

    hab ich folgenden Code für einen Timer gefunden:
    Code:
    <at type="variable" time="wakeup_time" wdays="12345">
    dafür muss ich aber eine "Uhrzeit" EIS3 oder EIS4 haben.

    Hat jemand einen Tip, wie ich das machen kann?

    Einen Kommentar schreiben:


  • MGK
    antwortet
    hmmm... keine Ahnung wie Linknx gebaut ist in Deinem verwendeten Image.

    auf jeden Fall kann man mit den Log level einstellen:
    Code:
    <logging format="simple" level="WARN"/>
    "DEBUG", "INFO", "NOTICE", "WARN" and "ERROR". The default value is "INFO"
    Wenn log4cpp eingebunden ist??? kann man noch viel mehr einstellen laut Doku-Wiki inklusive max Grösse und logrotate.

    Michael

    Einen Kommentar schreiben:


  • docjey
    antwortet
    linknx.log

    Zitat von MGK Beitrag anzeigen
    Man kann auch rules auf aktiv oder nicht-aktiv setzen mit "set-rule-active", da könnte man evt. auch was mit bauen...

    23:59: regel auf aktiv setzen
    00:01: wenn nicht execpition day regel auf inaktiv

    oder so...

    Michael

    Hallo MGK,

    mit ein bisschen Logik wird die linknx.log recht schnell recht gross. gibt es eine Möglichkeit, zB zu sagen "wenn x.log > 20 MB dann lösche älteste Einträge bis x.log < 20 MB.

    Gruss
    docjey

    Einen Kommentar schreiben:


  • Cneumaier
    antwortet
    Hallo Waldemar, hallo Michi,

    soweit hatte ich auch schon an die beiden Möglichkeiten gedacht. Aber wie sehen dann die entsprechenden Codes aus?

    Einen Kommentar schreiben:


  • MGK
    antwortet
    Man kann auch rules auf aktiv oder nicht-aktiv setzen mit "set-rule-active", da könnte man evt. auch was mit bauen...

    23:59: regel auf aktiv setzen
    00:01: wenn nicht execpition day regel auf inaktiv

    oder so...

    Michael

    Einen Kommentar schreiben:

Lädt...
X