Hallo, ich habe meine erste DLL in C# geschrieben, die die Falcon SDK 6 nutzt.
Diese DLL erleichtert die Nutzung des SDKs in verschiedenen Programmiersprachen und sie kann sowohl als Assembly als auch als COM Komponente verwendet werden, um sie in verschiedenen Programmiersprachen einzubinden.
Ich habe sie in den folgenden Umgebungen getestet: WinDev, Delphi, Python, Java, Kotlin, PowerShell und natürlich C#.
Zusätzlich ermöglicht sie die Verwendung auf verschiedenen Plattformen, beispielsweise als TCP Client. Auf einem Raspberry Pi oder Windows PC kann man damit einen Server erstellen, der mit anderen Geräten kommuniziert über TCP, wie einem ESP32/8266, Raspberry Pi oder Arduino.
Die DLL nutzt TCP für das Senden und Empfangen von Daten, wodurch eine einfache Vernetzung zwischen Geräten möglich ist.
Was ist möglich damit :
- Aufbau einer Verbindung mit einem USB/IP Gateway (inklusive Secure IP Verbindung)
- Integration von exportierten XML Gruppenadressen aus der ETS, sodass alle empfangenen Telegramme automatisch in die entsprechenden DPT Werte umgewandelt werden
- Senden von Telegrammen über einen TCP/IP Port, inklusive Anfragen zu verschiedenen Werten, wie z.B. Temperatur
- Suche nach verfügbaren USB/IP-Gateways im Netzwerk
- Speicherung eingehender Telegramme in einem String-Array (max. 100 Werte, die nach Bedarf Speicherung eingehender Telegramme in einem String-Array (max. 100 Werte, die nach Bedarf gelöscht und neu beschrieben werden können)
- Umwandlung von Raw DPT Werten und deren Rückumwandlung
- Kann alle Telegramme in einer SQL Datenbank speichern, einschließlich der Funktionen zum Lesen und Löschen von IDs
- Bietet mehrere Optionen zum Speichern der SQL Daten in Textdateien (nach Tag/Monat) und zur Ausgabe als Textdiagramm.
Wenn du die DLL als Assembly verwenden möchtest, kannst du sie wie in C# einfach als Verweis hinzufügen (KNXlib.dll).
Um sie als COM Schnittstelle zu nutzen, musst du sie mit regasm sowohl in 32Bit als auch in 64Bit registrieren.
Dadurch wird auch die Nutzung mit PHP (XAMPP) möglich.
Nutzung der DLL als COM Schnittstelle :
1. Kopiere den Ordner „Falcon DLL“ in den „Dokumente“ Ordner.
2. Starte die Eingabeaufforderung (CMD) als Administrator.
3. Wechsle in den Ordner C:\Windows\Microsoft.NET\Framework\v4.0.30319.
4. regasm "C:\Users\Benutzer\Documents\Falcon DLL\KNXlib.dll" /tlb:KNXlib.tlb /codebase diese Registrieren.
5. Anschließend in den Ordner C:\Windows\Microsoft.NET\Framework64\v4.0.30319
6. regasm "C:\Users\Benutzer\Documents\Falcon DLL\KNXlib.dll" /tlb:KNXlib.tlb /codebase diese Registrieren.
7. Nur bei nutzung von PHP und JavaScript: Installiere XAMPP und füge den PHP-Code in den Ordner C:\xampp\htdocs ein.
8. Sollte beim Registrieren eine Meldung erscheinen, dass der Ordnerzugriff überwacht wird, deaktiviere gegebenenfalls die Funktion „Überwachter Ordnerzugriff“.
9. Du kannst die Registrierung überprüfen in RegEdit [Windows]+R Tastenkombination und regedit eingeben.
Computer\HKEY_CLASSES_ROOT\CLSID\{E45D1244-ABCD-4E1D-8D9F-9992B7F017A2}
Computer\HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{E45D 1244-ABCD-4E1D-8D9F-9992B7F017A2}
Im Download Ordner befinden sich verschiedene Beispiele zur Nutzung der Schnittstelle in unterschiedlichen Programmiersprachen sowie eine einfache Hilfe Anleitung. Hier sind einige Beispiele:
In PHP als COM Schnittstelle (nicht alles möglich):
Hier ist ein Delphi Beispiel:
Hier ein WinDev Assemblies Beispiel:
Hier ein Python Beispiel:
Hier ein PowerShell Beispiel:
Hier ist ein kleiner Auszug aus der Liste der verfügbaren Befehle/Methoden :
ConnectUSB()
Beschreibung: Diese Methode stellt eine Verbindung zu einem KNX USB Gateway her.
Connect(Ip: System.String, Port: System.Int32, Nat: System.Boolean)
Beschreibung: Diese Methode stellt eine Verbindung zu einem KNX IP Gateway her. Der Nat Parameter gibt an, ob NAT verwendet wird.
ConnectSecure(Ip: System.String, Port: System.Int32, Nat: System.Boolean, indiaddress: System.String, filename: System.String, password: System.String)
Beschreibung: Diese Methode stellt eine gesicherte Verbindung zu einem KNXsecure IP Gateway her und zusätzlicher Authentifizierung (individuelle Adresse, Datei und Passwort) her.
Disconnect()
Beschreibung: Diese Methode trennt die Verbindung zu einem KNX USB/IP Gateway.
LoadDptList(filename: System.String)
Beschreibung: Diese Methode lädt eine exportierte XML ETS Gruppenadressenliste aus einer angegebenen Datei.
CreateSqlDatabase(Filename: System.String)
Beschreibung: Diese Methode erstellt eine SQLite Datenbank mit dem angegebenen Dateinamen.
SaveDataToSql(Filename: System.String, i: System.Int32)
Beschreibung: Diese Methode speichert Daten in einer SQLite Datenbank aus dem index i.
GetDataById(Filename: System.String, id: System.Int32)
Beschreibung: Diese Methode ruft Daten aus einer SQLite Datenbank basierend auf einer ID ab.
DeleteDataById(Filename: System.String, id: System.Int32)
Beschreibung: Diese Methode löscht Daten aus einer SQLite Datenbank basierend auf einer ID.
ExportDataToTextFile(SqlFileName: System.String, CreateFileName: System.String)
Beschreibung: Diese Methode exportiert alle Daten aus einer SQLite Datenbank in eine Textdatei.
ExportDataByDayAndGAddressToTextDiagramFile(SqlFil eName: System.String, createFileName: System.String, selectedDate: System.String, selectedGAddress: System.String, faktor: System.Double)
Beschreibung: Diese Methode exportiert Daten aus einer SQLite Datenbank für einen bestimmten Tag und eine bestimmte Gruppenadresse in eine Textdatei und formatiert die Daten als Diagramm.
ExportDataByMonthAndGAddressToTextDiagramFile(SqlF ileName: System.String, createFileName: System.String, selectedDate: System.String, selectedGAddress: System.String, faktor: System.Double)
Beschreibung: Diese Methode exportiert Daten aus einer SQLite Datenbank für einen bestimmten Monat und eine bestimmte Gruppenadresse in eine Textdatei und formatiert die Daten als Diagramm.
WriteValueToDPT(groupAddress: System.String, value: System.String, dpt1: System.Int32, dpt2: System.Int32)
Beschreibung: Diese Methode schreibt einen Wert an eine Gruppenadresse im bestimmten DPT Type.
WriteDate(groupaddress: System.String)
Beschreibung: Diese Methode schreibt das aktuelle Datum an eine Gruppenadresse.
WriteTimeAsText(groupaddress: System.String)
Beschreibung: Diese Methode schreibt die aktuelle Uhrzeit als Text an eine Gruppenadresse.
WriteTime(groupaddress: System.String)
Beschreibung: Diese Methode schreibt die aktuelle Uhrzeit an eine Gruppenadresse.
ReadValueAsync(groupAddress: System.String)
Beschreibung: Diese Methode liest einen Wert asynchron von einer Gruppenadresse.
ReadValue(groupAddress: System.String, dpt1: System.Int32, dpt2: System.Int32)
Beschreibung: Diese Methode liest einen Wert von einer Gruppenadresse unter Verwendung der DPT Wert und gibt den DPT Wert zurück.
ConvertToRaw(value: System.String, dpt1: System.Int32, dpt2: System.Int32)
Beschreibung: Diese Methode konvertiert einen Wert in das Rohformat basierend auf den DPT Wert.
ConvertToDPT(value: System.String, dpt1: System.Int32, dpt2: System.Int32)
Beschreibung: Diese Methode konvertiert einen Wert in das DPT Format basierend auf den Raw Wert.
Dies ist nur eine einfache Übersicht, die zeigt, wie die Schnittstelle genutzt werden kann.
Zusätzlich habe ich ein Beispiel für Android MAUI beigefügt, das demonstriert, wie Server (der KNX BusMonitor, der ebenfalls hier zum Download zur Verfügung steht, kann ebenfalls als Server verwendet werden) und Client über TCP kommunizieren und welche Möglichkeiten sich daraus ergeben.
Im Ordner ‚WinDev 28 .Net Assemblies - KNX Connection\Exe‘ befindet sich eine ausführbare Datei, die automatisch startet. Es handelt sich um ein WinDev Beispiel, das einige der möglichen Funktionen demonstriert.
Downloadlink (Dateigröße: ca. 320 MB aufgrund der enthaltenen Beispiele) :
https://www.knx-board.org/download.php?file=KNXdll.zip
Downloadlink (Dateigröße: ca. 40 MB nur die Dll und ein Beispiel) :
https://www.knx-board.org/download.p...=KNXdll-lv.zip
Diese DLL erleichtert die Nutzung des SDKs in verschiedenen Programmiersprachen und sie kann sowohl als Assembly als auch als COM Komponente verwendet werden, um sie in verschiedenen Programmiersprachen einzubinden.
Ich habe sie in den folgenden Umgebungen getestet: WinDev, Delphi, Python, Java, Kotlin, PowerShell und natürlich C#.
Zusätzlich ermöglicht sie die Verwendung auf verschiedenen Plattformen, beispielsweise als TCP Client. Auf einem Raspberry Pi oder Windows PC kann man damit einen Server erstellen, der mit anderen Geräten kommuniziert über TCP, wie einem ESP32/8266, Raspberry Pi oder Arduino.
Die DLL nutzt TCP für das Senden und Empfangen von Daten, wodurch eine einfache Vernetzung zwischen Geräten möglich ist.
Was ist möglich damit :
- Aufbau einer Verbindung mit einem USB/IP Gateway (inklusive Secure IP Verbindung)
- Integration von exportierten XML Gruppenadressen aus der ETS, sodass alle empfangenen Telegramme automatisch in die entsprechenden DPT Werte umgewandelt werden
- Senden von Telegrammen über einen TCP/IP Port, inklusive Anfragen zu verschiedenen Werten, wie z.B. Temperatur
- Suche nach verfügbaren USB/IP-Gateways im Netzwerk
- Speicherung eingehender Telegramme in einem String-Array (max. 100 Werte, die nach Bedarf Speicherung eingehender Telegramme in einem String-Array (max. 100 Werte, die nach Bedarf gelöscht und neu beschrieben werden können)
- Umwandlung von Raw DPT Werten und deren Rückumwandlung
- Kann alle Telegramme in einer SQL Datenbank speichern, einschließlich der Funktionen zum Lesen und Löschen von IDs
- Bietet mehrere Optionen zum Speichern der SQL Daten in Textdateien (nach Tag/Monat) und zur Ausgabe als Textdiagramm.
Wenn du die DLL als Assembly verwenden möchtest, kannst du sie wie in C# einfach als Verweis hinzufügen (KNXlib.dll).
Um sie als COM Schnittstelle zu nutzen, musst du sie mit regasm sowohl in 32Bit als auch in 64Bit registrieren.
Dadurch wird auch die Nutzung mit PHP (XAMPP) möglich.
Nutzung der DLL als COM Schnittstelle :
1. Kopiere den Ordner „Falcon DLL“ in den „Dokumente“ Ordner.
2. Starte die Eingabeaufforderung (CMD) als Administrator.
3. Wechsle in den Ordner C:\Windows\Microsoft.NET\Framework\v4.0.30319.
4. regasm "C:\Users\Benutzer\Documents\Falcon DLL\KNXlib.dll" /tlb:KNXlib.tlb /codebase diese Registrieren.
5. Anschließend in den Ordner C:\Windows\Microsoft.NET\Framework64\v4.0.30319
6. regasm "C:\Users\Benutzer\Documents\Falcon DLL\KNXlib.dll" /tlb:KNXlib.tlb /codebase diese Registrieren.
7. Nur bei nutzung von PHP und JavaScript: Installiere XAMPP und füge den PHP-Code in den Ordner C:\xampp\htdocs ein.
8. Sollte beim Registrieren eine Meldung erscheinen, dass der Ordnerzugriff überwacht wird, deaktiviere gegebenenfalls die Funktion „Überwachter Ordnerzugriff“.
9. Du kannst die Registrierung überprüfen in RegEdit [Windows]+R Tastenkombination und regedit eingeben.
Computer\HKEY_CLASSES_ROOT\CLSID\{E45D1244-ABCD-4E1D-8D9F-9992B7F017A2}
Computer\HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{E45D 1244-ABCD-4E1D-8D9F-9992B7F017A2}
Im Download Ordner befinden sich verschiedene Beispiele zur Nutzung der Schnittstelle in unterschiedlichen Programmiersprachen sowie eine einfache Hilfe Anleitung. Hier sind einige Beispiele:
In PHP als COM Schnittstelle (nicht alles möglich):
Code:
<?php error_reporting(E_ALL); ini_set('display_errors', 1); try { $knxController = new COM("KNXlib.KnxController"); $knxController->Connect("192.168.178.42", 3671, false); echo "Verbindung hergestellt !<br><br>"; $knxController->WriteBool("1/0/0", true); $value = $knxController->ReadValue("4/1/3", 9, 1); echo "Gelesene Temperatur: " . $value . " <br>"; $knxController->Disconnect(); } catch (Exception $e) { echo "Fehler : " . $e->getMessage(); } ?>
Hier ist ein Delphi Beispiel:
Code:
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,ActiveX, ComObj, System.Actions, Vcl.ActnList, Vcl.ExtCtrls; var MyKNXDotNet: OleVariant; Result: OleVariant; var x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, combinedText: string; var i: Word; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private ListBox1: TListBox; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin MyKNXDotNet.WriteBool('1/0/0', true); end; procedure TForm1.Button2Click(Sender: TObject); begin MyKNXDotNet.WriteBool('1/0/0', false); end; procedure TForm1.Button3Click(Sender: TObject); begin MyKNXDotNet.WriteValueToDPT('6/0/9', '10', 5, 1) end; procedure TForm1.Button4Click(Sender: TObject); begin MyKNXDotNet.WriteValueToDPT('6/0/9', '0', 5, 1) end; procedure TForm1.FormCreate(Sender: TObject); begin MyKNXDotNet := CreateOleObject('KNXlib.KnxController'); MyKNXDotNet.Connect('192.168.178.42', 3671, false); ListBox1 := TListBox.Create(Self); ListBox1.Parent := Self; ListBox1.Left := 25; ListBox1.Top := 175; ListBox1.Width := 1200; ListBox1.Height := 300; end; procedure TForm1.Timer1Timer(Sender: TObject); var combinedText: string; begin label3.Caption := 'Received telegrams : ' + IntToStr(ri); x1 := MyKNXDotNet.GetReceiveDataValueAt(i, 'date'); x2 := MyKNXDotNet.GetReceiveDataValueAt(i, 'time'); x3 := MyKNXDotNet.GetReceiveDataValueAt(i, 'paddress'); x4 := MyKNXDotNet.GetReceiveDataValueAt(i, 'gaddress'); x5 := MyKNXDotNet.GetReceiveDataValueAt(i, 'prio'); x6 := MyKNXDotNet.GetReceiveDataValueAt(i, 'issecure'); x7 := MyKNXDotNet.GetReceiveDataValueAt(i, 'hopcount'); x8 := MyKNXDotNet.GetReceiveDataValueAt(i, 'eventtype'); x9 := MyKNXDotNet.GetReceiveDataValueAt(i, 'svalue'); x10 := MyKNXDotNet.GetReceiveDataValueAt(i, 'dptvalue'); x11 := MyKNXDotNet.GetReceiveDataValueAt(i, 'dpttype'); x12 := MyKNXDotNet.GetReceiveDataValueAt(i, 'info'); if Pos('Index out of range', x1) = 0 then begin combinedText := Format('Date: %s, Time: %s, PAddress: %s, GAddress: %s, ' + 'Prio: %s, IsSecure: %s, HopCount: %s, EventType: %s, Value: %s ' + 'DptType: %s, DptValue: %s, DptInfo: %s', [x1, x2, x3, x4, x5, x6, x7, x8, x9, x11, x10, x12]); if ListBox1.Items.IndexOf(combinedText) = -1 then begin ListBox1.Items.Add(combinedText); ListBox1.ItemIndex := ListBox1.Items.Count - 1; ListBox1.SetFocus; i := i + 1; ri := ri + 1; end; end; if i = 100 then begin i := 0; MyKNXDotNet.GetReceiveDataClear; end; end; end.
Hier ein WinDev Assemblies Beispiel:
Code:
knxCon is KNXlib.KnxController knxCon <- new KNXlib.KnxController() knxCon.Connect(“192.168.178.42”, 3671, False) knxCon.WriteValueToDPT(“11/7/4”, “20.5”, 9, 1) value is string = knxCon.ReadValueAsync(“11/7/4”)
Hier ein Python Beispiel:
Code:
clr.AddReference(r’C:\Users\aa\Documents\Falcon DLL\KNXlib.dll’) from KNXlib import KnxController knxcontroller = KnxController() knxcontroller.LoadDptList(“knxxml.xml”) constatus = knxcontroller.Connect(“192.168.178.42”, 3671, False) knxcontroller.WriteValueToDPT(‘6/0/9’, ‘0’, 5, 1)
Hier ein PowerShell Beispiel:
Code:
Add-Type -Path “KnxLib.dll” $controller = New-Object KNXlib.KnxController $result = $controller.Connect(“192.168.178.42”, 3671, $false) $controller.WriteBool(“1/0/0”, $true)
Hier ist ein kleiner Auszug aus der Liste der verfügbaren Befehle/Methoden :
ConnectUSB()
Beschreibung: Diese Methode stellt eine Verbindung zu einem KNX USB Gateway her.
Connect(Ip: System.String, Port: System.Int32, Nat: System.Boolean)
Beschreibung: Diese Methode stellt eine Verbindung zu einem KNX IP Gateway her. Der Nat Parameter gibt an, ob NAT verwendet wird.
ConnectSecure(Ip: System.String, Port: System.Int32, Nat: System.Boolean, indiaddress: System.String, filename: System.String, password: System.String)
Beschreibung: Diese Methode stellt eine gesicherte Verbindung zu einem KNXsecure IP Gateway her und zusätzlicher Authentifizierung (individuelle Adresse, Datei und Passwort) her.
Disconnect()
Beschreibung: Diese Methode trennt die Verbindung zu einem KNX USB/IP Gateway.
LoadDptList(filename: System.String)
Beschreibung: Diese Methode lädt eine exportierte XML ETS Gruppenadressenliste aus einer angegebenen Datei.
CreateSqlDatabase(Filename: System.String)
Beschreibung: Diese Methode erstellt eine SQLite Datenbank mit dem angegebenen Dateinamen.
SaveDataToSql(Filename: System.String, i: System.Int32)
Beschreibung: Diese Methode speichert Daten in einer SQLite Datenbank aus dem index i.
GetDataById(Filename: System.String, id: System.Int32)
Beschreibung: Diese Methode ruft Daten aus einer SQLite Datenbank basierend auf einer ID ab.
DeleteDataById(Filename: System.String, id: System.Int32)
Beschreibung: Diese Methode löscht Daten aus einer SQLite Datenbank basierend auf einer ID.
ExportDataToTextFile(SqlFileName: System.String, CreateFileName: System.String)
Beschreibung: Diese Methode exportiert alle Daten aus einer SQLite Datenbank in eine Textdatei.
ExportDataByDayAndGAddressToTextDiagramFile(SqlFil eName: System.String, createFileName: System.String, selectedDate: System.String, selectedGAddress: System.String, faktor: System.Double)
Beschreibung: Diese Methode exportiert Daten aus einer SQLite Datenbank für einen bestimmten Tag und eine bestimmte Gruppenadresse in eine Textdatei und formatiert die Daten als Diagramm.
ExportDataByMonthAndGAddressToTextDiagramFile(SqlF ileName: System.String, createFileName: System.String, selectedDate: System.String, selectedGAddress: System.String, faktor: System.Double)
Beschreibung: Diese Methode exportiert Daten aus einer SQLite Datenbank für einen bestimmten Monat und eine bestimmte Gruppenadresse in eine Textdatei und formatiert die Daten als Diagramm.
WriteValueToDPT(groupAddress: System.String, value: System.String, dpt1: System.Int32, dpt2: System.Int32)
Beschreibung: Diese Methode schreibt einen Wert an eine Gruppenadresse im bestimmten DPT Type.
WriteDate(groupaddress: System.String)
Beschreibung: Diese Methode schreibt das aktuelle Datum an eine Gruppenadresse.
WriteTimeAsText(groupaddress: System.String)
Beschreibung: Diese Methode schreibt die aktuelle Uhrzeit als Text an eine Gruppenadresse.
WriteTime(groupaddress: System.String)
Beschreibung: Diese Methode schreibt die aktuelle Uhrzeit an eine Gruppenadresse.
ReadValueAsync(groupAddress: System.String)
Beschreibung: Diese Methode liest einen Wert asynchron von einer Gruppenadresse.
ReadValue(groupAddress: System.String, dpt1: System.Int32, dpt2: System.Int32)
Beschreibung: Diese Methode liest einen Wert von einer Gruppenadresse unter Verwendung der DPT Wert und gibt den DPT Wert zurück.
ConvertToRaw(value: System.String, dpt1: System.Int32, dpt2: System.Int32)
Beschreibung: Diese Methode konvertiert einen Wert in das Rohformat basierend auf den DPT Wert.
ConvertToDPT(value: System.String, dpt1: System.Int32, dpt2: System.Int32)
Beschreibung: Diese Methode konvertiert einen Wert in das DPT Format basierend auf den Raw Wert.
Dies ist nur eine einfache Übersicht, die zeigt, wie die Schnittstelle genutzt werden kann.
Zusätzlich habe ich ein Beispiel für Android MAUI beigefügt, das demonstriert, wie Server (der KNX BusMonitor, der ebenfalls hier zum Download zur Verfügung steht, kann ebenfalls als Server verwendet werden) und Client über TCP kommunizieren und welche Möglichkeiten sich daraus ergeben.
Im Ordner ‚WinDev 28 .Net Assemblies - KNX Connection\Exe‘ befindet sich eine ausführbare Datei, die automatisch startet. Es handelt sich um ein WinDev Beispiel, das einige der möglichen Funktionen demonstriert.
Downloadlink (Dateigröße: ca. 320 MB aufgrund der enthaltenen Beispiele) :
https://www.knx-board.org/download.php?file=KNXdll.zip
Downloadlink (Dateigröße: ca. 40 MB nur die Dll und ein Beispiel) :
https://www.knx-board.org/download.p...=KNXdll-lv.zip
Kommentar