This page is also available in the other languages: English Deutsch

KNX-Bus

Mit dem "hkknx" Package hast du Zugriff auf den KNX-Bus.

Für die Kommunikation mit dem KNX-Bus gibt es das “hkknx” Package. Dieses Package stellt Funktionen zur Verfügung um Daten an Gruppenadressen zu senden und auszulesen.

Wie man das “hkknx” Package verwendet, erfährst du anhand der folgenden Beispiele. 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.

Telegram 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. Damit kann das Bit 1 an die Gruppenadressen 0/0/1, 0/0/2 und 0/0/3 gesendet werden.

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. Ganz- und Gleitkommazahlen müssen vor dem Senden in Bytes kodiert werden. Die Umrechnung eines Wertes in Bytes hängt von dem KNX-Datentyp ab. Das hkknx-Package enthält Funktionen, die für die Umrechnung verwendet werden können.

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 hat, ist es wichtig, den richtigen Datentyp zu verwenden. Ansonsten kann es zu Ungenauigkeiten kommen und in weiterer Folge zu unerwarteten Fehlern. 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 dir die offizielle Dokumentation der KNX Datentypen.

Gruppenadresse auslesen

Mit der Funktion GroupRead wird der Wert aus einer Gruppenadresse ausgelesen. Diese Funktion liefert die empfangenen Bytes oder 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 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}

Lese-Telegram empfangen

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é