EIB/KNX - Busankoppler Problem mit serieller Schnittstelle

Hallo liebes Forum,

ich versuche momentan unser EIB Haussystem mittels Arduino zu steuren und habe mir dafür einen Busankoppler zugelegt, welcher den Bus auf eine serielle Schnittstelle übersetzten soll. Wie hier beschrieben wollte ich zuerst einen Busmonitor programmieren um zu schauen ob das ganze überhaupt funktioniert: https://www.knixuino.com/tutorial_2_direct_com.php Sobald ich einen Schalter im Haus drücke erscheint allerdings auf dem seriellen Monitor nur ein Paket aus umgedrehten Fragezeichen "⸮⸮⸮⸮⸮⸮⸮⸮" anstatt der Adresse des Schalters. Ich benutze den Siemens BCU und hier mal noch mein Code:

int inByte;

void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);
  Serial.println("los");
  // Serial1.println("dts 7");
}

void loop() {
  if (Serial1.available()) {
    inByte = Serial1.read();
    Serial.write(inByte); 
  }
  
  if (Serial.available()) {
    inByte = Serial.read();
    Serial1.write(inByte); 
  }
  
}

Vielen Dank im Vorraus!

Ohne die Doku der BCU jetzt gelesen zu haben, tippe ich auf die falsche Baudrate.

das war auch meine erste idee nur leider finde ich kein Datasheet von dem Chip, also habe ich alle gängigen Baudraten ausprobiert, allerdings ohne Erfolg...

Hallo TE2,

leider bringst du da etwas durcheinander.

Für KNiXuino benötigst du das SIM-KNX, nicht die Siemens BCU.

Siemens BCU = TP-UART oder TP-UART2

KniXuino = SIM-KNX (Mikroprozessor mit eigenem KNX-Kommunikationsstack, inkl. TP-UART)

Zur Verwendung der Siemens BCU kannst du folgende Quellen nachschlagen:

http://liwan.fr/KnxWithArduino/

oder

https://knx-user-forum.de/forum/öffentlicher-bereich/knx-eib-forum/diy-do-it-yourself/33016-arduino-am-knx

Datenblätter zur Siemens BCU (TP-UART) findest du unter:

http://www.opternus.com/de/siemens/knx-chipset/knx-transceiver-ics-tp-uart-fze1066.html

Hast du das Tutorial auf der Seite auch beachtet, vor allem den Absatz:

"Dann konfigurieren wir unseren KNiXuino gleich noch. Gibt dazu dts 7 ein und drücke Enter. Es kommt keine sichtbare Reaktion, aber der KNiXUino ist jetzt auf Transparent Mode umgeschalten, so dass alle Bus Telegramme weitergeleitet werden."

Den Arduino Mega auch richtig mit der SIM-KNX verbunden?

Dann sollte diese Kombination wie angegeben funktionieren.

Hallo MC_HAMMER,

vielen Dank für die umfangreiche Antwort, ja ich habe es nach weiterer Recherche auch gemerkt ,dass das SIM-KNX eine andere Funktionsweise wie die Siemens BCU (welche ich habe) hat.

Die im KNX-user-forum hingewiesene Library zur Arduino/KNX-Schnittstelle ist anscheinend schon etwas älter und verursacht Kompilierungsfehler, welche ich leider nicht in der Lage bin zu fixen.

Unter dem ersten Link habe ich folgende Library gefunden welche auch ganz gut zu funktioniert scheint: GitHub - franckmarini/KnxDevice: Allow to turn your Arduino into a self-made KNX device using the hardware TPUART interface
allerdings bin ich hierbei noch etwas von der Programmieranleitung erschlagen. Ich versuche zunächst einen BUS-Monitor zu schreiben um die Adressen der verbauten Relais herauszufinden.

Hallo TE2,

die Sache ist einleseoffensiv.

Einen sehr einfachen Busmonitor für KNX/EIB auf Basis des TP-UART gibt es schon.
Zugegeben der Monsterthread im KNX-User-Forum ist sehr unübersichtlich, darin verborgen steckt aber der einfache Busmonitor. Ganz ohne Library.

Sketch für Busmonitor:

//KNX BUSMONITOR

#ifdef __AVR_ATmega32U4__ //Universal Flush Interface, ProMicro, Leonardo

#define DEBUGSERIAL Serial      //USB
#define KNX_SERIAL Serial1      //D0,D1
//#define LED_PIN 13              //UFI STD, Aruino Leonardo
//#define LED_PIN 8               //UFI PWM
#define LED_PIN LED_BUILTIN_RX  //ProMicro (Attention: LOW = ON, HIGH = OFF)

