Ankündigung

Einklappen
Keine Ankündigung bisher.

SCN-IP000.03 aus PHP per WebRequest ansteuern für KNX-Telegramme lesen und absetzen?

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

    #16
    Hallo Smart Guido,

    habe mir eben Deinen Vorschlag nochmal genauer angesehen. Vielen Dank!

    Wäre natürlich deutlich cooler und einfacher, weil ich nicht erst in der BAOS was einrichten müsste, sondern sofort direkt auf die Datenpunkte zugreifen und sie auslesen und manipulieren könnte...

    MatthiasS hatte ja auch schon mal auf die Falkon SDK hingewiesen (Danke dafür)

    Und die hatte ich eben bei Dir in diesem Beitrag wiedergefunden:
    https://knx-user-forum.de/forum/%C3%...nutzbar-machen

    Nur damit ich das (erst) einmal ganz grob verstehe:
    Ich könnte die Falcon SDK 6 einsetzen und dann Deine COM-Schnittstelle für die Nutzung mit meinem vorhandenen lokalen XAMPPLITE ?

    Aber was genau bräuchte ich in welcher Reihenfolge?
    1) Die Falcon 6.NET SDK kann ich unter meinem MyKNX-Account herunterladen => Finde sie dort aber nicht, weil mir der Punkt "Ressources" fehlt... https://support.knx.org/hc/en-us/articles/4410819071122-How-to-get-the-Manufacturer-Falcon-6-NET-SDK => Wo müsste ich suchen?
    (und dann bräuchte ich ja auch keine IDE wie das Microsoft Visual Studio 2019, oder?)
    2) Dann müsste ich das .NET Framework 4.8 (or higher) and/or .NET 5 (or higher) auf meinem Windows-XAMPPLITE-PC installieren
    3) Dann müsste ich eine USB-Verbindung von meinem Windows-XAMPPLITE-PC nach irgendwo haben => Wo genau müsste ich das anschließen?
    4) Dann Deine DLL aus dem obigen Beitrag herunterladen
    5) Dann die Schritte aus Deinem obigen Beitrag unter "Nutzung der DLL als COM Schnittstelle" umsetzen, um die DLLs einzubinden
    6) Und dann kann ich schon den Code umsetzen aus Deinem Beispiel von Deinem letzten Beitrag?

    Das wäre es mir wert, wenn es einigermaßen stressfrei zu installieren wäre ;-)

    Es grüßt herzlich ein etwas verwirrter
    ThommyH
    Zuletzt geändert von ThommyH; 08.10.2025, 17:25.

    Kommentar


      #17
      Hallo ThommyH,

      sorry, ich habe nur zufällig gesehen, dass du geschrieben hast.

      Zu deinen Fragen:
      1. Nein, du brauchst kein Konto bei knx.org, um das Falcon SDK herunterzuladen. Das kannst du direkt über NuGet beziehen (https://www.nuget.org/packages/Knx.Falcon.Sdk).
      2. Ja, das .NET Framework 4.8.1 oder höher sollte installiert sein.
      3. Ja, das hängt vom Gateway ab, das du verwendest, bei einem USB Gateway einfach per USB verbinden, beim IP Gateway über das Netzwerk.
      4. Ja genau.
      5. Die Anleitung verwenden und den Wrapper wie beschrieben als COM Schnittstelle unter Windows dann zu registrieren.
      6. Ja, genau, das wäre ein einfaches Beispiel.

      Die Installation geht eigentlich recht schnell. Ich habe den Wrapper mit verschiedenen Programmiersprachen getestet. Bei manchen funktionieren alle Funktionen einwandfrei, bei anderen nur die wichtigsten.
      PHP habe ich kurz getestet, und es hat grundsätzlich funktioniert, man muss sich jedoch jedes Mal neu verbinden, wenn man etwas lesen oder schreiben möchte. Ausführlicher habe ich PHP nicht getestet, nur das Beispiel, das ich hier hinterlassen habe, aber es lief ohne Probleme.


      PS: In Beitrag #19 zeige ich ein PHP-Beispiel, das eine einmalige Verbindung herstellt. Zusätzlich hier ein Beispiel, wie man empfangene Telegramme abfragen kann.​


      knx_daemon.php
      PHP-Code:
      <?php
      error_reporting
      (E_ALL);
      ini_set('display_errors'1);

      $address '127.0.0.1';
      $port 9000;

      echo 
      "[KNX] Starte Daemon...\n";
      $knx = new COM("KNXlib.KnxController");
      $knx->Connect("192.168.178.42"3671false);
      echo 
      "[KNX] Verbindung hergestellt.\n";

      $value $knx->ReadValue("4/1/3"91);
      if (
      $value !== null && $value !== false) {
      echo 
      "[KNX] Start-Temperatur: $value °C\n";
      } else {
      echo 
      "[KNX] Fehler beim Lesen der Start-Temperatur\n";
      }

      $server stream_socket_server("tcp://$address:$port"$errno$errstr);
      if (!
      $server) die("Fehler beim Starten: $errstr ($errno)\n");

      $i 0;

      $statusArray = [
      "10/0/2" => "aus",
      "10/0/3" => "aus",
      "temp" => null,
      ];

      function 
      ProcessKNXData($knx$client null) {
      static 
      $i 0;
      static 
      $statusArray = [];

      try {
      $x1 $knx->GetReceiveDataValueAt($i"gaddress");
      $x2 $knx->GetReceiveDataValueAt($i"svalue");

      if (!
      str_contains($x1"Index out of range")) {

      switch (
      $x1) {
      case 
      "10/0/2":
      $statusArray["10/0/2"] = ($x2 == "1") ? "ein" "aus";
      echo 
      "[KNX] Küchenspots " . ($x2 == "1" "eingeschaltet" "ausgeschaltet") . "\n";
      if (
      $client) {
      fwrite($client"STATUS: Küchenspots " . ($x2 == "1" "🟢" "🔴") . "\n");
      }
      break;

      case 
      "10/0/3":
      $statusArray["10/0/3"] = ($x2 == "1") ? "ein" "aus";
      echo 
      "[KNX] Küchenlampe " . ($x2 == "1" "eingeschaltet" "ausgeschaltet") . "\n";
      if (
      $client) {
      fwrite($client"STATUS: Küchenlampe " . ($x2 == "1" "🟢" "🔴") . "\n");
      }
      break;
      }

      $i++;
      if (
      $i >= 100) {
      $knx->GetReceiveDataClear();
      $i 0;
      }
      }

      return 
      $statusArray;

      } catch (
      Exception $e) {
      echo 
      "[Fehler] Beim Verarbeiten der KNX-Daten: " $e->getMessage() . "\n";
      if (
      $client) {
      fwrite($client"ERROR: " $e->getMessage() . "\n");
      }
      }
      }

      $statusArray = [];

      while (
      true) {
      $statusArray ProcessKNXData($knx);

      $client = @stream_socket_accept($server0);
      if (
      $client) {
      $data trim(fgets($client));
      echo 
      "[REQ] $data\n";

      switch (
      $data) {
      case 
      "on_spots":
      $knx->WriteBool("1/0/0"true);
      break;
      case 
      "off_spots":
      $knx->WriteBool("1/0/0"false);
      break;
      case 
      "on_lampe":
      $knx->WriteBool("1/0/1"true);
      break;
      case 
      "off_lampe":
      $knx->WriteBool("1/0/1"false);
      break;
      case 
      "temp":
      $value $knx->ReadValue("4/1/3"91);
      fwrite($client"Temperatur: $value C\n");
      break;
      case 
      "status":
      fwrite($clientjson_encode($statusArray) . "\n");
      break;
      default:
      fwrite($client"ERROR: Unbekannter Befehl\n");
      break;
      }

      fclose($client);
      }

      usleep(50000);
      }
      ?>

      Zuletzt geändert von Smart Guido; Heute, 22:17.
      Mit besten Grüßen,
      Guido

      Meine Projekte hier : KNX Busmonitor​​ / KNX Schalter mit Audio​ / KNX PiRadio

      Kommentar


        #18
        Hallo Smart Guido,

        vielen Dank für Deine kurzen und gut verständlichen Infos!

        Sobald ich etwas Zeit finde..., versuche ich mich mal dran und gebe dann wieder Rückinfo.

        Beste Grüße
        ThommyH

        Kommentar


          #19
          Hallo ThoomyH,

          ich habe das Beispiel noch etwas überarbeitet und eine dauerhafte Verbindung eingerichtet und zusätzlich eine USB Verbindung erstellt. Wie das mit XAMPP funktioniert, weißt du wahrscheinlich, das brauche ich dir nicht zu erklären. Ich stelle alles hier ein, um es einfacher zu machen, falls jemand anderes ebenfalls Interesse hat.​

          Zitat von ThommyH Beitrag anzeigen
          Hallo Smart Guido,
          Sobald ich etwas Zeit finde..., versuche ich mich mal dran und gebe dann wieder Rückinfo.


          KNX Daemon mit COM Unterstützung unter XAMPP einrichten

          Voraussetzungen:
          • Windows 10 oder 11 (64-Bit)
          • XAMPP installiert (PHP 8.4.x CLI vorhanden)
          • KNXlib COM-Komponente installiert

          Schritt 1: PHP 8.2 NTS mit COM Unterstützung herunterladen
          Gehe auf die offizielle PHP Windows Archivseite unter https://windows.php.net/downloads/releases/archives/
          Suche die Version PHP 8.2 NTS x64, zum Beispiel php-8.2.12-nts-Win32-vs16-x64.zip, und lade die ZIP-Datei herunter.

          Schritt 2: Ordner für neue PHP Version anlegen
          Erstelle einen Ordner, zum Beispiel C:\xampp\php_com, und entpacke den Inhalt der heruntergeladenen Zip Datei in diesen Ordner.

          Schritt 3: php.ini konfigurieren
          Kopiere die Datei php.ini-development im Ordner php_com und benenne sie um in php.ini.
          Öffne die php.ini-Datei und stelle sicher, dass die Zeilen extension_dir = "ext" und extension=com_dotnet vorhanden oder hinzugefügt sind.
          Speichere die Datei.

          Schritt 4: COM Unterstützung prüfen
          Öffne CMD oder PowerShell und führe folgenden Befehl aus: C:\xampp\php_com\php.exe -m | find "com_dotnet".
          Wenn die Ausgabe com_dotnet erscheint, ist die Erweiterung korrekt aktiviert.

          Schritt 5: KNX Daemon starten
          Wechsle im Terminal in den Projektordner, zum Beispiel C:\xampp\htdocs.
          Starte den Daemon mit der neuen PHP Version: C:\xampp\php_com\php.exe knx_daemon.php.
          Die Ausgabe sollte anzeigen: [KNX] Starte Daemon... und [KNX] Verbindung hergestellt.

          Schritt 6 (Optional): Batch Datei zum bequemen Start
          Erstelle eine Batch Datei, zum Beispiel C:\xampp\start_knx_daemon.bat.
          Der Inhalt sollte folgendes erledigen: in den Projektordner wechseln, den Daemon mit der neuen PHP Version starten und das Fenster minimieren.
          Ein Doppelklick auf die Batch Datei startet den Daemon.
          Optional kann die Batch Datei in den Windows Autostart gelegt werden, damit der Daemon automatisch beim Hochfahren startet.

          Fertig!
          Der KNX Daemon läuft jetzt dauerhaft über PHP mit COM Unterstützung. Dein Frontend kann per TCP-Befehle an den Daemon senden, ohne dass die USB Verbindung jedes Mal neu aufgebaut werden muss.


          Hinweis zu Beitrag #17, Punkt 5:
          Ich habe noch zwei kleine Tools, die die Installation erleichtern, falls die Anleitung zu umständlich sein sollte:
          • RegAsmViewer - Zum Registrieren von DLL Dateien als COM Schnittstelle.
          • GACViewer - Wird nur benötigt, falls eine Fehlermeldung wegen einer fehlenden DLL erscheint, die zwar vorhanden, aber vom System nicht gefunden wird. Mit GACViewer kann diese DLL dem Global Assembly Cache hinzugefügt werden, sodass sie für den Wrapper verfügbar ist.
          RegAsmViewer : http://www.knx-board.org/download.ph...gasmviewer.zip
          GACViewer : http://www.knx-board.org/download.ph...=gacviewer.zip

          knx_daemon.php
          PHP-Code:

          <?php
          error_reporting
          (E_ALL);
          ini_set('display_errors'1);

          $address '127.0.0.1';
          $port 9000;

          echo 
          "[KNX] Starte Daemon...\n";
          $knx = new COM("KNXlib.KnxController");
          $knx->ConnectUSB();
          echo 
          "[KNX] Verbindung hergestellt.\n";

          $server stream_socket_server("tcp://$address:$port"$errno$errstr);
          if (!
          $server) {
          die(
          "Fehler beim Starten des Servers: $errstr ($errno)\n");
          }

          while (
          true) {
          $client = @stream_socket_accept($server, -1);
          if (
          $client) {
          $data trim(fgets($client));
          echo 
          "[REQ] $data\n";

          if (
          $data === "on") {
          $knx->WriteBool("1/0/0"true);
          fwrite($client"OK: Licht an\n");
          } elseif (
          $data === "off") {
          $knx->WriteBool("1/0/0"false);
          fwrite($client"OK: Licht aus\n");
          } elseif (
          $data === "temp") {
          $value $knx->ReadValue("4/1/3"91);
          fwrite($client"TEMP:$value\n");
          } else {
          fwrite($client"ERROR: Unbekannter Befehl\n");
          }

          fclose($client);
          }
          }


          index.php
          PHP-Code:
          <!DOCTYPE html>
          <
          html lang="de">
          <
          head>
          <
          meta charset="UTF-8">
          <
          title>KNX Steuerung</title>
          <
          style>
          body {
          font-familyArialsans-serif;
          background#f2f2f2;
          displayflex;
          justify-contentcenter;
          align-itemscenter;
          height100vh;
          }
          .
          container {
          backgroundwhite;
          padding30px 40px;
          border-radius15px;
          box-shadow0 0 15px rgba(0,0,0,0.1);
          text-aligncenter;
          }
          button {
          padding12px 24px;
          margin10px;
          bordernone;
          border-radius8px;
          colorwhite;
          font-size16px;
          cursorpointer;
          transition0.3s;
          }
          .
          on background#28a745; }
          .off background#dc3545; }
          .on:hover background#218838; }
          .off:hover background#c82333; }
          .status {
          margin-top20px;
          font-size18px;
          }
          </
          style>
          </
          head>
          <
          body>
          <
          div class="container">
          <
          h1>🏠 KNX Steuerung</h1>
          <
          button class="on" onclick="sendCommand('on')">Einschalten</button>
          <
          button class="off" onclick="sendCommand('off')">Ausschalten</button>
          <
          div class="status" id="status">Bereit...</div>
          <
          div class="status" id="temp">Temperatur: -- °C</div>
          </
          div>

          <
          script>
          async function sendCommand(cmd) {
          const 
          res await fetch(`knx_api.php?cmd=${cmd}`);
          const 
          data await res.json();
          document.getElementById('status').innerText data.response || data.message;
          }

          async function updateTemp() {
          const 
          res await fetch(`knx_api.php?cmd=temp`);
          const 
          data await res.json();
          if (
          data.response && data.response.startsWith("TEMP:")) {
          const 
          temp data.response.replace("TEMP:""").trim();
          document.getElementById('temp').innerText = `🌡️ Temperatur: ${temp} °C`;
          }
          }

          setInterval(updateTemp10000);
          updateTemp();
          </
          script>
          </
          body>
          </
          html


          knx_api.php
          PHP-Code:
          <?php
          header
          ('Content-Type: application/json');

          $command $_GET['cmd'] ?? '';
          $response '';

          try {
          $fp fsockopen("127.0.0.1"9000$errno$errstr2);
          if (!
          $fp) {
          throw new 
          Exception("Daemon nicht erreichbar: $errstr ($errno)");
          }

          fwrite($fp$command "\n");
          $response fgets($fp);
          fclose($fp);

          echo 
          json_encode(["status" => "ok""response" => trim($response)]);
          } catch (
          Exception $e) {
          echo 
          json_encode(["status" => "error""message" => $e->getMessage()]);
          }



          bild.png
          Angehängte Dateien
          Zuletzt geändert von Smart Guido; Heute, 22:06.
          Mit besten Grüßen,
          Guido

          Meine Projekte hier : KNX Busmonitor​​ / KNX Schalter mit Audio​ / KNX PiRadio

          Kommentar

          Lädt...
          X