Arduino UNO Webserver - WAREMA EWFS Steuerung

Sehr geehrte Forenteilnehmer!

Ich würde gerne,
einen Arduino Webserver zur Steuerung (rauf, runter, stop) von 4x Warema EWFS Raffstore erstellen.
Als HW kommt ein Arduino UNO mit 433Mhz Sender (FS1000A) und einem Ethernet-Shield (W5100) zum Einsatz.
Der Webserver wird in weiterer Folge in eine Heimautomatisierung (FHEM) eingebunden, bzw. von dort angesteuert.

Derzeitiger Status:
Ich habe die Signale aller Raffstore aufgenommen (Digital-Analyzer) und dekodiert (Manchester).
Die dekodierten Signale wurden mittels SendDemo (rc-switch-ewfs/examples at master · memphi2/rc-switch-ewfs · GitHub) erfolgreich getestet.

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {

  Serial.begin(9600);
  
  // Transmitter is connected to Arduino Pin #10  
  mySwitch.enableTransmit(10);
}
void loop() {

mySwitch.sendMC("S0111010101010S01101011S11010101S",1780,5000,3,10000); //shutter OG-TUER DOWN TEST:OK

  delay(1000);
}

Der nächste Schritt:
wäre nun den Webserver zu erstellen, wo die Sende-Befehle (rauf, runter, stop) für die einzelnen Raffstore aktiviert werden können.
Kann mir hier jemand eventuell mit Hinweisen, Beispielen o.ä weiterhelfen?

Vielen Dank!
Gruß
Thomas

Webserver auf UNO kann Speicherprobleme bringen. Du musst also sehr speichersparend programmieren.
Schau Dir mal das Webserverbeispiel aus der Ethernet-Lib als Beispiel an.

Gruß Tommy

Hallo Tommy!

Wäre ein Arduino Mega hierfür prinzipiell besser geeignet?

Vielen Dank!
Thomas

Ja, da er mehr RAM hat. Ich selbst würde aber lieber den UNO/NANO das Aussenden der Steuercodes überlassen und diesen per I2C mit einem ESP8266 (WEMOS D1 mini oder NodeMCU) koppeln, der den Webserver betreibt und dem UNO sagt, was er senden soll.

So eine Kopplung habe ich hier mal beschrieben.
Eine komfortable Webserverlib gibt es in den Libs des ESP8266.

Gruß Tommy

Edit: Die Netzverbindung beim ESP8266 läuft über WLAN

Der Mega hat halt mehr Speicher, daher kannst mehr damit machen.

Das Webserverbeispiel der IDE gefällt mir nicht so gut. So zum Test, ob das Shield geht ok, aber weitermachen würde ich da nicht.

Ich hab da mal den Sketch aufgebessert, so wie ich das am Uno (Mega) machen würde: Arduino webserver: POST Daten empfangen und warum GET vermieden werden soll

Wäre es auch zwecks Ressourcenschonung sinnvoll,
das HTML auf die SD-Karte des Ethernet-Shields auszulagern?
(siehe: Kleiner Webserver · senseBox:edu)

Vielen Dank!
Thomas

das Filesystem für eine SD Karte braucht relativ viele Resourcen am UNO. Da sehe ich eigentlich keinen Nutzen, HTML auf eine SD Karte zu bringen. Außer du hast in deinem Sketch dies schon in Verwendung. Der Mega hat ausreichend Speicher für Filesystem und einen umfangreichen Sketch, andererseits gibts dann wieder so viel "mehr" an Programmspeicher, dass ich mir den Aufwand für ein paar HTML Seiden auf der SD Karte nicht antun würde.

An deiner Stelle würde ich erst mal ganz genau überlegen, was du auf der HTML Seite wirklich brauchst. Evtl. auch auch nur mal einen Prototypen der Seite in Notepad schreiben und im Browser testen. Dann siehst du ja wie groß das Wird - und vermutlich ist es im Uno weniger wenn du gechickt HTML Code-Duplikate mittels Schleifen ausgibst. Für ein paar Ports zum Schalten braucht es ja nicht so viel...

Sehr geehrte Forenteilnehmer!

Anbei mein Erstentwurf.
Ich bitte um kritische Bewertung, sicher ist einiges verbesserungswürdig.

Ich habe testhalber mal den ersten Raffstore eingebunden und konnte diesen via WebServer erfolgreich ansteueren (Rauf/Runter)

#include <RCSwitch.h>
#include <SPI.h>  
#include <Ethernet.h>

