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