Zugriff auf KNX-Bus

Die HomeKit Brücke für KNX stellt eine große Anzahl von Packages zur Verfügung. Ein Package beinhaltet Funktionen und Typen, die von einem Skript verwendet werden können. Die Liste aller verfügbaren Packages findest du hier.

Für die Kommunikation mit dem KNX-Bus gibt es das hkknx-Package. Dieses Package stellt Funktionen zur Verfügung um Werte an eine Gruppenadresse zu senden, lesen und auf Leseanforderungen zu antworten.

Wie man das hkknx-Package verwendet, erfährst du in den folgenden Beispielen. Du kannst diese Beispiele selbst ausprobieren, indem du den Code kopierst und über die Weboberfläche in ein neues Skript einfügst. Dann klicke auf Ausführen um das Skript auszuführen.

Wert an eine Gruppenadresse senden

Im folgenden Beispiel wird 1 Bit an die Gruppenadresse 0/0/1 mit der Funktion GroupWrite gesendet.

1// Import the hkknx package.
2var hkknx = import("hkknx")
3
4// Write a bool value *true* to 0/0/1. 
5// Behind the scenes the value is converted to the bit *1*.
6var err = hkknx.GroupWrite(true, "0/0/1")
7if err != nil {
8    println(err)
9}

Mit der Funktion GroupWrite können Daten nicht nur an eine sondern auch an mehrere Gruppenadressen gesendet werden. Dazu werden die Gruppenadresse mit einem Beistrich getrennt angeführt. Somit wird das Bit 1 an die Gruppenadressen 0/0/1, 0/0/2 und 0/0/3 gesendet.

1var hkknx = import("hkknx")
2
3// Write a bool value *true* to 0/0/1, 0/0/2, 0/0/3.
4var err = hkknx.GroupWrite(true, "0/0/1", "0/0/2", "0/0/3")
5if err != nil {
6    println(err)
7}

In den bisherigen Beispielen wurde immer nur ein Bit (also 0 oder 1) versendet. Wenn Ganz- oder Gleitkommazahlen versendet werden sollen, dann müssen diese vorher in Bytes kodiert werden. Die Umrechnung eines Wertes in Bytes wird je nach KNX-Datentyp unterschiedlich gemacht. Dafür gibt es im hkknx-Package Funktionen, die das erledigen.

Zum Beispiel um den Wert 50% als Datentyp 5.004 (DPST-5-4) an den KNX Bus zu senden, wird die Funktion DPT5004 verwendet.

1var hkknx = import("hkknx")
2
3// Send 50%
4hkknx.GroupWrite(hkknx.DPT5004(50), "0/0/2")

Da jeder Datentyp eine unterschiedliche Kodierung vornimmt, ist es wichtig, den richtigen Datentyp zu verwenden. Ansonsten kann es zur Ungenauigkeiten beim Versenden von Werten kommen. Zum Beispiel ist es mit dem Datentyp 5.001 nicht möglich den Wert 21% zu senden. Mit dem Datentyp 5.004 jedoch schon.

1var hkknx = import("hkknx")
2
3// DPT 5.001 has a resolution of 0.4%.
4// Therefore a value of 21% cannot be represented.
5println(hkknx.DPT5001(21)) // "20,8 %"
6
7// DPT 5.004 has a resolution of 1%.
8println(hkknx.DPT5004(21)) // "21 %"

Bei Unklarheiten hilft einem die offizielle Dokumentation der KNX Datentypen.

Wert von einer Gruppenadresse auslesen

Mit der Funktion GroupRead wird der Wert aus einer Gruppenadresse ausgelesen. Diese Funktion liefert die empfangenen Bytes und einen Fehler, falls das Auslesen nicht erfolgreich war.

1var hkknx = import("hkknx")
2
3// Read the value from 0/1/1.
4var buf, err = hkknx.GroupRead("0/1/1")
5if err != nil {
6    println(err)
7} else {
8    println(buf)
9}

Je nach Datentyp stellen die empfangene Bytes einen unterschiedlichen Wert da. Verwende dafür die Parse...([]byte) Funktionen vom hkknx-Package.

1var hkknx = import("hkknx")
2
3buf = []byte{0xFF}
4println(hkknx.ParseDPT5001(buf)) // 100
5println(hkknx.ParseDPT5003(buf)) // 360
6println(hkknx.ParseDPT5004(buf)) // 255

Falls ein boolescher-Wert ausgelesen wird, dann kann man sich die Funktion GroupReadBool verwenden. Diese Funktion wandelt das empfangene Bit direkt in einen booleschen Wert um.

1var hkknx = import("hkknx")
2
3// Read a bool value from 0/1/1.
4var val, err = hkknx.GroupReadBool("0/1/1")
5if err != nil {
6    println(err)
7} else {
8    println(val) // "true" or "false"
9}

Auf Leseanforderung antworten

Ein Skript kann auch Lese-Telegramme empfangen und darauf mit einem Antwort-Telegramm antworten. Dafür wird die Funktion GroupReadNotify verwendet. Diese Funktion liefert einen Channel, welcher eingehende Lese-Telegramme liefert.

Im folgenden Beispiel wird in einer Schleife auf ein Lese-Telegramm für die Gruppenadresse 0/1/1 gewartet. Dann wird mit 1 Bit geantwortet.

 1var hkknx = import("hkknx")
 2
 3// Declare a channel which delivers group read telegrams.
 4var ch = hkknx.GroupReadNotify("0/1/1")
 5
 6for {
 7    // Wait for read telegram to arrive.
 8    <-ch
 9    // Respond with the value *true*.
10    hkknx.GroupResponse(true, "0/1/1")
11}

Neben der Kommunikation mit dem KNX-Bus, stellt das hkknx-Package noch weitere Funktionen zur Verfügung. Die Dokumentation aller Funktionen ist hier.



© Matthias Hochgatterer – MastodonGithubRésumé