Infrarot Signale über Wlan weitersenden

Hallo!

Ich hoffe ich bin hier richtig. Mein Plan ist, Infrarotsignale einer Fernbedienung via WLAN in einen anderen Raum weiterzuleiten um dort ein Gerät schalten zu können. Dafür bieten sich ESP8266 an. Ein ESP8266 soll also IR signale mittels TSOP emfangen, via WLAN an einen anderen ESP8266 schicken, der die Signale dann via IR Led an einen Fernseher oder änhliches sendet.

Der Grund warum ich hier im Arduino Forum poste ist, dass mein Englisch sehr beschränkt ist, die größeren ESP Foren aber englischsprachig sind. Außerdem sollen die ESP über die Arduino IDE programmiert werden.

Erschwerend kommt hinzu, dass ich nur geringe Erfahrung habe mit der Programmierung von Arduinos. Ich habe zwar schon einige Projekte verwirklicht, die waren aber nicht so komplex. Ich habe mich daher bei der Erstellung der Sketches an diesen Seiten orientiert und versucht die dortigen Sketches anzupassen:

Herausgekommen ist folgendes. Ich habe mich wirklich bemüht, eine Struktur reinzubringen. Falls das missglückt ist, steinigt mich bitte nicht.
SSID und Passwort sind natürlich nicht “TOPSECRET”

/* Sketch zum senden von IR Codes über WLAN 
   Teil 1 von 2 
   Mit diesem Sketch empfängt ein ESP8266 (der Client) IR Codes und übermittelt sie via WLAN an einen Empfänger (den Server), der sie wiederum als IR Codes versendet.
   Dieser Sketch entstand, indem ich die Sketches dieser https://www.riyas.org/2014/03/sending-infrared-commands-over-ethernet-extend-ir-remote-arduino-ethernet.html
   und dieser http://www.instructables.com/id/WiFi-Communication-Between-Two-ESP8266-Based-MCU-T/ website kombiniert habe. 
   Kommentare, die mit eckigen Klammern versehen sind stammen aus den original Sketches
   Benötigt wird diese Library: https://github.com/esp8266/Basic/tree/master/libraries/IRremoteESP8266
   für diese library https://github.com/markszabo/IRremoteESP8266 ist ein anderer sketch notwendig
   Hardware:
            ESP8266 Nodemcu
            IR Empfänger OS-1838B (Conrad Nummer 184288 - 62)
               VCC --> 3,3 Volt
               GND --> GND
               OUT --> RECV_PIN (im Sketch Pin 5 = D1 am ESP8266)


                                  Dies ist der CLIENT Sketch
*/

#include <IRremoteESP8266.h>
#include <SPI.h>
#include <ESP8266WiFi.h>

int RECV_PIN = 5; // =ESP8266 Pin D1 verbunden mit OUT des OS-1838B
IRrecv irrecv(RECV_PIN);
decode_results results;
// Netzwerk Einstellungen
const char* ssid = "TOPSECRET"; //SSID des WLAN 
const char* password = "TOPSECRET"; //Passwort des WLAN 

const char* host = "192.168.1.75"; //IP des Servers, der die IR Codes an ein Unterhaltungsgerät schickt
WiFiClient client;

unsigned int rawCodes[RAWBUF]; // [The durations if raw] 
int codeLen; // [The length of the code]

//[Get the infrared codes from remote]
void storeCode(decode_results *results) 
{
  int count = results->rawlen;
  Serial.println("IR Codes empfangen");
  codeLen = results->rawlen - 1;
  for (int i = 1; i <= codeLen; i++) 
    {
      if (i % 2) 
        {
          rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK - MARK_EXCESS;  // Mark
          Serial.print(" m");
        } 
      else 
        {
          rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK + MARK_EXCESS;  // Space
          Serial.print(" s");
        }
      Serial.print(rawCodes[i - 1], DEC);
    }
  Serial.println("");
}

void setup()
{
  Serial.begin(115200);  // debugging
  WiFi.begin(ssid, password);  // WLAN starten
  Serial.println("WiFi Verbindung wird aufgebaut");
  while (WiFi.status() != WL_CONNECTED) 
    {
      delay(500);
      Serial.print(".");
    }
  Serial.println("");
  Serial.print("Eigene IP des ESP-Modul: ");
  Serial.println(WiFi.localIP());
  irrecv.enableIRIn(); // Receiver starten FEHLT IM ORIGINAL SKETCH!!!
}


void sendIR()  //senden der IR Codes über WLAN 
{
  if (client.connect(host, 80))
    {
      Serial.println("Sende Codes"); // debugging
      client.print("GET /");
      for (int i = 0; i < codeLen; i++) 
      {
        client.print(rawCodes[i]);
      }
      client.println(" HTTP/1.1");
      client.println("Hallo Server"); // debugging
      client.println();
      client.println();
      client.stop();
    }
  else // debugging
    {
      Serial.println("Keine Verbindung zum Server"); 
    }
}

