Klimaanlage per IR Steuern

Hallo,

vorneweg möchte ich sagen, ich bin totaler Anfänger und nicht seht tief in der Materie.
ich möchte die Klimaanlge per IR Steuern. Das Auslesen der Fernbedienung klappt aber die Klima schaltet sich beim senden der Befehle nicht ein. Ein test mit einem LG Fernseher hat wunderbar geklappt (irsender.sendnec -siehe unten).
Ich nutze das ESP8266 Board.

Über die Beispiel app Simple Receiver bekomme ich diese Werte der FB:

Protocol=Samsung Address=0xB24D Command=0x21B2 Raw-Data=0x21DEB24D 48 bits LSB first
Send with: IrSender.sendSamsung(0xB24D, 0x21B2, <numberOfRepeats>);

und (beim 2. mal Drücken des Ein/Aus Knopfes der FB)

IrSender.sendSamsung(0xB24D, 0x6B2, <numberOfRepeats>);

Es wechselt dann immer hin und her mit den obigen 2 Ausgaben.
Ich habe versucht die beiden Codes einzeln, nacheinander, in umgekehrter Reihenfolge zu senden und in diversen anderen Versionen: kein Erfolg.

Ich habe die ir DumpDemo geteset, welche mir dieses h ier ausgibt(kein Ahnung ob oder wie man das benutzen könnte)

08:29:13.577 ->  +12,-10 +12,-31 +12,-10 +11,-10
08:29:13.609 ->  +12,-31 +12,-32 +11,-10 +12,-31
08:29:13.609 ->  +12,-10 +12,-31 +12,-31 +12,-31
08:29:13.609 ->  +12,-31 +12,-10 +12,-31 +12,-31
08:29:13.609 ->  +12,-31 +12,-10 +12,-10 +11,-10
08:29:13.609 ->  +12,-10 +12,-31 +12,-10 +11,-10
08:29:13.609 ->  +12,-31 +13,-30 +12,-31 +12,-10
08:29:13.609 ->  +12,-10 +12,- 9 +12,-10 +12,- 9
08:29:13.609 ->  +12,-10 +13,- 9 +12,- 9 +13,-30
08:29:13.609 ->  +12,-32 +12,-31 +11,-32 +12,-31
08:29:13.609 ->  +12
08:29:13.609 -> Sum: 1741
08:29:13.609 -> Raw result in microseconds - with leading gap
08:29:13.609 -> rawData[100]: 
08:29:13.641 ->  -3276750
08:29:13.641 ->  +4450,-4350
08:29:13.641 ->  + 550,-1550 + 600,- 500 + 600,-1550 + 600,-1550
08:29:13.641 ->  + 600,- 500 + 600,- 500 + 600,-1500 + 600,- 500
08:29:13.641 ->  + 600,- 500 + 600,-1550 + 600,- 500 + 550,- 500
08:29:13.641 ->  + 600,-1550 + 600,-1600 + 550,- 500 + 600,-1550
08:29:13.641 ->  + 600,- 500 + 600,-1550 + 600,-1550 + 600,-1550
08:29:13.641 ->  + 600,-1550 + 600,- 500 + 600,-1550 + 600,-1550
08:29:13.641 ->  + 600,-1550 + 600,- 500 + 600,- 500 + 550,- 500
08:29:13.673 ->  + 600,- 500 + 600,-1550 + 600,- 500 + 550,- 500
08:29:13.673 ->  + 600,-1550 + 650,-1500 + 600,-1550 + 600,- 500
08:29:13.673 ->  + 600,- 500 + 600,- 450 + 600,- 500 + 600,- 450
08:29:13.673 ->  + 600,- 500 + 650,- 450 + 600,- 450 + 650,-1500
08:29:13.673 ->  + 600,-1600 + 600,-1550 + 550,-1600 + 600,-1550
08:29:13.673 ->  + 600
08:29:13.673 -> Sum: 87050
08:29:13.673 -> 