#elif __AVR_ATmega2560__        //Interface, Arduino Mega

#define DEBUGSERIAL Serial      //D0,D1
#define KNX_SERIAL Serial1      //D18,D19
#define LED_PIN LED_BUILTIN     //Arduino Mega

#elif __SAMD21G18A__            //Multi Interface, Arduino Zero

#define DEBUGSERIAL SerialUSB   //USB
//#define KNX_SERIAL Serial       //Multi Interface
#define KNX_SERIAL Serial1      //D0,D1
//#define LED_PIN A5              //Multi Interface
#define LED_PIN LED_BUILTIN     //Arduino Zero

#endif


#define KNX_TELEGRAM_MAX_SIZE 23


long lastMicros = 0;
bool dataReceived = false;
byte telegram[KNX_TELEGRAM_MAX_SIZE];
byte counter = 0;

void setup() {
 KNX_SERIAL.begin(19200, SERIAL_8E1);
 DEBUGSERIAL.begin(115200);
 pinMode(LED_PIN, OUTPUT);
 clearBuffer();
}

void loop() {
 if (KNX_SERIAL.available() > 0) {
   lastMicros = (long)micros();
   byte temp = KNX_SERIAL.read();
   //        if(temp<16) DEBUGSERIAL.print("0"); //print 0 for 2 digit HEX
   //        DEBUGSERIAL.print(temp,HEX);
   //        DEBUGSERIAL.print(" ");
   telegram[counter] = temp;
   counter++;
   if (!dataReceived) {
     dataReceived = true;
     digitalWrite(LED_PIN, HIGH); //LED is ON is data is received
   }
 }
 if ((long)micros() - lastMicros >= 2000 && dataReceived) {
   //2000+ µs => end of telegram => new line
   //        DEBUGSERIAL.println("");
   dataReceived = false;
   //print usable array data
   for (byte i = 0; i < counter; i++) {
     if (telegram[i] < 16) DEBUGSERIAL.print("0"); //print 0 for 2 digit HEX
     DEBUGSERIAL.print(telegram[i], HEX);
     DEBUGSERIAL.print(" ");
   }
   DEBUGSERIAL.println("");
   printData();
   counter = 0;
   clearBuffer();
   digitalWrite(LED_PIN, LOW); //turn LED off

 }
}

void clearBuffer() {
 memset(telegram, 0, sizeof(telegram));
}

void printData() {
 byte temp = telegram[1];
 byte pa1 = telegram[1] >> 4;
 byte pa2 = telegram[1] & B00001111;
 byte ga1 = telegram[3] >> 3;
 byte ga2 = telegram[3] & B00000111;
 byte datalength = telegram[5] & B00001111;
 byte firstDateByte = telegram[7] & B00111111; //use only last 6 bits
 DEBUGSERIAL.print("PA: ");
 DEBUGSERIAL.print(pa1, DEC);
 DEBUGSERIAL.print(".");
 DEBUGSERIAL.print(pa2, DEC);
 DEBUGSERIAL.print(".");
 DEBUGSERIAL.print(telegram[2], DEC);
 DEBUGSERIAL.print(" GA: ");
 DEBUGSERIAL.print(ga1, DEC);
 DEBUGSERIAL.print("/");
 DEBUGSERIAL.print(ga2, DEC);
 DEBUGSERIAL.print("/");
 DEBUGSERIAL.print(telegram[4], DEC);
 DEBUGSERIAL.print(" Data length (bytes): ");
 if (datalength == 1) {
   DEBUGSERIAL.print(datalength, DEC); //if 1 then usable data max 6 bits, DPT 1.xxx, DPT 2.xxx, DPT 3.xxx, DPT 23.xxx ...
 } else {
   DEBUGSERIAL.print(datalength - 1, DEC); //ignore first byte because data doesn't fit in 6 bits
 }
 DEBUGSERIAL.print(" Data (HEX): ");
 if (datalength == 1) {
   if (firstDateByte < 16) DEBUGSERIAL.print("0"); //print 0 for 2 digit HEX
   DEBUGSERIAL.print(firstDateByte, HEX);
   DEBUGSERIAL.print(" ");
 }
 for (byte i = 1; i < datalength; i++) {
   if (telegram[7 + i] < 16) DEBUGSERIAL.print("0"); //print 0 for 2 digit HEX
   DEBUGSERIAL.print(telegram[7 + i], HEX);
   DEBUGSERIAL.print(" ");
 }

 DEBUGSERIAL.println();
}