void loop()
{
  if (irrecv.decode(&results))
  {
    storeCode(&results);
    sendIR();
    irrecv.resume(); // Receive the next value
  }
}

und

/* Sketch zum senden von IR Codes über WLAN 
   Teil 2 von 2 
   Mit diesem Sketch VERSENDET ein ESP8266 (der Server) IR Codes, die er via WLAN von einem anderen ESP8266 (dem Client) empfangen hat
   Dieser Sketch entstand, indem ich die Sketches dieser https://www.riyas.org/2014/03/sending-infrared-commands-over-ethernet-extend-ir-remote-arduino-ethernet.html
   und dieser http://www.instructables.com/id/WiFi-Communication-Between-Two-ESP8266-Based-MCU-T/ website kombiniert habe. 
   Die Schaltung habe ich von https://github.com/mdhiggins/ESP8266-HTTP-IR-Blaster
   Kommentare, die mit eckigen Klammern versehen sind stammen aus den original Sketches
   Benötigt wird diese Library: https://github.com/esp8266/Basic/tree/master/libraries/IRremoteESP8266
   für diese library https://github.com/markszabo/IRremoteESP8266 ist ein anderer sketch notwendig
   Hardware:
            ESP8266 Nodemcu
            Widerstand 100 Ohm
            Widerstand 1 Kilo Ohm
            NPN Transistor NPN 2N2222 (Conrad 1265003 - 62)
            IR Emitter IR-333A (Conrad 156407 - 62)
   Schaltungsaufbau siehe https://user-images.githubusercontent.com/3608298/30983611-f258c95a-a458-11e7-99c5-ba088727c928.PNG
   LED MUSS an Pin 4 (D2)
                                     Dies ist der SERVER Sketch
*/

#include <SPI.h>
#include <ESP8266WiFi.h>
#include <IRremoteESP8266.h>

IRsend irsend(4); //[make the ir sender]
const char* ssid = "TOPSECRET"; //SSID des WLAN
const char* pass = "TOPSECRET"; //Passwort des WLAN

IPAddress ip(192,168,1,75); //Feste IP des Servers, frei wählbar, muss mit Client Sketch übereinstimmen (Variable host)
IPAddress gateway(192,168,1,15); //Gatway (IP Router eintragen)
IPAddress subnet(255,255,255,0); //Subnet Maske 
WiFiServer server(80);

String readString; 

String serialDataIn;
int counter=0;
unsigned int rawCodes[100]; 