08:29:13.673 -> Result as internal ticks (50 us) array - compensated with MARK_EXCESS_MICROS=20
08:29:13.673 -> uint8_t rawTicks[99] = {89,87, 11,31, 12,10, 12,31, 12,31, 12,10, 12,10, 12,30, 12,10, 12,10, 12,31, 12,10, 11,10, 12,31, 12,32, 11,10, 12,31, 12,10, 12,31, 12,31, 12,31, 12,31, 12,10, 12,31, 12,31, 12,31, 12,10, 12,10, 11,10, 12,10, 12,31, 12,10, 11,10, 12,31, 13,30, 12,31, 12,10, 12,10, 12,9, 12,10, 12,9, 12,10, 13,9, 12,9, 13,30, 12,32, 12,31, 11,32, 12,31, 12};  // Protocol=Samsung Address=0xB24D Command=0x21B2 Raw-Data=0x21DEB24D 48 bits LSB first
08:29:13.737 -> 
08:29:13.737 -> Result as microseconds array - compensated with MARK_EXCESS_MICROS=20
08:29:13.737 -> uint16_t rawData[99] = {4430,4370, 530,1570, 580,520, 580,1570, 580,1570, 580,520, 580,520, 580,1520, 580,520, 580,520, 580,1570, 580,520, 530,520, 580,1570, 580,1620, 530,520, 580,1570, 580,520, 580,1570, 580,1570, 580,1570, 580,1570, 580,520, 580,1570, 580,1570, 580,1570, 580,520, 580,520, 530,520, 580,520, 580,1570, 580,520, 530,520, 580,1570, 630,1520, 580,1570, 580,520, 580,520, 580,470, 580,520, 580,470, 580,520, 630,470, 580,470, 630,1520, 580,1620, 580,1570, 530,1620, 580,1570, 580};  // Protocol=Samsung Address=0xB24D Command=0x21B2 Raw-Data=0x21DEB24D 48 bits LSB first
08:29:13.800 -> 
08:29:13.800 -> uint16_t address = 0xB24D;
08:29:13.800 -> uint16_t command = 0x21B2;
08:29:13.800 -> uint32_t data = 0x21DEB24D;
08:29:13.800 -> 
08:29:13.800 -> Pronto Hex as string
08:29:13.800 -> char prontoData[] = "0000 006D 0032 0000 00AC 00A7 0016 003B 0018 0012 0018 003B 0018 003B 0018 0012 0018 0012 0018 0039 0018 0012 0018 0012 0018 003B 0018 0012 0016 0012 0018 003B 0018 003D 0016 0012 0018 003B 0018 0012 0018 003B 0018 003B 0018 003B 0018 003B 0018 0012 0018 003B 0018 003B 0018 003B 0018 0012 0018 0012 0016 0012 0018 0012 0018 003B 0018 0012 0016 0012 0018 003B 001A 0039 0018 003B 0018 0012 0018 0012 0018 0011 0018 0012 0018 0011 0018 0012 001A 0011 0018 0011 001A 0039 0018 003D 0018 003B 0016 003D 0018 003B 0018 06C3 ";

Mein Programmcode sieht so aus:


#include <ESP8266WiFi.h>

#include <Arduino.h>
#include "PinDefinitionsAndMore.h"
#include <IRremote.h>

const char* ssid = "rpc";
const char* password = "[mein pw]";
int ledPin = D4;
WiFiServer server(80);


void setup() {
  
  Serial.begin(115200);
  
  delay(10);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  
  // Mit Wifi verbinden
  Serial.print("Verbinden mit: "); 
  Serial.println(ssid);
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print("#");
  }
  Serial.println("");
  Serial.println("WiFi verbunden");
 
  // Start des Servers
  server.begin();
  Serial.println("Server gestartet");
 
  // Print the IP address
  Serial.print("Diese URL zum Verbinden aufrufen: ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");

  IrSender.begin();
  Serial.print(F("Ready to send IR signals at pin "));
  Serial.println(IR_SEND_PIN);

}
 


void loop() {

  Serial.flush();

  // Prüfen, ob sich ein Client verbunden hat
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
 
  // Warten auf Daten vom Client
  // Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
 
  // Erste Zeile des Requests lesen
  String request = client.readStringUntil('\r');
  Serial.println(request);
  client.flush();
 
  // Match the request
   int value = LOW;
  if (request.indexOf("/LED=OFF") != -1)  {
    digitalWrite(ledPin, HIGH);
    value = HIGH;

  }
  if (request.indexOf("/LED=ON") != -1)  {
    digitalWrite(ledPin, LOW);
    value = LOW;
  }
 
  if (request.indexOf("/IR=1") != -1)  {
    IrSender.sendNEC(0x4, 0x8, 0);
  }
  if (request.indexOf("/IR=2") != -1)  {
    IrSender.sendSamsung(0xB24D, 0x6B2, 0);
  }
  if (request.indexOf("/IR=3") != -1)  {
    IrSender.sendSamsung(0xB24D, 0x21B2,0);
  }
  if (request.indexOf("/IR=4") != -1)  {
    IrSender.sendSamsung(0xB24D, 0x21B2, 0);
    IrSender.sendSamsung(0xB24D, 0x6B2, 0);
  }
  if (request.indexOf("/IR=5") != -1)  {
    IrSender.sendSamsung(0xB24D, 0x6B2, 0);
    IrSender.sendSamsung(0xB24D, 0x21B2, 0);
  }



  // Anfrage zurücksenden
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("");
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
  client.print("Die LED ist: ");
 
  if(value == HIGH) {
    client.print("Aus");
  } else {
    client.print("An");
  }

  client.println("<br><br>");
  client.println("<a href=\"/LED=ON\"\"><button>An </button></a>");
  client.println("<a href=\"/LED=OFF\"\"><button>Aus </button></a><br />");  
  client.println("<br>");
  client.println("<a href=\"/IR=1\"\"><button>Fernseher</button></a><br />");  
  client.println("<br>");
  client.println("<a href=\"/IR=2\"\"><button>J 1</button></a><br />");  
  client.println("<br>");
  client.println("<a href=\"/IR=3\"\"><button>J 2</button></a><br />");  
  client.println("<br>");
  client.println("<a href=\"/IR=4\"\"><button>J 1+2</button></a><br />");  
  client.println("<br>");
  client.println("<a href=\"/IR=5\"\"><button>J 2+1</button></a><br />");  
  client.println("<br>");


  client.println("</html>");
 
  delay(1);
}

