TouchOSC + Ethernet Shield + Adroid

So funciona os dois primeiros reles com saídas 9 e 10, os dois últimos reles não são acionados.

#include <SPI.h>
#include <Ethernet.h>
#include <ArdOSC.h> //inclui blibioteca ArdOSC

byte myMac[]={0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; //define MAC para shield Ethernet
byte myIp[] = { 192, 168, 1, 148 }; //define IP da central automação
int serverPort = 8000; //define a porta de recepção do comando OSC
int destPort= 9000; //define a porta de envio do comando OSC
int relePin = 8; //define a porta do arduino associada ao Rele 1 Luz quarto
int relePin2 = 9; //define a porta do arduino associada ao Rele 2 Ar quarto
int relePin3 = 10; //define a porta do arduino associada ao Rele 3 Luz sala
int relePin4 = 11; //define a porta do arduino associada ao Rele 4 Luz cozinha
int flag=0;
int flag2=0;
int flag3=0;
int flag4=0;

OSCServer server; //inicializa o servidor OSC (serviço que trata a recepção de mensagem OSC)
OSCClient client; //inicializa o cliente OSC (serviço que trata o envio de mensagem OSC)

void setup(){

Ethernet.begin(myMac ,myIp); //inicializa a interface ethernet
server.begin(serverPort); //inicializa o servidor OSC definindo a porta de RX
//set callback function & oscaddress
server.addCallback("/ard/relePin",&func1); //define que a rotina "func1" será executada para o comando OSC "/ard/relePin"
server.addCallback("/ard/relePin2",&func2); //define que a rotina "func2" será executada para o comando OSC "/ard/relePin2"
server.addCallback("/ard/relePin3",&func3);
server.addCallback("/ard/relePin4",&func4);
pinMode(relePin, OUTPUT); //define a porta digital 8 (relePin) do Arduino como saida
pinMode(relePin2, OUTPUT);
pinMode(relePin3, OUTPUT);
pinMode(relePin4, OUTPUT);

}

void loop(){

if(server.aviableCheck()>0){ //verifica se existe alguma mensagem OSC disponível para leitura
// Serial.println("alive! ");
}

}

void func1(OSCMessage *_mes){ //rotina que trata comando OSC "/ard/relePin" recebido do ANDROID
int value=(int)_mes->getArgFloat(0); //armazena em "value" o argumento do comando OSC "/ard/relePin"
digitalWrite(relePin,value); //muda estado da porta digital 8 (relePin) conforme argumento OSC recebido

//create new osc message
OSCMessage txMes; //cria uma nova menssagem OSC

//set destination ip address & port no
txMes.setAddress(_mes->getIpAddress(),destPort); //define o endereço e porta do destino da mensagem OSC
txMes.beginMessage("/ard/relePin"); //define comando OSC
txMes.addArgFloat(flag); //define no estado do rele que será enviado no argumento OSC para ANDROID

if(flag==1){
flag=0;
digitalWrite(relePin, LOW);
}
else{
flag=1;
digitalWrite(relePin, HIGH);
}

txMes.addArgInt32(flag);

//send osc message
client.send(&txMes); //envia mensagem OSC para atualizar novo estado do led 1 no ANDROID

}
void func2(OSCMessage *_mes){ //rotina que trata comando OSC "/ard/relePin2" recebido do ANDROID
int value=(int)_mes->getArgFloat(0); //armazena em "value" o argumento do comando OSC "/ard/relePin2"
digitalWrite(relePin2,value); //muda estado da porta digital 9 (relePin2) conforme argumento OSC recebido

//create new osc message
OSCMessage txMes; //cria uma nova menssagem OSC

//set destination ip address & port no
txMes.setAddress(_mes->getIpAddress(),destPort); //define o endereço e porta do destino da mensagem OSC
txMes.beginMessage("/ard/relePin2"); //define comando OSC
txMes.addArgFloat(flag2); //define no estado do rele 2 que será enviado no argumento OSC para ANDROID

if(flag2==1){
flag2=0;
digitalWrite(relePin2, HIGH);
}
else{
flag2=1;
digitalWrite(relePin2, LOW);
}
}

void func3(OSCMessage *_mes){ //rotina que trata comando OSC "/ard/relePin3" recebido do ANDROID
int value=(int)_mes->getArgFloat(0); //armazena em "value" o argumento do comando OSC "/ard/relePin3"
digitalWrite(relePin3,value); //muda estado da porta digital 10 (relePin3) conforme argumento OSC recebido

//create new osc message
OSCMessage txMes; //cria uma nova menssagem OSC

//set destination ip address & port no
txMes.setAddress(_mes->getIpAddress(),destPort); //define o endereço e porta do destino da mensagem OSC
txMes.beginMessage("/ard/relePin3"); //define comando OSC
txMes.addArgFloat(flag3); //define no estado do rele 3 que será enviado no argumento OSC para ANDROID

if(flag3==1){
flag3=0;
digitalWrite(relePin3, LOW);
}
else{
flag3=1;
digitalWrite(relePin3, HIGH);
}

}
void func4(OSCMessage *_mes){ //rotina que trata comando OSC "/ard/relePin4" recebido do ANDROID
int value=(int)_mes->getArgFloat(0); //armazena em "value" o argumento do comando OSC "/ard/relePin4"
digitalWrite(relePin4,value); //muda estado da porta digital 11 (relePin4) conforme argumento OSC recebido

//create new osc message
OSCMessage txMes; //cria uma nova menssagem OSC

//set destination ip address & port no
txMes.setAddress(_mes->getIpAddress(),destPort); //define o endereço e porta do destino da mensagem OSC
txMes.beginMessage("/ard/relePin4"); //define comando OSC
txMes.addArgFloat(flag4); //define no estado do rele 4 que será enviado no argumento OSC para ANDROID

if(flag4==1){
flag4=0;
digitalWrite(relePin4, LOW);
}
else{
flag4=1;
digitalWrite(relePin4, HIGH);
}
}

Por que você está mudando duas vezes no mesmo método o estado do rele?
Aqui

digitalWrite(relePin4,value);   //muda estado da porta digital 11 (relePin4) conforme argumento OSC recebido

E aqui

 if(flag4==1){
    flag4=0;
    digitalWrite(relePin4, LOW);
  }
  else{
    flag4=1;
    digitalWrite(relePin4, HIGH);
  }

Pode ser que esteja ligando e desligando, é só um chute.
Desculpe, mas não tenho um modulo ethernet shield agora pra testar seu código.