Arduino Ethernet-Relay

Hallo
ich bin erstens neu im Forum und 2. neu mit Arduino...
ich möchte mir mittels FHEM eine Homeautomation aufbauen... klappt auch ganz gut soweit.
jetzt habe ich nach langem googlen eine möglichkeit gefunden ein Relay via Ethernet am Arduino zu steuern...
was möchte ich:
FHEM (Rpi) sendet Befehl via LAN > ARduino schaltet Relay > gibt Rückmeldung an FHEM

derzeit :
FHEM > Arduino schaltet Relais > keine Rückmeldung
Problem: Wenn man auf die Site vom Arduino geht, wird der derzeit vorherrschende Befehl (vom FHEM) auf standard vom Arduino geswitcht... ist das verständlich beschrieben

ich habe hier diesen Code gefunden:

#include <UIPEthernet.h> // Used for Ethernet
#include <RCSwitch.h>
#include <SPI.h>


// **** ETHERNET SETTING ****
byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x31 };                                       
IPAddress ip(192, 168, 0, 253);                        
EthernetServer server(80);


int numPins = 4;
int pins[] = {3, 4, 5, 6};
int pinState[] = {1, 1, 1, 1, 1}; //legt die standardwerte fest
char line1[100];

// RCSwitch configuration
RCSwitch mySwitch = RCSwitch();
int RCTransmissionPin = 6;

void setup() {
  Serial.begin(115200);

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();

  Serial.print("IP Address: ");
  Serial.println(Ethernet.localIP());
  
  for (int i = 0; i < numPins; i++)
  {
     pinMode(pins[i], OUTPUT);
     digitalWrite(pins[i], pinState[1]); //setzt alle pins standard auf 1
  }

}

void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
if (client) 
  {
    while (client.connected()) 
    {
      readHeader(client);
      if (! pageNameIs("/"))
      {
        
        client.stop();  
        return;
      }
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/html");
      client.println();

      // send the body
      client.println("<html><body>");
      client.println("<h1>Output Pins v.2.3</h1>");
      client.println("<form method='GET'>");  
      setValuesFromParams();
      setPinStates();
      for (int i = 0; i < numPins; i++)
      {
         writeHTMLforPin(client, i);
      }
      client.println("<input type='submit' value='Update'/>");
      client.println("</form>");
      client.println("</body></html>");

      client.stop();            
    }
  }
}

void writeHTMLforPin(EthernetClient client, int i)
{
  client.print("<p>Pin ");
  client.print(pins[i]);  
  client.print("<select name='");
  client.print(i);
  client.println("'>");
  client.print("<option value='0'");
  if (pinState[i] == 0)
  {
    client.print(" selected");
  }
  client.println(">On</option>");
  client.print("<option value='1'");
  if (pinState[i] == 1)
  {
    client.print(" selected");
  }
  client.println(">Off</option>");
  //client.println("<option value='0'");  
  client.println("</select></p>");  
  
}

void setPinStates()
{
  for (int i = 0; i < numPins; i++)
  {
     digitalWrite(pins[i], pinState[i]);
  }
}

void setValuesFromParams()
{
  for (int i = 0; i < numPins; i++)
  {
    pinState[i] = valueOfParam(i + '0');
  }
}

void readHeader(EthernetClient client)
{
  // read first line of header
  char ch;
  int i = 0;
  while (ch != '\n')
  {
    if (client.available())
    {
      ch = client.read();
      line1[i] = ch;
      i ++;
    }
  }
  line1[i] = '\0'; 
  Serial.println(line1);
}

boolean pageNameIs(char* name)
{
   // page name starts at char pos 4
   // ends with space
   int i = 4;
   char ch = line1[i];
   while (ch != ' ' && ch != '\n' && ch != '?')
   {
     if (name[i-4] != line1[i])
     {
       return false;
     }
     i++;
     ch = line1[i];
   }
   return true;
}

int valueOfParam(char param)
{
  for (int i = 0; i < strlen(line1); i++)
  {
    if (line1[i] == param && line1[i+1] == '=')
    {
      return (line1[i+2] - '0');
    }
  }
  return 0;
}

der funktioniert auch ganz gut, aber wie gesagt, wenn ich einzeln schlaten will über zb. die Adresszeile des Browsers funktioniert das nicht ganz...

hat jemand von euch ideen? bzw. kennt sich da wer aus?

hallo
ich habe jetzt einen anderen code, der funktioniert besser (und ist einfacher zum lesen für mich :wink:
nur bleibt das Problem immer noch bestehend, dass nach einiger zeit der Arduino nicht mehr erreichbar ist ...
was kann man dagegen unternehmen?

hier mal mein code

#include <UIPEthernet.h> // Used for Ethernet
#include <RCSwitch.h>
#include <SPI.h>
#include <avr/wdt.h>


// **** ETHERNET SETTING ****
byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x31 };
IPAddress ip(192, 168, 0, 223);
EthernetServer server(80);

const byte pin3 = 3;
const byte pin4 = 4;
const byte pin5 = 5;
const byte pin6 = 6;

String readString;


