ESP8266.nu - hat schon jemand was gebastelt ?

Begonnen von Klaus0815, 15 November 2015, 11:18:40

Vorheriges Thema - Nächstes Thema

Klaus0815

Es gibt hier bereits einen kleinen Thread im englischsprachigen Teil, aber ich schreib mal hier auf deutsch, vielleicht wird es hier eher gelesen.

Auf www.esp8266.nu gibt es ein in meinen Augen sehr interessantes Projekt, um mit den günstigen ESP-Devices Daten zu verschicken
Das Ganze wird per Webinterface konfiguriert, DHT, 1Wire usw. werden direkt unterstützt.

Leider gibt es aber noch kein Modul für FHEM, um direkt HTTP-Requests zu schicken, das Forum auf der Seite scheint nicht all zu aktiv zu sein.

Hat hier zufällig schon jemand was gebastelt / z.B. das Domoticz HTTP Protokoll so abgeändert, das es für FHEM passt ?
Ich bin leider zu wenig Arduino-Freak, lese schon seit Stunden durch die ganzen Dateien.

Es gibt hier den Tipp, den Umweg über MQTT zu gehen, aber macht das Sinn ?

Viele Grüße

Klaus

Klaus0815

so, gerade gefunden - Domotics HTTP ist in der Datei _C001 definiert, hier der Original-Code:

//#######################################################################################################
//########################### Controller Plugin 001: Domoticz HTTP ######################################
//#######################################################################################################

#define CPLUGIN_001
#define CPLUGIN_ID_001         1
#define CPLUGIN_NAME_001       "Domoticz HTTP"

boolean CPlugin_001(byte function, struct EventStruct *event)
{
  boolean success = false;

  switch (function)
  {
    case CPLUGIN_PROTOCOL_ADD:
      {
        Protocol[++protocolCount].Number = CPLUGIN_ID_001;
        strcpy_P(Protocol[protocolCount].Name, PSTR(CPLUGIN_NAME_001));
        Protocol[protocolCount].usesMQTT = false;
        Protocol[protocolCount].usesAccount = false;
        Protocol[protocolCount].usesPassword = false;
        break;
      }

    case CPLUGIN_PROTOCOL_SEND:
      {
        char log[80];
        boolean success = false;
        char host[20];
        sprintf_P(host, PSTR("%u.%u.%u.%u"), Settings.Controller_IP[0], Settings.Controller_IP[1], Settings.Controller_IP[2], Settings.Controller_IP[3]);

        sprintf_P(log, PSTR("%s%s"), "HTTP : connecting to ", host);
        addLog(LOG_LEVEL_DEBUG, log);
        if (printToWeb)
        {
          printWebString += log;
          printWebString += "<BR>";
        }
        // Use WiFiClient class to create TCP connections
        WiFiClient client;
        if (!client.connect(host, Settings.ControllerPort))
        {
          connectionFailures++;
          strcpy_P(log, PSTR("HTTP : connection failed"));
          addLog(LOG_LEVEL_ERROR, log);
          if (printToWeb)
            printWebString += F("connection failed<BR>");
          return false;
        }
        if (connectionFailures)
          connectionFailures--;

        // We now create a URI for the request
        String url = F("/json.htm?type=command&param=udevice&idx=");
        url += event->idx;

        switch (event->sensorType)
        {
          case SENSOR_TYPE_SINGLE:                      // single value sensor, used for Dallas, BH1750, etc
            url += F("&svalue=");
            url += UserVar[event->BaseVarIndex];
            break;
          case SENSOR_TYPE_TEMP_HUM:                      // temp + hum + hum_stat, used for DHT11
            url += F("&svalue=");
            url += UserVar[event->BaseVarIndex];
            url += ";";
            url += UserVar[event->BaseVarIndex + 1];
            url += ";0";
            break;
          case SENSOR_TYPE_TEMP_BARO:                      // temp + hum + hum_stat + bar + bar_fore, used for BMP085
            url += F("&svalue=");
            url += UserVar[event->BaseVarIndex];
            url += ";0;0;";
            url += UserVar[event->BaseVarIndex + 1];
            url += ";0";
            break;
          case SENSOR_TYPE_SWITCH:
            url = F("/json.htm?type=command&param=switchlight&idx=");
            url += event->idx;
            url += F("&switchcmd=");
            if (UserVar[event->BaseVarIndex] == 0)
              url += "Off";
            else
              url += "On";
            break;
          case SENSOR_TYPE_DIMMER:
            url = F("/json.htm?type=command&param=switchlight&idx=");
            url += event->idx;
            url += F("&switchcmd=");
            if (UserVar[event->BaseVarIndex] == 0)
              url += "Off";
            else
            {
              url += F("Set%20Level&level=");
              url += UserVar[event->BaseVarIndex];
            }
            break;
        }

        url.toCharArray(log, 80);
        addLog(LOG_LEVEL_DEBUG_MORE, log);
        if (printToWeb)
        {
          printWebString += log;
          printWebString += "<BR>";
        }

        // This will send the request to the server
        client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                     "Host: " + host + "\r\n" +
                     "Connection: close\r\n\r\n");

        unsigned long timer = millis() + 200;
        while (!client.available() && millis() < timer)
          delay(1);

        // Read all the lines of the reply from server and print them to Serial
        while (client.available()) {
          String line = client.readStringUntil('\n');
          line.toCharArray(log, 80);
          addLog(LOG_LEVEL_DEBUG_MORE, log);
          if (line.substring(0, 15) == "HTTP/1.1 200 OK")
          {
            strcpy_P(log, PSTR("HTTP : Succes!"));
            addLog(LOG_LEVEL_DEBUG, log);
            if (printToWeb)
              printWebString += F("Success<BR>");
            success = true;
          }
          delay(1);
        }
        strcpy_P(log, PSTR("HTTP : closing connection"));
        addLog(LOG_LEVEL_DEBUG, log);
        if (printToWeb)
          printWebString += F("closing connection<BR>");

        client.flush();
        client.stop();

        break;
      }

  }
  return success;
}

