Ungetestet und unvollständig, sollte aber gute Basis sein 

Code:
#define RS485 Serial
bool relayStates[15][8];
byte response[10];
byte byteCounter = 0;
bool responceReceived = false;
void setup() {
memset(response, 0x00, sizeof(response)); //set all values to "0x00"
memset(relayStates, false, sizeof(relayStates)); //set all values to "false", all relays are off
}
void loop() {
if(RS485.available()){
response[byteCounter] = RS485.read();
byteCounter++;
if(byteCounter >= 9){
//array is full => reception is complete
byteCounter = 0;
responceReceived = true;
//ToDo: add timeout: reset counter and response array after xx ms
}
}
if(responceReceived){
//0. byte is always 0xFF
//1. byte is (id + 1)
//2.-9. bytes are relays 0..7 states
byte id = response[1] - 1;
for (byte r = 0; r < 8; r++){
byte state = response[r + 2];
if(relayStates[id][r] != state){
relayStates[id][r] = state;
// Knx.write(id * 2 + 1, relayStates[id][r]); //send new state
}
}
responceReceived = false;
memset(response, 0x00, sizeof(response)); //set all values to "0x00"
}
}
//ID 0..14
bool sendStateRequest(byte id){
byte tmp = 0xA1 + id;
RS485.write(0xFF);
RS485.write(tmp);
RS485.write(0x00);
}
//ID 0..14
//rel 0..7
//state 0/1
void setState(byte id, byte rel, bool state){
byte tmp = (id + 1) * (rel + 1);
RS485.write(0xFF);
RS485.write(tmp);
RS485.write((byte)state);
sendStateRequest(id);
}
/*
ComObj numbers:
0 input ID1(id=0) R1(rel=0)
1 state ID1(id=0) R1(rel=0)
2 input ID2(id=1) R2(rel=1)
3 state ID2(id=1) R2(rel=1)
...
8 relays per id
16 com.objects per id
*/
void knxEvents (byte index){
byte id = 0;
byte rel = 0;
if(index % 2){
//status (odd), do we need this?
id = (index - 1) / 16;
rel = (index - 1) % 16;
Knx.write(relayStates[id][rel]);
}else{
//input (even)
id = index / 16;
rel = index / 16;
setState(id, rel, Knx.read(index); //set relay to new state
}
}



Kommentar