HTTPMOD über ESP8266 WEMOS MINI

Begonnen von Torben80, 08 Juli 2017, 23:14:02

Vorheriges Thema - Nächstes Thema

Torben80

Moin Moin,
ich nutze HTTPMOD um meine Alarmanlage abzufragen ( Zustand und welche Fenster auf sind).
Mit den Werten steuere ich dann einen ESP8266 mini WEMOS an, welcher mit einen  8er LED Streifen verbunden ist. Funktioniert auch alles.

Hat jemand eine Idee, ob ich den WEMOS auch selber dieser Aufgabe machen lassen kann, sodass FHEM die Aufgabe nicht auch noch hat?

Gruß Torben


Gesendet von iPhone mit Tapatalk

dev0

Zitat von: Torben80 am 08 Juli 2017, 23:14:02
Hat jemand eine Idee, ob ich den WEMOS auch selber dieser Aufgabe machen lassen kann, sodass FHEM die Aufgabe nicht auch noch hat?
Machbar ist das sicherlich. Wie schnell Du das umsetzen kannst hängt von Deinen C und HTTP Protokoll Kenntnissen ab.
Ist Dein FHEM damit überfordert?

Torben80

Http Kenntnisse kein Problem.
Ansonsten Grundkenntnisse in Programmierung eigentlich überall angebrütet.


Gesendet von iPhone mit Tapatalk

dev0


digiart

Wenn ich das richtig verstehe, willst du per HTTP etwas dem FHEM mitteilen (z.B.  http://fhem:8083/fhem?cmd.Test=set%20Lampe%20on).

Dazu mußt du aber vorher den csrf-Token auslesen (wenn nicht abgeschalten):
String getToken() {
  long interval = 2000;
  String Read_HTML = "";
  uint8_t Start_Token, End_Token;
  unsigned long currentMillis = millis(), previousMillis = millis();
  String PostData = "?XHR=1";
  if (espClient.connect(fhem_server, 8083)) {
    espClient.println("POST /fhem HTTP/1.1");
    espClient.println("Host: fhem.local");
    espClient.println("Cache-Control: no-cache");
    espClient.println("Content-Type: application/x-www-form-urlencoded");
    espClient.print("Content-Length: ");
    espClient.println(PostData.length());
    espClient.println();
    espClient.println(PostData);
    while(!espClient.available()){
      if( (currentMillis - previousMillis) > interval ){
        Serial.println(F("Timeout"));
        espClient.stop();     
        return("");
      }
      currentMillis = millis();
    }
    currentMillis = millis();
    previousMillis = millis();
      if (espClient.available()) {
        for (uint8_t i = 0; i < 100; i++) {
          char str = espClient.read();
          Read_HTML += str;
        }
      }
    Start_Token = Read_HTML.indexOf("csrf_");
    End_Token =  Read_HTML.indexOf("Content-Type");
  }
  return(Read_HTML.substring(Start_Token, End_Token-1));
}


Danach kannst du die Daten inkl. Token schicken ("Karte" ist bei mir ein String der ID von der RFID-Karte, "Kartenleser" ist das Device in FHEM:
void post(String Karte) {
  Serial.print(F("HTTP send "));
  String PostData = "cmd.RFID=set%20Kartenleser%20";
  PostData += Karte;
  PostData += "&fwcsrf=";
  PostData += getToken();
  PostData += "&XHR=1";
  if (espClient.connect(fhem_server, 8083)) {
    Serial.print(PostData);
    espClient.println("POST /fhem HTTP/1.1");
    espClient.println("Host:  fhem.local");
    espClient.println("User-Agent: Arduino/1.0");
    espClient.println("Connection: close");
    espClient.println("Content-Type: application/x-www-form-urlencoded;");
    espClient.print("Content-Length: ");
    espClient.println(PostData.length());
    espClient.println();
    espClient.println(PostData);
    Serial.print(F("  OK"));
  } else {
    Serial.print(F("failed"));
  }
}


Ist sicher nicht der beste Code, aber er funktioniert.
Anfragen ausserhalb der Threads (PN, Mail o.ä.) werden ignoriert!

Torben80

Moin @digiart,
leider liegst du ganz falsch.

Derzeit hole ich mir den Status meiner Alarmanlage mit HTTPMOD und zerlege den String. So habe ich dann den Arm-Status bzw. die Kontakte (Open). Also Fenster (Open) oder status ist Arm oder disarm.

Das schicke ich dann per LEDStripe Modul an meinen ESP8266 WEMOS.

Und das will ich nun alles den WEMOS selber machen lassen.

Er muss also ins WLAN, den CURL Befehl ausführen, String zerlegen und dann NeoPixel Ausgang ansteuern.

Stehe nur gerade auf dem Schlauch.




Gesendet von iPhone mit Tapatalk

digiart

Dann ist eigentlich das "getToken" das, was Du haben willst, nur eben nicht FHEM als Server, sondern deine Alarmanlage.

Die Funktion macht nichts anderes, als eine URL aufrufen (wird im String PostData zusammengestellt), den Request an den "Gegner" schicken, danach die Antwort auslesen (EspClient.read) und einen Teil der Antwort (.substring) zurückgeben.
Anfragen ausserhalb der Threads (PN, Mail o.ä.) werden ignoriert!

Torben80

Ufff, das muss ich mir die Tage dann in Ruhe ansehen.


Gesendet von iPhone mit Tapatalk