Ankündigung

Einklappen
Keine Ankündigung bisher.

php + linknx

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

    php + linknx

    Hallo,

    habe hier ein Problem bei welchem ich Hilfe benötige:
    Ich versuche gerade mit PHP über die xml-Schnittstelle von linknx neue Objekte (object) und Regeln (rule) in die linknx.xml zu schreiben - schaffe ich aber leider nicht ...
    Einen neuen Wert an ein Objekt kann ich senden (siehe Codezeile unten - ersetzt die rot markierte Zeile im gesamten Code)

    Code:
    <?php
    error_reporting(0);
    $linknx_host = "127.0.0.1";
    $linknx_port = 1028;
    $max_result_lines = 1000;
    header('Content-Type: application/xml; charset=iso-8859-1');
    $sock = fsockopen($linknx_host, $linknx_port, $errno, $errstr, 30);
    if (!$sock)
    $result = "<response status='error'>Unable to connect to linknx</response>\n";
    else {
    [COLOR="Red"]fwrite($sock, "<write><config><objects><object id='date' gad='25/2/7' flags='cwtuf' type='11.001'>Datum</object></objects></config></write>" . chr(4));[/COLOR]
    $result = '';
    $cnt = 0;
    while ($cnt < $max_result_lines && $sock && !feof($sock)) {
    $result .= fgets($sock, 128);
    $c = fgetc($sock);
    if ($c == "\4") break;
    $result .= $c;
    $cnt++;
    }
    fclose($sock);
    }
    print($result);
    ?>
    Code:
    fwrite($sock, "<write><object id='Esszimmer_Licht_schalten' value='0'/></write>" . chr(4));

    #2
    php + linknx

    Hi,

    bin jetzt leider nicht der PHP Experte...

    Versuchs doch mal mit "curl" auf den TCP-Port...

    Kommentar


      #3
      Zitat von Tqm Beitrag anzeigen
      Schaffe ich aber leider nicht ...
      Ich kann keinen Fehler in der Zeile erkennen, von daher sollte es klappen. Hast du beachtet, dass du linknx mit -w aufstarten musst, damit das linknx.xml geschrieben werden kann und stimmen die Zugriffsrechte für den Prozessowner auf dem Filesystem?

      Gruss, Othmar
      EIB/KNX, VISU mit knxd + linknx + knxweb, Steuerbefehle via SMS und Email mit postfix + procmail

      Kommentar


        #4
        Sollte passen:
        linknx -w/var/lib/linknx/linknx.xml --daemon=/var/lib

        die Schreibrechte mit
        chmod a+rw linknx.xml
        gesetzt ...

        Kommentar


          #5
          Also selbst im Log findet sich:
          1369489676 INFO Object : Configured object 'date': gad=25/2/7

          Nur in der linknx.xml finde ich den Eintrag nicht ...

          ?????

          Kommentar


            #6
            Zitat von Tqm Beitrag anzeigen
            linknx -w/var/lib/linknx/linknx.xml --daemon=/var/lib
            Und es funktioniert trotzdem nicht? Nun, ganz sauber ist es nicht, vielleicht scheitert es daran. Ich sehe zwei Punkte, welche du noch verbessern könntest. Eventuell klappt es dann:
            1) Du hast keine Angabe für das Konfigfile, vielleicht wird dann das -w gar nicht mehr beachtet.
            2) das Argument zu --daemon sollte ein File sein.

            Mein Vorschlag:
            linknx --config=/var/lib/linknx/linknx.xml --write --daemon=/var/lib/linknx/linknx.log --pidfile=/var/lib/linknx/linknx.pid

            Wie merkst du überhaupt, dass es nicht funktioniert? Um es im File zu sehen, müsstest du ja noch den Befehl <admin><save/></admin> oder so ähnlich schicken.

            Hast du auch mal probiert, nach dem Command noch ein Newline zu schicken vor dem chr(4)?

            Eigentlich müsste es wirklich klappen, jedenfalls konnte ich deinen Befehl mit Copy/Paste erfolgreich über Telnet in meinem linknx einpflegen und mit dem admin-Befehl speichern.

            Gruss, Othmar
            EIB/KNX, VISU mit knxd + linknx + knxweb, Steuerbefehle via SMS und Email mit postfix + procmail

            Kommentar


              #7
              Doppelpost

              Kommentar


                #8
                zu 2:
                hier habe ich offensichtlich leider einen teil nicht mitkopiert ...
                richtig ist: --daemon=/var/lib/linknx/linknx.log

                So, das Problem ist dann das ich das File offensichtlich nicht speichere ...

                so?
                Code:
                fwrite($sock, "<write><config><objects><object id='date' gad='25/2/7' flags='cwtuf' type='11.001'>Datum</object></objects></config></write><admin><save/></admin>" . chr(4));

                Kommentar


                  #9
                  es funktioniert!

                  So funktioniert es nun!

                  @ Othmar, Danke für die Info´s!

                  Code:
                  <?php
                  error_reporting(0);
                  $linknx_host = "127.0.0.1";
                  $linknx_port = 1028;
                  $max_result_lines = 1000;
                  header('Content-Type: application/xml; charset=iso-8859-1');
                  $sock = fsockopen($linknx_host, $linknx_port, $errno, $errstr, 30);
                  if (!$sock)
                  $result = "<response status='error'>Unable to connect to linknx</response>\n";
                  else {
                  fwrite($sock, "<write><config><objects><object id='date' gad='25/2/7' flags='cwtuf' type='11.001'>Datum</object></objects></config></write>". chr(4));
                  [COLOR="Red"]fwrite($sock, "<admin><save file='/var/lib/linknx/linknx.xml'/></admin>". [/COLOR]chr(4));
                  $result = '';
                  $cnt = 0;
                  while ($cnt < $max_result_lines && $sock && !feof($sock)) {
                  $result .= fgets($sock, 128);
                  $c = fgetc($sock);
                  if ($c == "\4") break;
                  $result .= $c;
                  $cnt++;
                  }
                  fclose($sock);
                  }
                  print($result);
                  ?>

                  Kommentar


                    #10
                    Kann mir bitte noch jemand bei der Definition für eine "rule" helfen - irgendwie geht mir hier die Attribute aus - sprich ich weiß Sie nicht zu definieren ...

                    Code:
                    fwrite($sock, "<write><config><rules><rule id='Zeitschaltuhr'><condition type='timer'></condition><actionlist><action></action></actionlist></rule></rules></config></write>". chr(4));
                    der nächst Schritt wäre "at" oder "every" zu definieren (z.Bsp: at hour="7" min="30" wdays="12345") nur wie geht es nach <condition type='timer'> nun weiter?

                    Frage gestellt und anschließend selbst daraufgekommen ...

                    fwrite($sock, "<write><config><rules><rule id='Zeitschaltuhr'><condition type='timer'><at hour='7'/></condition><actionlist>.....

                    Kommentar


                      #11
                      Zitat von Tqm Beitrag anzeigen
                      So funktioniert es nun!
                      Scheint mir aus programmlogischer Sicht aber nicht ganz korrekt zu sein. Mit dem chr(4) wird der Befehl abgeschlossen und als nächstes müsste die Antwort ausgelesen werden, was in der anschliessenden while-Schlaufe geschieht. Bekommst du nun eine Doppelantwort oder eine einzelne und zu welchem Befehl gehört die dann?
                      Warum verallgemeinerst du die ganze Funktion nicht einfach, mit einem XML-Command als Parameter?
                      In einem Hauptprogramm kannst du diese Funktion für die verschiedenen XML-Befehle aufrufen, zusammen mit einem sauberen Error-Handling.
                      Und wenn du das Connection-Handling noch optimieren willst, kannst du auch das Open und Close noch vom Schreib-/Lesezyklus separieren.

                      Gruss, Othmar
                      EIB/KNX, VISU mit knxd + linknx + knxweb, Steuerbefehle via SMS und Email mit postfix + procmail

                      Kommentar


                        #12
                        Hallo Othmar,

                        besten Dank für Deinen Input nur hier stehe ich nun mit meinem Wissen an ...

                        Zitat von Tru Beitrag anzeigen
                        Warum verallgemeinerst du die ganze Funktion nicht einfach, mit einem XML-Command als Parameter?
                        Habe ich versucht, aber irgendwas mache ich dabei falsch ...

                        Mfg
                        Thomas

                        Kommentar

                        Lädt...
                        X