Hier mal mein Codes, nur die relevanten Teile, noch ungetestet, lief jedoch in der IDE fehlerfrei durch:
//+++++++++ im Setup ++++++++++
for (int i = 0; i < noRelays; i++)
{
request(i, V_STATUS); // Set relay to last known state
Relays[i].relayAckCountR = -1; // for the control of the request
wait(20);
request(i, V_PERCENTAGE); // Set relay to last known state
Relays[i].relayAckCountT = -1; // for the control of the request
wait(20);
}
//++++++++++ loop +++++++++
void loop() {
for (int i = 0; i < noRelays; i++) {
if (Relays[i].relayAckCountR < 0) {
request(i, V_STATUS); // Set relay to last known state
Relays[i].relayAckCountR = 0;
wait(40);
}
if (Relays[i].relayAckCountT < 0) {
request(i, V_PERCENTAGE); // Set relay to last known state
Relays[i].relayAckCountT = 0;
wait(40);
}
if (Relays[i].relayAckCountR > 0) {
send(msgRelay[i].set(Relays[i].relayState ? true : false), true); // Send value to gw with ACK
wait(40);
}
if (Relays[i].relayAckCountT > 0) {
send(msgTime[i].set(Relays[i].relayTime), true); // Send value to gw with ACK
wait(40);
}
}
}
//+++++++++++++++ recieve ++++++++++++
void receive(const MyMessage &message) {
bool isAckMessage;
switch (message.getCommand()) { // message.getCommand will give us the command type of the incomming message
case C_SET: //message is a set command from controller to update relay state
isAckMessage = true; //it's a ACK-Message
break;
case C_REQ: // message is a returning request from controller
isAckMessage = false; //it's not a ACK-Message
break;
}
//++++++++ Relays +++++++++
if (message.isAck() && message.type == V_STATUS && isAckMessage == true) {
Relays[message.sensor].relayAckCountR = 0;
if (message.sensor < noRelays) { // check if message is valid for relays..... previous line [[[ if (message.sensor <=noRelays){ ]]]
Relays[message.sensor].relayState = message.getBool();
digitalWrite(Relays[message.sensor].relayPin, Relays[message.sensor].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
//saveState( message.sensor, Relays[message.sensor].relayState ); // save sensor state in EEPROM (location == sensor number)
}
if (Relays[message.sensor].relayState == RELAY_ON) {
Relays[message.sensor].startTime = millis();
}
}
else if (!message.isAck() && message.type == V_STATUS && isAckMessage == true) {
Relays[message.sensor].relayAckCountR--;
}
else if (message.type == V_STATUS && isAckMessage == false) {
Relays[message.sensor].relayAckCountR = 0;
}
else if (message.isAck() && message.type == V_PERCENTAGE && isAckMessage == true) {
Relays[message.sensor].relayAckCountT = 0;
if (message.sensor < noRelays) { // check if message is valid for relays..... previous line [[[ if (message.sensor <=noRelays){ ]]]
Relays[message.sensor].relayTime = (message.getByte() * timeFactor); // calculate to millis
}
}
else if (!message.isAck() && message.type == V_PERCENTAGE && isAckMessage == true) {
Relays[message.sensor].relayAckCountT--;
}
else if (message.type == V_PERCENTAGE && isAckMessage == false) {
Relays[message.sensor].relayAckCountT = 0;
}
}
Sobald ich getestet habe gebe ich Rückmeldung.....