void setup() {
  //delay(300);//time for Ethernet to initialise
  Serial.begin(115200);
  //wdt_enable(WDTO_1S);

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();

  Serial.print("IP Address: ");
  Serial.println(Ethernet.localIP());

  pinMode(pin3, OUTPUT); //setze pins auf ausgang
  pinMode(pin4, OUTPUT); //setze pins auf ausgang
  pinMode(pin5, OUTPUT); //setze pins auf ausgang
  pinMode(pin6, OUTPUT); //setze pins auf ausgang

  digitalWrite(pin3, HIGH); //setze pins auf OFF
  digitalWrite(pin4, HIGH); //setze pins auf OFF
  digitalWrite(pin5, HIGH); //setze pins auf OFF
  digitalWrite(pin6, HIGH); //setze pins auf OFF

  Serial.println("starting");
}

void loop() {
  // Programm starts working...now.
  //wdt_reset();
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client == true)
  {
    while (client.connected())
    { //hier bin ich
      if (client.available())
      {
        char c = client.read();// Read char by char HTTP request
        if (readString.length() < 100)
        {
          readString = readString + c;// Store characters to string
        }
        if (c == '\n')
        {
          Serial.println(readString);
          client.println(F("http/1.1 200 ok"));// Send standard http headers
          client.println(F("content-type: text/html"));
          client.println();
          client.println(F("<!doctype html><html>"));
          client.println(F("<body bgcolor='blue'>"));
          client.println(F("<center><head><title>Home Web Control</title></head>"));
          client.println(F("<h2>Arduino Nano Ethernet Shield Web Server(v1.2)</h2>"));
          client.println(F("<h4>rewritten @ M.Berger</h4>"));
          client.println(F("<hr/><p> Click the Buttons to turn On and OFF <p/><hr/>"));
          client.print(F("<input type=button value='Pin3 ON' onmousedown=location.href='/?pin3_on'>"));
          client.println(F("<input type=button value='Pin3 OFF' onmousedown=location.href='/?pin3_off'>

"));
          client.print(F("<input type=button value='Pin4 ON' onmousedown=location.href='/?pin4_on'>"));
          client.println(F("<input type=button value='Pin4 OFF' onmousedown=location.href='/?pin4_off'>

"));
          client.print(F("<input type=button value='Pin5 ON' onmousedown=location.href='/?pin5_on'>"));
          client.println(F("<input type=button value='Pin5 OFF' onmousedown=location.href='/?pin5_off'>

"));
          client.print(F("<input type=button value='Pin6 ON' onmousedown=location.href='/?pin6_on'>"));
          client.println(F("<input type=button value='Pin6 OFF' onmousedown=location.href='/?pin6_off'>
<hr/>"));
          client.print(F("<input type=button value='Pin3+4 ON' onmousedown=location.href='/?pin3_4_on'>"));
          client.println(F("<input type=button value='Pin3+4 OFF' onmousedown=location.href='/?pin3_4_off'>
<hr/>"));
          client.print(F("<input type=button value='Alle ON' onmousedown=location.href='/?all_on'>"));
          client.println(F("<input type=button value='Alle OFF' onmousedown=location.href='/?all_off'>
<hr/>"));
   
          client.println(F("</body></html>"));
          delay(1);// Page loading delay
          client.stop();// Stopping client
          if (readString.indexOf("/?pin3_on") > 0) digitalWrite(pin3, LOW); // Switch on Main Light
          if (readString.indexOf("/?pin3_off") > 0) digitalWrite(pin3, HIGH); // Switch off Main Light
          if (readString.indexOf("/?pin4_on") > 0) digitalWrite(pin4, LOW); // Switch on Chandelier Light
          if (readString.indexOf("/?pin4_off") > 0) digitalWrite(pin4, HIGH); // Switch off Chandelier Light
          if (readString.indexOf("/?pin5_on") > 0) digitalWrite(pin5, LOW); // Switch on Fan
          if (readString.indexOf("/?pin5_off") > 0) digitalWrite(pin5, HIGH); // Switch off Fan
          if (readString.indexOf("/?pin6_on") > 0) digitalWrite(pin6, LOW); // Switch on Auxillary Power
          if (readString.indexOf("/?pin6_off") > 0) digitalWrite(pin6, HIGH); // Switch off Auxillary Power
          if (readString.indexOf("/?pin3_4_off") > 0) {
              digitalWrite(pin3, HIGH);
              digitalWrite(pin4, HIGH);
          }
          if (readString.indexOf("/?pin3_4_on") > 0) {
              digitalWrite(pin3, LOW);
              digitalWrite(pin4, LOW);
          }
          if (readString.indexOf("/?all_off") > 0) {
              digitalWrite(pin3, HIGH);
              digitalWrite(pin4, HIGH);
              digitalWrite(pin5, HIGH);
              digitalWrite(pin6, HIGH);
          }
          if (readString.indexOf("/?all_on") > 0) {
              digitalWrite(pin3, LOW);
              digitalWrite(pin4, LOW);
              digitalWrite(pin5, LOW); 
              digitalWrite(pin5, LOW);
          }
          readString = "";// Clearing string for next read
        }// End of line reached
      }// End of client available
    }// End of client connected
  }// End of client connection
}// End of loop