Ausgabe sieht so aus:

BC 11 DD 3F 02 E3 00 81 14 FD 39
PA: 1.1.221 GA: 7/7/2 Data length (bytes): 2 Data (HEX): 14 FD
BC 11 FC 2F FE E1 00 81 1F
PA: 1.1.252 GA: 5/7/254 Data length (bytes): 1 Data (HEX): 01

Brauchst das Rad nicht ganz neu erfinden. :wink:

super vielen Dank!! habe den Busmonitor gerade ausprobiert und folgende Ausgabe bekommen:

//schalter gedrückt -> Licht an
BF FD FD EF EF 
PA: 15.13.253 GA: 29/7/239 Data length (bytes): -1 Data (HEX): 
DF 
PA: 0.0.0 GA: 0/0/0 Data length (bytes): -1 Data (HEX):

//schalter 2. gedrückt -> Licht aus
BF FD DF EF 
PA: 15.13.223 GA: 29/7/0 Data length (bytes): -1 Data (HEX): 
BF 
PA: 0.0.0 GA: 0/0/0 Data length (bytes): -1 Data (HEX): 

//schalter 3. gedrückt -> Licht erneut an
EF EF 
PA: 14.15.0 GA: 0/0/0 Data length (bytes): -1 Data (HEX): 
DF 
PA: 0.0.0 GA: 0/0/0 Data length (bytes): -1 Data (HEX): 
BF EF FD EF 
PA: 14.15.253 GA: 29/7/0 Data length (bytes): -1 Data (HEX):

allerdings kann ich diese Daten noch nicht wirklich interpretieren, gibt es dafür irgendwo eine Anleitung in der man dies nachlesen könnte ?

sry für die späte Antwort hatte in den letzen zwei Woche leider keine Zeit mehr gefunden

Hallo TE2,

BC 11 DD 3F 02 E3 00 81 14 FD 39

Sind die Rohdaten (Komplettes EIB/KNX-Telegramm)

PA: 1.1.221 GA: 7/7/2 Data length (bytes): 2 Data (HEX): 14 FD

PA = Physikalische Adresse (1.1.221 = Bereich 1 . Linie 1 . Teilnehmer 221)

GA = Gruppenadresse (7/7/2 = Hauptgruppe 7 / Mittelgruppe 7 / Untergruppe 2)

Data length (bytes): 2 Data (Nutzdaten mit 2 Byte Länge)

(HEX): 14 FD (Nutzdaten in Rohform, hexadezimale Darstellung)

Bei deinen Telegrammmitschnitten scheint es so als würde dein "Schalter" einen 4Bit-Befehl an einen Dimmer schicken (Kurzer/Langer Tastendruck)

Solltes dir mal die Grundlagen der DPT´s anschauen, damit du verstehst was dein Schalter als Nutzinformation auf der Gruppenadresse gesendet hat.

Grundlagen KNX/EIB als Basis zur Interpretation/Verständnis der Daten im diesem sehr einfachen Busmonitor notwendig. Google sollte auf Nachfrage da diverse Lektüren zu Tage fördern.

Ich hoffe alle Klarheiten beseitigt zu haben. 8)

Toller Beitrag. ;)

Gruß Tommy

Danke Tommy,

Gruß MC_HAMMER :wink:

MC_HAMMER: Danke Tommy,

Gruß MC_HAMMER :wink:

Zu dem Zeitpunkt war nur:

Hallo TE2

zu sehen. Dazu hat meine Antwort gepasst. Dass Du weit hinterher editierst, ist nicht mein Problem.

Hier die Zeiten: Today at 08:53 pm das leere Posting Today at 08:58 pm meine Antwort Today at 09:24 etwas sehr spät Dein Edit.

Man sollte sein Posting vor und nach dem Abschicken prüfen.

Gruß Tommy

Hallo Tommy 56,

zu dem wie du meine Nachricht interpretierst kann ich nichts.

Ja, ich habe nachträglich den Fehler entsprechend geändert. Ich habe mich bei dir für den Hinweis bedankt.

Gruß MC_HAMMER

Danke für den Busmonitor, funktioniert einwandfrei.

Gibt es ein ähnliches simples Beispiel um ein KNX Telegram (liegt als 8 Byte Hex vor) zu senden?