Ich hoffe, jemand kann mir helfen :slight_smile:

Jan

Hallo Jan,

die Welt kennt nun Dein Routerpasswort, das Du schleunigst ändern solltest!

Den Beitrag zu editieren bringt nichts!

Kein Ding, das ist nicht das PW, ist ein "Tastatur" schlagen :wink:
Habs jetzt unsichtbar gemacht.

Ich entsinne mich dunkel, daß es einen Unterschied zwischen Fernseher und Ventilator gibt, möglicherweise gilt dies auch für Deine Klimaanlage.

Schau bitte mal im Thema IR Fernbedienung Auslesen / Probleme, ob Du da eine nützliche Information findest.

Leider gab es, wie so oft, keine Rückmeldung vom Fragesteller :face_with_symbols_over_mouth:

Hi,

was ist mit den Wiederholungen (repeats), welch immer auf 0 stehen?
Was "genau" ist damit gemeint (und in welchen Abständen)?

Und diese "48 Bis LSB first" ... was bedeutet das, kann es damit zu tun haben?

Jan

48 Bit ist schon eine Menge, was sagt denn das Beispiel IRremoteExtensionTest mit aktivierter Option

#define RAW_BUFFER_LENGTH  750  // 750 is the value for air condition remotes.

Möglicherweise gehen Dir Daten verloren, die Deine Klimaanlage vermißt.

Dieser gibt


15:27:19.277 -> Protocol=Samsung Address=0xB24D Command=0x21B2 Raw-Data=0x21DEB24D 48 bits LSB first
15:27:19.277 -> Send with: IrSender.sendSamsung(0xB24D, 0x21B2, <numberOfRepeats>);
15:27:19.277 -> Call resume()

15:27:28.774 -> Protocol=Samsung Address=0xB24D Command=0x6B2 Raw-Data=0x6F9B24D 48 bits LSB first
15:27:28.806 -> Send with: IrSender.sendSamsung(0xB24D, 0x6B2, <numberOfRepeats>);
15:27:28.806 -> Call resume()