void setup(){ 
  Serial.begin(115200); 
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.println("WiFi Verbindung wird aufgebaut");
  WiFi.begin(ssid, pass);  //start Ethernet
  WiFi.config(ip, gateway, subnet);
  while (WiFi.status() != WL_CONNECTED) 
    {
      delay(500);
      Serial.print(".");
    }
  Serial.println("");
  Serial.print("Verbunden mit ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  server.begin();  // [enable serial data print ]
  Serial.println("Server gestartet, warte auf Codes"); 
}

void loop(){
  WiFiClient client = server.available();  // [Create a client connection]
  if (client) 
    {
      while (client.connected())
        {
          if (client.available())
            {
              char c = client.read(); //read char by char HTTP request
              if (readString.length() < 200)
                {
                  readString +=c;
                }
              if (c == '\n') //if HTTP request has ended
                {
                  serialDataIn = String("");
                  for (int i = 1; i <= readString.length(); i++) 
                    {
                      char d =readString.charAt(i);
                      if(d >= '0' & d <= '9')
                          serialDataIn += d;
                      if (d == '&') // [Handle delimiter]
                        {  
                          rawCodes[counter]=serialDataIn.toInt();
                          serialDataIn = String("");
                          counter = counter + 1;
                        }
                    }
                  Serial.println(readString);
                  Serial.println(counter); // [debuging the length]
                  for (int i = 0; i < counter; i++)  // [print the raw buff to serial] 
                    {
                      Serial.print(rawCodes[i]);
                      Serial.print('#');
                    }
                  digitalWrite(LED_BUILTIN, LOW); // [Now send the IR]
                  irsend.sendRaw(rawCodes, counter, 38);
                  delay(500);
                  digitalWrite(LED_BUILTIN, HIGH);
                  Serial.println("Sent IR signals");
                  client.println("HTTP/1.1 200 OK"); //[send new page]
                  client.println("Content-Type: text/html");
                  client.println();
                  client.println("<HTML>");
                  client.println("<HEAD>");
                  client.println("<TITLE>IR over ethernet debug page</TITLE>");
                  client.println("</HEAD>");
                  client.println("<BODY>");
                  client.println("<H1>Debug</H1>");
                  client.println("Check on serial monitor");
                  client.println("<a href=\"/1000&750&1900&800&950&800&1000&800&900&850&900&1750&1800&900&850&1800&900&850&1800&1750&900&\">MUTE</a>");
                  client.println("</BODY>");
                  client.println("</HTML>");
                  delay(1);
                  client.stop(); //stopping client
                  readString="";
                  serialDataIn = String("");
                  counter=0;
                }
            }
        }
    }
}

Die C-Nummern bitte ich zu ignorieren. Ich musste zum Teil andere Bauteile nehmen, da C die gewünschten dann doch nicht lagernd hatte. Anhand der auf github verfügbaren IR sende Demo Sketches bin ich mir sicher, dass die hardware funktioniert. Dieser Sketch https://github.com/esp8266/Basic/tree/master/libraries/IRremoteESP8266/examples/IRsendDemo lässt die IR led (über die Handycam betrachtet) blinken.

Jetzt zum Problem bei dem ich Euch bitte mir zu helfen. Vielleicht braucht jemand anderes diese Idee auch. Oder die Hilfe erfolgt nur des Sportsgeists willen.

Die zwei Nodemcus verbinden sich auch offenbar. Nach dem uploaden der Sketches und drücken einer Taste auf einer Fernbedienung gibt der Serial Motitor des Cliet aus:

IR Codes empfangen
 m4350 s750 m1550 s750 m1550 s750 m1550 s750 m450 s750 m450 s750 m450 s750 m450 s750 m450 s750 m1550 s750 m1550 s750 m1550 s750 m450 s750 m450 s750 m450 s750 m450 s750 m450 s750 m450 s750 m450 s750 m1550 s750 m450 s750 m450 s750 m450 s750 m450 s750 m450 s750 m1550 s750 m1550 s750 m450 s750 m1550 s750 m1550 s750 m1550 s750 m1550 s750 m1550 s750
Sende Codes
IR Codes empfangen
 m4350 s750 m1550 s750 m1550 s750 m1550 s750 m450 s750 m450 s750 m450 s750 m450 s750 m450 s750 m1550 s750 m1550 s750 m1550 s750 m450 s750 m450 s750 m450 s750 m450 s750 m450 s750 m450 s750 m450 s750 m1550 s750 m450 s750 m450 s750 m450 s750 m450 s750 m450 s750 m1550 s750 m1550 s750 m450 s750 m1550 s750 m1550 s750 m1550 s750 m1550 s750 m1550 s750
Sende Codes

und der Serial Monitor des Servers:

GET /435075015507501550750155075045075045075045075045075045075015507501550750155075045075045075045075045075045075045075045075015507504507504507504507504507504507501550750155075045075015507501550750155
0
Sent IR signals
GET /435075015507001600750155075045075045075045075045075045075015507501550750155075045075045075045075045075045075045075045075015507504507504507504507004507004507001600750155075045075015507501550750155
0
Sent IR signals
GET /435075015507501550750155075045075045075045075045075045075015507501550750155075045075045075045070045075045075045075045075015507504507504507504507504507504507501550750155075045075015507501550750155
0
Sent IR signals

Die IR Led am Server sendet aber definitiv keine Signale. Weder tut sich was am TV , noch erkenne ich eine Aktivität der LED via Handycam (die Led reagiert wie gesagt beim Demo Sketch, daher ist die Hardware OK).Da der serielle Monitor aber was ausgibt und auch die interne Led blinkt (Server Code Line 95 bis 98) verstehe ich nicht warum die LED nicht reagiert. Ich nehme daher an, dass der Fehler irgendwo im Sketch liegt udn vermute dass der counter (auch) schuld daran hat. Ich glaube nicht, dass der 0 sein sollte. Da der counter auf 0 ist gibt der Serial monitor auch nur readString und counter aus, nicht aber rawCodes.

Leider verstehe ich die IRremote lib nur ansatzweise...

ich habe mir gerade mal das Beispiel IRsendDemo.ino zur IRremoteESP8266.h angeschaut, dort kommt nach
#include <IRremoteESP8266.h>
noch zusätzlich
#include <IRsend.h>

Weder Dein Sketch, noch der verlinkte, lassen sich bei mir ohne die angegebene Zeile kompilieren :o

Das ist die Library die ich habe.

soweit ich das überblicke existieren 2 verschiedene IRremoteESP8266 libraries eine ältere (von mir verwendet) und eine neuere (von dir verwendet)

Die von dir verwendete wurde umfassend geändert und ist mit der von mir verwendeten nicht kompatibel. Daher auch eingangs der sketches der Kommentar:

Benötigt wird diese Library: https://github.com/esp8266/Basic/tree/master/libraries/IRremoteESP8266 für diese library https://github.com/markszabo/IRremoteESP8266 ist ein anderer sketch notwendig