boolean Domoticz_getData(int idx, float *data)
{
  boolean success = false;
  char host[20];
  sprintf_P(host, PSTR("%u.%u.%u.%u"), Settings.Controller_IP[0], Settings.Controller_IP[1], Settings.Controller_IP[2], Settings.Controller_IP[3]);

  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  if (!client.connect(host, Settings.ControllerPort))
  {
    connectionFailures++;
    return false;
  }
  if (connectionFailures)
    connectionFailures--;

  // We now create a URI for the request
  String url = F("/json.htm?type=devices&rid=");
  url += idx;

  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");

  unsigned long timer = millis() + 200;
  while (!client.available() && millis() < timer)
    delay(1);

  // Read all the lines of the reply from server and print them to Serial

  while (client.available()) {
    String line = client.readStringUntil('\n');
    if (line.substring(10, 14) == "Data")
    {
      String strValue = line.substring(19);
      byte pos = strValue.indexOf(' ');
      strValue = strValue.substring(0, pos);
      strValue.trim();
      float value = strValue.toFloat();
      *data = value;
      success = true;
    }
  }
  return success;
}


herrmannj

Hi

der Vollständigkeit halber kündige ich an das ich an einem ähnlichen Projekt dran bin, fairerweise allerdings nicht mit höchster Prio. Auslöser ist der Adventskranz ... :)

Allerdings gehe ich einen etwas anderen Ansatz: um das Rad nicht komplett neu zu erfinden habe ich esp hier die (zusammen mit einem device modul) die Msg eines RFXTRX nachbilden. Die Idee dahinter: für den RFX gibt es ja einen recht komplette Suite von erwachsenen fhem modulen (Schalter, Temp, Hum, Licht +++)

Der esp gibt "emuliert" also zum Beispiel einen HE Schalter und so lassen sich die vorhandenen Modul (TRX_Light an der Stelle) direkt verwenden.

Die größte Unbekannte für mich ist aktuell die Batterielaufzeit der esp Lösungen.

vg
jörg

Bapt. Reverend Magersuppe

Zitat von: Klaus0815 am 15 November 2015, 11:18:40

Es gibt hier den Tipp, den Umweg über MQTT zu gehen, aber macht das Sinn ?


Das ist wirklich ein sehr interessantes Projekt!
Ich sehe MQTT nicht als Nachteil sondern eher als Vorteil da es sehr flexibel und robust ist. Das haut einen schon aus den Pantoffeln. Im Zusammenspiel mit NodeRed kann man da sicher einiges voran bringen und den ein oder anderen Wildwuchs ablösen.

--
If I was born in 1453, Leonardo da Vinci would be jealous of me.
Reverend Paul Egon Magersuppe
Aus versicherungstechnischen Gründen sind sämtliche Beiträge von mir rein spekulativer und theoretischer Natur und sollten nicht in die Tat umgesetzt werden!
Bin hier selten DRIN. AUS GRÜNDEN!

AndreasHH

Moin,

Ich bin gerade dabei, einen Füllstands/Pegelsensor auf Basis eines ESP8266 zu entwickeln.