aus (immer abwechselnd den Command 0x21B2 und 0x6B2 bei jedem Drücken der Power Taste auf der FB. Scheinbar ein "an" und "aus" Signal.

Ich habe im Kopf der IRremoteExtensionTest.ino unter das letzte If / buffer einfach das hier gesetzt:

#define RAW_BUFFER_LENGTH 750

Kann du daraus mehr erkennen oder einen anderen Versuch?

Jan

Sorry, Äpfel und Birnen! Meine Bibliotheksversion 3.6.1 von April 2022 scheint uralt zu sein, jetzt 3.9.0. Da muß ich komplett neu schauen, für mich daher erstmal TimeOut.

Ich würde mich sehr freuen, wenn dir noch irgendein Tip einfällt, den ich noch versuchen kann.
Es wäre mir sehr wichtig, die Klima ein- und ausschalten zu können -gerade jetzt im Winter.
Diese wird zum Heizen benutzt udn soll laufen, wenn die Photovoltaik genug Strom abgibt. Das ist meistens Tagsüber - und da ist halt noch keiner da, der den Knopf Drücken könnte.

Jan

Wäre ich in Deiner Situation, würde ich so vorgehen:

  1. Mit Arduino1 Fernbedienung auslesen. Hast Du schon gemacht.
  2. Mit Arduino2 Codes senden und mit Arduino1 überprüfen.
  3. Bei Übereinstimmung Codes an Klimaanlage und Arduino1 senden.

Danke für diesen "einfachen" und sehr hilfreichen Tip (hätte icha uch selbst drauf kommen können).
Es gibt tatsächlich Unterschiede:

Das hier sendet mein Arduino

10:13:45.365 -> Protocol=Samsung Address=0xB24D Command=0xB2 Raw-Data=0x4DB2B24D 32 bits LSB first
10:13:45.397 -> Send with: IrSender.sendSamsung(0xB24D, 0xB2, <numberOfRepeats>);
10:13:47.869 -> Protocol=Samsung Address=0xB24D Command=0xB2 Raw-Data=0x4DB2B24D 32 bits LSB first
10:13:47.869 -> Send with: IrSender.sendSamsung(0xB24D, 0xB2, <numberOfRepeats>);

Das hier sendet die Fernbedinung:

10:16:58.882 -> Protocol=Samsung Address=0xB24D Command=0x6B2 Raw-Data=0x6F9B24D 48 bits LSB first
10:16:58.882 -> Send with: IrSender.sendSamsung(0xB24D, 0x6B2, <numberOfRepeats>);
10:17:00.358 -> Protocol=Samsung Address=0xB24D Command=0x21B2 Raw-Data=0x21DEB24D 48 bits LSB first
10:17:00.358 -> Send with: IrSender.sendSamsung(0xB24D, 0x21B2, <numberOfRepeats>);

Der "Command" und die Bit Anzahl stimmt nicht.

Das ist der Code, der zum senden benutzt wird:

...
  if (request.indexOf("/IR=2") != -1)  {
    IrSender.sendSamsung(0xB24D, 0x6B2, 0);
  }
  if (request.indexOf("/IR=3") != -1)  {
    IrSender.sendSamsung(0xB24D, 0x21B2,0);
  }
...

Ich sende als das Kommando 0x6B2 aber es kommt nur 0xB2 raus?

Jan

Ja, das ist Klasse, denn es bietet Lösungsmöglichkeiten!

In IRremote\src\ir_Samsung.hpp finde ich "send 16 bit address and 8 command bits and then 8 inverted command bits LSB first", Du willst aber 16 Command Bits verschicken. Daher behaupte ich vorsichtig, sendSamsung() ist für Deine Klimaanlage ungeeignet.

Im Beispiel SendDemo.ino finde ich zusammengefaßt:

uint16_t sAddress = 0xB24D;					// von Deiner Fernbedienung, eventuell konstant
uint16_t sCommand = 0x06B2;					// von Deiner Fernbedienung, veränderlich
uint8_t sRepeats = 0;						// erstmal keine Wiederholung

IRData IRSendData;							// zu sendende Datenstruktur
IRSendData.address = sAddress;
IRSendData.command = sCommand;
IRSendData.flags = IRDATA_FLAGS_EMPTY;
IRSendData.protocol = SAMSUNG;
IrSender.write(&IRSendData, sRepeats);		// Datenstruktur senden

Bin gespannt :slightly_smiling_face:

Halo,

vielen dank für deine Hilfe.

Leider ändert der Code nichts. Die Ausgabe ist unverändert wie vorher.
Was mich allerdings auch wundert ist, dass die Ausgabe immer "Command=0xB2" ausgibt, obwohl ich einmal das Kommando 0x06B2 und dann 0x21B2 sende.
Oder liegt das daran, dass er nur den 8 Bit Teil auswertet, also das "B2"?

Kann man dem Samsung Protokoll nicht beibringen, 16 Bit zu verarbeiten?

Ich habe noch folgendes gefunden:
https://crankyoldgit.github.io/IRremoteESP8266/doxygen/html/classIRsend.html

Da gibt es ein "[sendCOOLIX]" und ein "[sendCOOLIX48]" - die Klimaanlage ist von Coolix.
Aber das sendCOOLIX kennt mein Compiler nicht !?

Jan

Ist doch eine andere Bibliothek, oder?

Mit Birnen kann man keinen Apfelkuchen backen :joy:

Hallo,
der Samsung Decoder und die send Funktion haben die 48 Bit nicht richtig unterstützt.
Du musst die die aktuelle gefixte Library hier GitHub - Arduino-IRremote/Arduino-IRremote: Infrared remote library for Arduino: send and receive infrared signals with multiple protocols herunterladen und installieren, dann sollte es klappen!

Halo,

danke für den Tip.
Nach langem Rumprobieren habe ich die irremoteesp8266 Library installiert, welche meine Coolix Klima (den IR Sender) direkt als solchen unterstützt.
Es gibt zwar noch einige Änderungen die ich machen muss, aber es funktioniert schon mal (ein und ausschalten).

Jan

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.