byte mac[] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 };  
IPAddress ip(192, 168, 1, 111);               // IP-Adresse

EthernetServer server(80);

String readString = String(100);      // string for fetching data from address
boolean RC1 = false;                  // Status flag
boolean RC2 = false;
boolean RC3 = false;
boolean RC4 = false;
boolean all = false;

RCSwitch mySwitch = RCSwitch();

void setup(){

 // Open serial communications and wait for port to open:
 Serial.begin(9600);
 while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());

  // Transmitter is connected to Arduino UNO DigitalPin #10 
 mySwitch.enableTransmit(10);
 
   }

void loop(){
// Create a client connection
EthernetClient client = server.available();
 if (client) {
  Serial.println("new client");

while (client.connected()) {
if (client.available()) {
char c = client.read();

//read char by char HTTP request
if (readString.length() < 100) {

//store characters to string
// readString.append(c);  removed by Katsu
readString = readString + c; // insert by Katsu
// very simple but it works...
}

Serial.print(c);  //output chars to serial port

if (c == '\n') {  //if HTTP request has ended

// readString.contains() replaced with readString.indexOf(val) > -1  
// indexOf locates a character or String within another String.
// Returns the index of val within the String, or -1 if not found.


if(readString.indexOf("rc1=up") > -1) {
mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //Raffstore1 UP TEST:OK
Serial.println("Raffstore-1-UP!");
RC1 = true;
}

if(readString.indexOf("rc1=down") > -1){
mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //Raffstore1 DOWN TEST:OK
Serial.println("Raffstore-1-DOWN!");
RC1 = false;
}


if(readString.indexOf("rc2=up") > -1) {
//mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //Raffstore2 UP
Serial.println("Raffstore-2-UP!");
RC2 = true;
}

if(readString.indexOf("rc2=down") > -1){
//mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //Raffstore2 DOWN
Serial.println("Raffstore-2-DOWN!");
RC2 = false;
}


if(readString.indexOf("rc3=up") > -1) {
//mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //Raffstore3 UP
Serial.println("Raffstore-3-UP!");
RC3 = true;
}

if(readString.indexOf("rc3=down") > -1){
//mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //Raffstore3 DOWN
Serial.println("Raffstore-3-DOWN!");
RC3 = false;
}

if(readString.indexOf("rc4=up") > -1) {
//mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //Raffstore4 UP
Serial.println("Raffstore-4-UP!");
RC4 = true;
}

if(readString.indexOf("rc4=down") > -1){
//mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //Raffstore4 DOWN
Serial.println("Raffstore-4-DOWN!");
RC4 = false;
}

if(readString.indexOf("all=up") > -1) {
//mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //Raffstore1 UP
//mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //Raffstore2 UP
//mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //Raffstore3 UP
//mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //Raffstore4 UP
Serial.println("Raffstore-1,2,3,4-UP!");
all = true;
}

if(readString.indexOf("all=down") > -1){
//mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //Raffstore1 DOWN
//mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //Raffstore2 DOWN
//mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //Raffstore3 DOWN
//mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //Raffstore4 DOWN
Serial.println("Raffstore-1,2,3,4-DOWN!");
all = false;
}
//--------------------------HTML------------------------
client.println("HTTP/1.1 200 OK");

client.println("Content-Type: text/html");

client.println();

client.print("<html><head>");

client.print("<title>Arduino Webserver HTML-TEST</title>");

client.println("</head>");

client.print("<body>");


//---Raffstore schalten BEGINN---

//---Raffstore-1 schalten---
client.println("Raffstore-1
");

client.println("<form method=get><input type=submit name=rc1 value='up'></form>");
client.println("<form method=get><input type=submit name=rc1 value='down'></form>");

if (RC1)
   client.println("Status: UP");
else
   client.println("Status: DOWN");
   
client.println("

");

//---Raffstore-2 schalten---
client.println("Raffstore-2
");


client.println("<form method=get><input type=submit name=rc2 value='up'></form>");
client.println("<form method=get><input type=submit name=rc2 value='down'></form>");

if (RC2)
   client.println("Status: UP");
else
   client.println("Status: DOWN");
   
client.println("

");


//---Raffstore-3 schalten---
client.println("Raffstore-3
");

client.println("<form method=get><input type=submit name=rc3 value='up'></form>");
client.println("<form method=get><input type=submit name=rc3 value='down'></form>");

if (RC3)
   client.println("Status: UP");
else
   client.println("Status: DOWN");
   
client.println("

");


//---Raffstore-4 schalten---
client.println("Raffstore-4
");

client.println("<form method=get><input type=submit name=rc4 value='up'></form>");
client.println("<form method=get><input type=submit name=rc4 value='down'></form>");

if (RC4)
   client.println("Status: UP");
else
   client.println("Status: DOWN");
   
client.println("

");


//---Raffstore-1,2,3,4 schalten---

client.println("Raffstore-1,2,3,4
");

client.println("<form method=get><input type=submit name=all value='up'></form>");
client.println("<form method=get><input type=submit name=all value='down'></form>");

if (all)
   client.println("Status: UP");
else
   client.println("Status: DOWN");

client.println("</body></html>");

//---Raffstore schalten ENDE---

//clearing string for next read
readString="";

//stopping client
client.stop();
}}}}}

Vielen Dank!
Thomas

Ich habe nun weiter mit dem WebServer-Erstentwurf getestet.
Mit einem Arduino UNO können mit dem aktuellen Script nur maximal 4 Befehle (z.B. 4xRaffstores hoch, 2xRaffstores hoch / 2xRaffstores runter etc.).
eingebunden werden.
Bei Einbindung von mehr als 4 Befehlen geht der UNO "in die Knie".
Dies äussert sich darin, dass das HTML nur langsam öffnet, bzw. werden die Befehle nicht mehr ausgeführt.

Vielen Dank!
Thomas

räum deine Webseiten zusammen, verschiebe die Fixtexte ins flash, mach weniger Client prints und arbeite bei gleichartigen Sachen mit Funktionen oder Schleifen.

Hast du meinen Link gelesen und irgendetwas davon mitnehmen können?

Auf Arduino webserver: POST Daten empfangen und warum GET vermieden werden soll
beschreibst du die GET und POST-Methoden.

Ich sollte in meinem Fall (weiterhin) die GET-Methode verwenden, da ich die aufgrufenen URIs via HTTPMOD
(HTTPMOD – FHEMWiki) in FHEM ansprechen muss.
Ist mein Gedankengang richtig, oder sollte ich die POST-Methode nehmen?

das passt für mich jetzt nicht zusammen:

Bisher gings um einen webSERVER am Arduino.
Es gibt gute Gründe einem webSERVER am Arduino Daten mittels POST zu senden.

Du willst jetzt offenbar zu einem anderen SERVER was schicken.
Wenn dieser SERVER etwas als GET erwartet dann musst du das halt so machen.

Wenn du die Daten vom Arduino aus wegschicken willst, dann brauchst du aber am Arduino einen webCLIENT. Und ja - auch der webCLIENT am Arduino cann GET oder POST, du musst halt das richtige nehmen.

Wenn ich es falsch verstanden habe, dann zeichne ein Bild wer an wen was mit welcher Methode senden soll.

Ich bin zu dem Entschluss gelangt, dass die "GET" -Methode in meinem Anwendungsfall geeigneter ist.
(Basis meiner Entscheidungsfindung siehe: GET und POST: Unterschiede und Anwendungen - Blog - Der Foobar Blog | Webentwicklung mal ganz einfach!
und https://www.ionos.at/digitalguide/websites/web-entwicklung/get-vs-post/)

Um meinen Eingangspost in dem ich meinen Anwendunsfall beschrieben habe zu ergänzen, bzw. vereinfacht darzustellen,

Wenn ich von einem anderen (internen) Client,
via Terminal "wget -O /dev/null http://Arduino.Webserver/?rs1=up" (curl -O /dev/null http://Arduino.Webserver/?rs1=up)
oder via Browser "http://Arduino.Webserver/?rs1=up"
aufrufe,
soll der Arduino den Befehl ausführen, d.h. das Signal (mittels 433Mhz Sender)
an den entsprechenden Raffstore (rs1=up ist Raffstore 1 hoch) senden.

Ich habe nun wie von Dir empfohlen damit begonnen,

die Webseite zu säubern und die Fixtexte in den Flash-Speicher zu verschieben.
Diese Maßnahmen haben für sich genommen schon einen Performancegewinn gebracht!

Kannst du mir eventuell noch ein paar Tipps geben, wie ich im derzeitgen Code "Funktionen" bzw. "Schleifen" umsetzen kann?
Ich nehme an dass ich mit einer Funktion auch das von Dir angemerkte "weniger ClientPrints" erreiche korrekt?

#include <RCSwitch.h>
#include <SPI.h>  
#include <Ethernet.h>
#include <Flash.h>

byte mac[] = { 0x1C, 0xA3, 0x06, 0xA5, 0x19, 0xEC };
IPAddress ip(192, 168, 1, 118); 
EthernetServer server(80);

String readString = String(100);      // string for fetching data from address


RCSwitch mySwitch = RCSwitch();

void setup()
{
Ethernet.begin(mac, ip);
server.begin();
mySwitch.enableTransmit(10); //Transmitter connected ArduinoUNO DigitalPin #10 
}
void loop(){
// Create a client connection
EthernetClient client = server.available();
 if (client) {

while (client.connected()) {
if (client.available()) {
char c = client.read();

if (readString.length() < 100) 
{
readString = readString + c; 
}

if (c == '\n') 
{  
if(readString.indexOf("rs1=up") > -1) {
mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,10,10000); //rs1 UP
}
if(readString.indexOf("rs1=down") > -1){
mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,10,10000); //rs1 DOWN
}
if(readString.indexOf("rs1=gapup") > -1) {
mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //rs1 GAPUP Spaltoeffnung
}
if(readString.indexOf("rs1=gapdown") > -1){
mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //rs1 GAPDOWN Spaltoeffnung
}
if(readString.indexOf("rs2=up") > -1) {
mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,9,10000); //rs2-TUER UP
}
if(readString.indexOf("rs2=down") > -1){
mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,9,10000); //rs2-TUER DOWN
}
if(readString.indexOf("rs2=gapup") > -1) {
mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //rs2-TUER GAPUP Spaltoeffnung
}
if(readString.indexOf("rs2=gapdown") > -1){
mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //rs2-TUER GAPDOWN Spaltoeffnung
}
if(readString.indexOf("rs3=up") > -1) {
mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,9,10000); //rs3 UP
}
if(readString.indexOf("rs3=down") > -1){
mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,9,10000); //rs3 DOWN
}
if(readString.indexOf("rs3=gapup") > -1) {
mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //rs3 GAPUP Spaltoeffnung
}
if(readString.indexOf("rs3=gapdown") > -1){
mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //rs3 GAPDOWN Spaltoeffnung
}
if(readString.indexOf("rs4=up") > -1) {
mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,10,10000); //rs4 UP
}
if(readString.indexOf("rs4=down") > -1){
mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,10,10000); //rs4 DOWN
}
if(readString.indexOf("rs4=gapup") > -1) {
mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //rs4 GAPUP Spaltoeffnung
}
if(readString.indexOf("rs4=gapdown") > -1){
mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS",1780,5000,3,10000); //rs4 GAPDOWN Spaltoeffnung
}

//--------------------------HTML------------------------
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.print("<body>");

client.println(F("RS1
"));
client.println(F("<form method=get><input type=submit name=rs1 value='up'></form>"));
client.println(F("<form method=get><input type=submit name=rs1 value='down'></form>"));
client.println(F("<form method=get><input type=submit name=rs1 value='gapup'></form>"));
client.println(F("<form method=get><input type=submit name=rs1 value='gapdown'></form>"));

client.println(F("RS2
"));
client.println(F("<form method=get><input type=submit name=rs2 value='up'></form>"));
client.println(F("<form method=get><input type=submit name=rs2 value='down'></form>"));
client.println(F("<form method=get><input type=submit name=rs2 value='gapup'></form>"));
client.println(F("<form method=get><input type=submit name=rs2 value='gapdown'></form>"));

client.println(F("RS3
"));
client.println(F("<form method=get><input type=submit name=rs3 value='up'></form>"));
client.println(F("<form method=get><input type=submit name=rs3 value='down'></form>"));
client.println(F("<form method=get><input type=submit name=rs3 value='gapup'></form>"));
client.println(F("<form method=get><input type=submit name=rs3 value='gapdown'></form>"));

client.println(F("RS4
"));
client.println(F("<form method=get><input type=submit name=rs4 value='up'></form>"));
client.println(F("<form method=get><input type=submit name=rs4 value='down'></form>"));
client.println(F("<form method=get><input type=submit name=rs4 value='gapup'></form>"));
client.println(F("<form method=get><input type=submit name=rs4 value='gapdown'></form>"));

readString="";

client.stop();
}}}}}

Vielen Dank!
Thomas

Hallo!

Kann mir jemand diesbezüglich noch eine Hilfestellung/Tipps geben?

Vielen Dank!

Auch wenn es schon geschrieben wurde und meine Anmerkung dazu recht spät kommt, ich würde in deinem Fall auf den ESP8266 (NodeMCU oder Wemos D1 mini) umsteigen.
Damit kannst du dein System deutlich flexibler gestalten und was die Webseiten betrifft, auch wesentlich besser aufzubauen sind. Auch diese arbeiten sehr gut mit der Library RCSwitch zusammen, so dass deine Funksteuerung gut zu integrieren ist.
Zusätzlich lassen sich die einzelnen ESP8266 untereinander per UDP steuern.

Ich habe selbst meine Haussteuerung mit den ESP8266 ergänzt und kann die jetzt per Webseite steuern.

Achja.....solltest du es noch nicht kennen, dann schau dir mal die Seite von fips an, da ist ein großer Teil von dem, was du brauchst, schon beschrieben. Den Rest bekommst du auch hin, notfalls mit unserer Hilfe. :wink:

omo22:
Kannst du mir eventuell noch ein paar Tipps geben, wie ich im derzeitgen Code "Funktionen" bzw. "Schleifen" umsetzen kann?

void loop() {

// Create a client connection
 EthernetClient client = server.available();
 if (client) {

while (client.connected()) {
     if (client.available()) {
       char c = client.read();

if (readString.length() < 100)
       {
         readString = readString + c;
       }

if (c == '\n')
       {
         if (readString.indexOf("rs1=up") > -1) {
           mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS", 1780, 5000, 10, 10000); //rs1 UP
         }
         if (readString.indexOf("rs1=down") > -1) {
           mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS", 1780, 5000, 10, 10000); //rs1 DOWN
         }
         if (readString.indexOf("rs1=gapup") > -1) {
           mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS", 1780, 5000, 3, 10000); //rs1 GAPUP Spaltoeffnung
         }
         if (readString.indexOf("rs1=gapdown") > -1) {
           mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS", 1780, 5000, 3, 10000); //rs1 GAPDOWN Spaltoeffnung
         }
         if (readString.indexOf("rs2=up") > -1) {
           mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS", 1780, 5000, 9, 10000); //rs2-TUER UP
         }
         if (readString.indexOf("rs2=down") > -1) {
           mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS", 1780, 5000, 9, 10000); //rs2-TUER DOWN
         }
         if (readString.indexOf("rs2=gapup") > -1) {
           mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS", 1780, 5000, 3, 10000); //rs2-TUER GAPUP Spaltoeffnung
         }
         if (readString.indexOf("rs2=gapdown") > -1) {
           mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS", 1780, 5000, 3, 10000); //rs2-TUER GAPDOWN Spaltoeffnung
         }
         if (readString.indexOf("rs3=up") > -1) {
           mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS", 1780, 5000, 9, 10000); //rs3 UP
         }
         if (readString.indexOf("rs3=down") > -1) {
           mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS", 1780, 5000, 9, 10000); //rs3 DOWN
         }
         if (readString.indexOf("rs3=gapup") > -1) {
           mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS", 1780, 5000, 3, 10000); //rs3 GAPUP Spaltoeffnung
         }
         if (readString.indexOf("rs3=gapdown") > -1) {
           mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS", 1780, 5000, 3, 10000); //rs3 GAPDOWN Spaltoeffnung
         }
         if (readString.indexOf("rs4=up") > -1) {
           mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS", 1780, 5000, 10, 10000); //rs4 UP
         }
         if (readString.indexOf("rs4=down") > -1) {
           mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS", 1780, 5000, 10, 10000); //rs4 DOWN
         }
         if (readString.indexOf("rs4=gapup") > -1) {
           mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS", 1780, 5000, 3, 10000); //rs4 GAPUP Spaltoeffnung
         }
         if (readString.indexOf("rs4=gapdown") > -1) {
           mySwitch.sendMC("SxxxxxxxxSxxxxxxxxxSxxxxxxxxxS", 1780, 5000, 3, 10000); //rs4 GAPDOWN Spaltoeffnung
         }

Das kann Dir momentan das Genick brechen.
Ich möchte Dir auch erklären warum, verzichte dabei auf codetags.
Mit if (c == '\n') fängst Du eine Auswahl an.
Diese Auswahl beginnt mit: if (readString.indexOf("rs1=up") > -1) {
Du kehrst danach aber in die nächste Auswahl zurück.
Das heisst, auch wenn die erste Bedingung erfüllt ist, prüfst Du trotzdem alle weiteren Varianten.

Darüber hinaus ist die Ausgabe unvollständig.

         client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.print("<body>");

Es gibt keinen Header, keinen schliessenden und html rundrum fehlt auch.

Da geht noch ein wenig...