Zutaten
Hardware:
- ESP8266
- Kapazitiver Sensor über TLC555 (CMOS-Variante vom NE555)

Software:
- MQTT (Mosquitto)
- FHEM-Modul MQTT

Programmierung über Arduino-IDE 1.65 +


Bisher läuft:
- kapazitive Messung (noch verbesserungswürdig, momentan in Arbeit)
- Übertragung der Daten per WLAN und MQTT an FHEM
- Anzeige der Daten in  FHEM und als Plot


Die Datenübertragung läuft stabil und hat den Vorteil, dass es da über WLAN so gut wie keine Beschränkung der Übertragungshäufigkeit gibt (Stichwort 1%-Regel).

Nachteil des ESP8266 ist der relativ hohe Stromverbrauch im Vergleich zu anderen Funk-Lösungen, d.h. Batterielösungen möglich aber nicht ganz so einfach realisierbar.


Zum Thema MQTT vielleicht auch ganz interresant ist ein mySensor-WLAN-Gateway.

http://www.mysensors.org/build/esp8266_gateway


Gruss

Andreas
FHEM 5.8, FB7490, FB7390, Linux-Server, Raspi 1, Raspi 2, FHEM2FHEM, div. FS20, div. FHT, div. HMS, div. Homematic, MQTT, ESP8266, Arduino

Klaus0815

Den Vorteil beim oben genannten Projekt sehe ich vor allem darin, das es über ein Webinterface einstellbar ist.
Theoretisch kann man dann z.B. einen zusätzlichen Sensor anschliessen, oder auf Vorrat ein paar geflashte Platinen in der Schublade haben und muss dann nicht jedes mal was neu flashen, nur um z.B. die IP zu ändern.

Ich habe hier auch unter anderem MySensors am laufen, ganz schick, v.a. im Batteriebetrieb, aber immer wieder das EEPROM zu löschen um eine neue ID zu vergeben, schon rel. kompliziert.

Was ist denn der Vorteil von MQTT ?  Ich verstehe es so, das es ein übergreifender Standart ist ? Aber ist es schneller, spart Overhead o.ä ?


Rince

Ich warte auf meine 5 ESPs und 4 Experimentierboards.
Bin sehr an ESP interessiert.

1. Projekt soll Anbindung an Wiegand Schnittstelle werden.
2. Lautstärkemessung mit ESP
3. ESP als Interface zu LMS
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Klaus0815

Habe jetzt den ganzen Abend rum gespielt, so einfach ist das mit dem MQTT dann doch nicht:
-Erst fehlen Pakete für das Modul MQTT, ok, nachinstallieren
- mit CPAN hängt sich der ganze Rechner auf - Neustart und nach Ursachen suchen
- CPAN-Minus installiert, damit wenigstens mal das Modul ans laufen bekommen
- kann per Android Handy und intern am Server MQTT-Pakete schicken, aber nicht vom ESP, also wieder ewig rumgesucht
- das hier gefunden: http://www.esp8266.nu/forum/viewtopic.php?f=4&t=111&p=1093&hilit=failed+to#p1093 - hab wohl die falsche mosquitto-Version
- jetzt seit Stunden versucht, die Richtige zu installieren -  Failed to fetch http://repo.mosquitto.org/debian/dists/wheezy/InRelease  Unable to find expecte                          d entry 'main/binary-armel/Packages' in Release file (Wrong sources.list entry or malformed file)

Sorry, das ist doch alles eine Spielerei und nichts ausgereiftes ?



SirUli


Rince

ZitatSorry, das ist doch alles eine Spielerei und nichts ausgereiftes ?

Threadtitel:
ZitatESP8266.nu - hat schon jemand was gebastelt ?

Wenn du was ausgereiftes willst, kauf dir ne SPS und Ruhe ist. Jedenfalls, solange du keine Atomkraftwerke damit betreibst. => Stuxnet

Ansonsten:
Hab ein bisschen Spaß daran, dass es immer etwas dauert bis etwas neues perfekt oder auch nur gut funktioniert. Dafür stehst du ganz vorne in der ersten Reihe und kannst in 2-3 Jahren erzählen:
"Ja damals, als mqtt noch nicht in den Repositories war, 3 verschiedene Programmieransätze auf dem ESP um die Gunst der User buhlten und fhem noch nicht von allein die benötigten Pakete installiert hatte, ja damals..."
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Klaus0815

Da hast recht, eigentlich brauche ich das ja alles nicht, homematic und co laufen zufriedenstellend, aber man will ja immer was Neues :-)
Habe jetzt MQTT selber kompiliert, gibt wohl keine Unterstützung mehr für armfs , jetzt mak schauen :-)