ESP8266_Basic Library

Begonnen von Pf@nne, 05 März 2016, 00:31:57

Vorheriges Thema - Nächstes Thema

Pf@nne

Welche IP nimmst du denn?
Bist du mit WLAN auf dem AP?

192.168.4.1?

Gruß
Pf@nne
FHEM auf: DS415+ (Master), Raspberry Pi 2

Will

Nein er hat sich schon in mein wlan Netz eingelogged. Ich habe die nun zugeordnete IP versucht. Ich dachte der AP springt nur an, wenn er sich nicht einloggen kann...

Sent from my SGP611 using Tapatalk


Pf@nne

Das ist richtig, der AP ist nur an, wenn er sich nicht verbinden konnte.
Hast du die Zugangsdaten denn über den AP konfiguriert oder waren die schon drinn?

Was sagt denn die serielle Ausgabe?

Die IP sollte reichen, die configseite ist die root page.

Gruß
Pf@nne
FHEM auf: DS415+ (Master), Raspberry Pi 2

Will

Hi Pf@nne,



geht alles - musste den ESP nochnal booten, dann alles gut.

Will

bin jetzt aber nicht schlau genug um das Thema publish und subscribe ganz zu verstehen...

sagen wir mal ich will auf die Topics

home/temperature und

home/humidity

reagieren bzw. einlesen weil ich die übertragenen Werte im SKetch verabeiten will.

Wiie mache ich dann den Topic tree?



Danke.

W

wingfighter

Hallo Will

Schau mal hier, da habe ich das mal für meinen Sketch beschrieben:
https://forum.fhem.de/index.php/topic,50697.msg440863.html#msg440863

Gruß wingfighter

Will

Prima. Ein Beispiel ist immer gut. Hast du für Temp 20 Sensoren, oder warum legst du so viele an?

Sent from my SGP611 using Tapatalk


wingfighter

Die MQTT-Struktur stammt von Pf@nne.
Ich hatte aber bei meinem Display-Projekt auch 10 vorgesehen.
Der Gedanke ist, dass man mit anderen im Haus verteilten ESP8266 diverse Raumtemperaturen per MQTT übertragen und auf dem Display anzeigen kann.
In der WebConfig habe ich im Moment aber nicht aller "verdrahtet".


Pf@nne

Hatten wir doch alles schonmal..... ::)

Zitat von: Pf@nne am 07 April 2016, 14:58:13
Moin wingfighter,

Zur Topic-Behandlung:

Es gibt je einen TopicTree für publish und subscribe diese werden in der ESP8266_Basic_data.cpp angelegt.
Die bereits vorhandenen Topics sind nur exemplarisch, und können auch komplett frei definiert werden!
Einige Topics sind allerdings schon in Betrieb (Reset, Update, ect.....).

Schau doch bitte hier nochmal rein:
https://forum.fhem.de/index.php/topic,50238.msg431833.html#msg431833
Das ist ja optional, wenn du nur auf ein Ereignis Triggern möchtest, ist ein Payload ja nicht unbedingt erforderlich.
Wenn du unterschiedliche Payloads hast kannst du sie einfach abfragen:

//===> incomming subscribe <---------------------------------------------------
void ESP8266_Basic::mqttBroker_Callback(char* topic, byte* payload, unsigned int length) {

...
...

  if (dissectResult.found){
    if (dissectResult.itemPath == "3/0/0"){   //  Hier wird nach dem definierten Topic <ESPDeviceName/user/public/name> gefiltert.
  if (strcmp(value, "Walter") == 0){     //  Hier kann bei Bedarf auch noch der Payload gefilter werden.
    Serial.println("Walter war es!");
  }
  if (strcmp(value, "Klaus") == 0){      //  Hier kann bei Bedarf auch noch der Payload gefilter werden.
    Serial.println("Klaus war es!");
  }
}


In deinem Fall ändere doch den subcribe-Tree:

Topics::Topics(){

...
...
  sub.E1.item[3] = "Hardware";
  sub.E2.item[3][0] = "Display";
  sub.E3.item[3][0][0] = "Zeile1";
  sub.E3.item[3][0][1] = "Zeile2";
  sub.E2.item[3][1] = "Servos";
  sub.E3.item[3][1][0] = "Servo1";
  sub.E3.item[3][1][1] = "Servo2";

...


und filtere:


//===> incomming subscribe <---------------------------------------------------
void ESP8266_Basic::mqttBroker_Callback(char* topic, byte* payload, unsigned int length) {

...
...

  if (dissectResult.found){
    if (dissectResult.itemPath == "3/0/0"){   //Zeile1
      Serial.println(value); 
    }
    if (dissectResult.itemPath == "3/0/1"){   //Zeile2
      Serial.println(value); 
    }

Daher würde ich das auch eher als Template bezeichnen, Library ist vielleicht an dieser Stelle nicht mehr ganz passend.
Mann nimmt sich ein ESP8266_Basic und schreibt dieses Template auf seine Bedürfnisse um.

Ich hoffe, dass hilft dir weiter.....

Gruß
Pf@nne
FHEM auf: DS415+ (Master), Raspberry Pi 2

Pf@nne

Oder hier.... 8)

Zitat von: Pf@nne am 29 März 2016, 15:47:24
Das freut mich doch erstmal...... 8)
Das Arbeiten muss natürlich ein wenig erläutert werden, frei nach dem Motto "was hat sich der Dichter wohl dabei gedacht!?".
Das habe ich leider zeitlich noch nicht geschafft, zumal ich selber noch nicht so ganz weiß, ob ESP_Basic eine Library oder vielleicht doch eher ein Template ist.
Momentan würde ich sagen, dass es sich hierbei um ein Template handelt, also das Framework selber als Basis dient und modifiziert wird.
Das habe ich jetzt schon bei zwei eigenen Projekten so gemacht, das hat auch sehr gut geklappt.

Da ich mit ProgrammerNotepad arbeite habe ich die ESP8266_Basic-Files im Library-Pfad abgelegt.
Diese können aber auch im Sketch-Pfad liegen, dann müsste man nur die #includes von <> auf "" ändern.

Kurzworkshop für Noobs   8)

MQTT-Topics definieren


Diese sind in der ESP8266_Basic_data.cpp zu definieren.
Hier können einfach die vorhandenen TopicTrees für subscribe und publish erweitert werden.
Wichtig ist hier die manuelle Anpassung der array[] indizes, diese müssen natürlich schlüssig sein.

Topics::Topics(){

...
...
  sub.E1.item[3] = "user";
  sub.E2.item[3][0] = "public";
  sub.E3.item[3][0][0] = "name";
  sub.E3.item[3][0][1] = "userName";
  sub.E2.item[3][1] = "private";
  sub.E3.item[3][1][0] = "age";
  sub.E3.item[3][1][1] = "weight";

...
...

  pub.E1.item[3] = "Control";
  pub.E2.item[3][0] = "User";
  pub.E3.item[3][0][0] = "machDies";
  pub.E3.item[3][0][1] = "machDas";


Die maximale Tiefe der Trees ist in der ESP8266_Basic_data.h ggf. anzupassen.


//publish struct
  const int pub_e1 = 4; //define TreeDepht here!!!
  const int pub_e2 = 5;
  const int pub_e3 = 5;
  const int pub_e4 = 0;

...
...

//subscribe struct
  const int sub_e1 = 4; //define TreeDepht here!!!
  const int sub_e2 = 5;
  const int sub_e3 = 4;
  const int sub_e4 = 0;


Ein publish ist jetz denkbar einfach!

  bool pub(int e1, char* Payload);
  bool pub(int e1, int e2, char* Payload);
  bool pub(int e1, int e2, int e3, char* Payload);


Diese functions sind public, d.h. auch aus dem Sketch herraus kann jetz eines der definierten Topics "gepublisht" werden:

ESP8266_template.ino

#include "ESP8266_Basic.h"
ESP8266_Basic espClient;

void setup() { 
  Serial.begin(115200);
  Serial.println("");
 
  espClient.start_WiFi_connections();

  espClient.pub(3,0,1, "ValueData");    //  hier wird Topic <ESPDeviceName/Control/User/machDas "ValueData">  an den Broker gesendet.


void loop() {
  espClient.handle_connections();
}


Als subscribe ist das Topic <ESPDeviceName/#> fest vorgegeben, d.h. alle Topics die für diesen ESP sind kommen pauschal an und werden auch seriell angezeigt.
Um auf ein definiertes Topic zu reagieren muss das ankommende Topic erstmal auseinander genommen werden.

Definierte Topics können sehr einfach in der ESP8266_Basic.cpp abgefangen werden.


//===> incomming subscribe <---------------------------------------------------
void ESP8266_Basic::mqttBroker_Callback(char* topic, byte* payload, unsigned int length) {

...
...

  if (dissectResult.found){
    if (dissectResult.itemPath == "3/0/0"){   //  Hier wird nach dem definierten Topic <ESPDeviceName/user/public/name> gefiltert.
  if (strcmp(value, "Walter") == 0){     //  Hier kann bei Bedarf auch noch der Payload gefilter werden.
    Serial.println("Walter war es!");
  }
  if (strcmp(value, "Klaus") == 0){      //  Hier kann bei Bedarf auch noch der Payload gefilter werden.
    Serial.println("Klaus war es!");
  }
}

  }


Jetzt wir klar, dass es mehr Sinn macht dies im Template zu machen, anderenfalls müssen alle Filterergebnisse als Callback in den Sketch geholt werden oder das "dissecten" im Sketch selber stattfinden.


SPIFFs FileUpload


Dazu gibt es hier ein Java-Tool
https://github.com/esp8266/arduino-esp8266fs-plugin/releases/download/0.1.3/ESP8266FS-0.1.3.zip
Das Tool einfach in C:\Program Files (x86)\Arduino\tools\ESP8266FS\tool\esp8266fs.jar entpacken und Arduino neu starten.
Unter Werkzeuge findet man jetzt "ESP8266 Sketch Data Upload"
Die zugehörige Beschreibung über das SPIFFs FS finde ich ganz gut.
http://esp8266.github.io/Arduino/versions/2.0.0/doc/filesystem.html

Damit können die Files im "/Sktech/data" DIR aus der ArduinioIDE herraus hochgeladen werden.


Zugriff auf SPIFFs Files


Momentan ist nur das Lesen/Schreiben von *.json-Files implementiert.
Es ist aber auch möglich andere Files zu nutzen, nur habe ich da momentan noch keinen Plan von..... :-)
Wenn du es raus hast, poste es doch einfach...... 8)


FirmwareUpload von *.bin Files über einen WEB-Server


Hierzu "einfach" den kompilierten *.bin Sketch-File auf den WEB-Server kopieren.
Bei mir liegen die *.bin-Files nach dem Kompilieren unter:

C:\Users\Pfanne\AppData\Local\Temp\build73b7b65d2a159c2828c1f5395d13bde9.tmp

Weil TEMP, wird das DIR erst beim Kompilieren angelegt.
Jetzt nur noch den Server auf der ConfigPage angeben und los......

Ganz wichtig!!!
Nach dem ersten seriellen Flashen unbeding ein RESET ausführen, entweder über den RESET-Eingang oder Wegnahme der Hilfsspannung.
Der Arduino-Core hat hier noch Probleme mit dem erste Start nach einem seriellen Flash.


Damit sollte man erstmal weiter kommen, falls nicht einfach kurz melden.


Probleme kann es noch geben wenn der Umfang der *.json-Files im Code geändert wird.
Da die Datei bereits existiert und das neue Feld nicht kennt, kann es dann zu Abstürzen kommen.
Das muss noch abgefangen werden, ist eben noch alpha...... ::)

Es müsste aber auch funktionieren, wenn man über das SPIFFs-Tool einfach die geänderte *.json uploadet.
Werde ich ma testen......


Gruß
Pf@nne
FHEM auf: DS415+ (Master), Raspberry Pi 2

Will

Hallo Pf@nne,

funktioniert alles wie es soll.....Danke!

regenbieger

Hi,
ich nutze die Library für einen ESP mit DHT22, 2xRelais, 1xPIR und LUX-Meter BH1750.
Publishen klappt super, subscribe in der ESP8266_Basic.cpp auch:

    if (dissectResult.itemPath == "2/0/0"){
  if (strcmp(value, "1") == 0){
    digitalWrite(12, LOW);
  }
  else {
        digitalWrite(12, HIGH);
      }
}
.....

Als nächstes wollte ich auf angeschlossenen LiquidCrystal_I2C Informationen ausgeben. Aus dem Sketch kein Problem, aber per Callback aus dem subscribe bekomme ich es einfach nicht hin. Meine dürftiges Wissen bezüglich der Pointer, Handels und was auch immer benutzt werden muß um im Sketch die Werte aus dem ESP8266_Basic.cpp subscribe zu kriegen, reicht einfach nicht.  :-[
Bitte kann mir jemand ein einfaches Beispiel geben wie ich im Sketch eine Funktion aufrufe die als Parameter dissectResult.itemPath und value übergeben bekommt. Also etwa so:
ESP8266_Basic.cpp
  if (dissectResult.found){
  mqttsub_Callback(dissectResult.itemPath,value);

und im Sketch aufruft:
void mqttsub_Callback(char* topic,  char* msgtext) {
//wenn Topic für LCD dann schieb es drauf
}


vielen Dank schonmal
FHEM und WEEWX auf Raspberry

Pf@nne

Moin,

für die Ansteuerung deines Displays musst du doch nur den subscribe-Tree um deine Topics erweitern:


  sub.E1.item[3] = "LCD";
  sub.E2.item[3][0] = "CMD";
  sub.E3.item[3][0][0] = "Clear";
  sub.E3.item[3][0][1] = "Reset";
  sub.E2.item[3][1] = "print";
  sub.E3.item[3][1][0] = "row1";
  sub.E3.item[3][1][1] = "row2";


und dann einfach nach dem dissector wieder einfangen:

  if (dissectResult.itemPath == "3/1/0"){
     LCD.writeText.row1(value);
  }


Ich weiß nicht so genau, warum du das in einem Callback verarbeiten möchtest.

Gruß
Pf@nne

FHEM auf: DS415+ (Master), Raspberry Pi 2

regenbieger

Ich vermute mal ich wollte dem ursprünglichen Gedanken hinter einer Library hinterher jagen und alles im Arduino ino sketch erledigen. Da wäre das eben genau das Puzzelteil gewesen was mir das ermöglicht hätte. Wenn ich das, wie von dir vorgeschlagen mache (also als modifizierbares Template nehme) klappt das alles prima. Ich hatte einfach nur nicht aufgeben wollen und wie ein irrer dem Syntax hinterher gejagt. Vielleicht hast du ja doch ein Beispiel wie ich das Callback im Sketch umsetzen kann. Unterm Strich ist die ESP8266_Basic Library ein sehr gut gelungenes Stück Software und ich bin dir schon jetzt für diese Lösung sehr dankbar.
FHEM und WEEWX auf Raspberry

schka17

#89
Hallo Pf@nne,

ist jetzt zwar nicht direkt eine Frage zu deinem Template aber vielleicht kannst du trotzdem einen Tip geben.
Ich verwende dein Template um mein Milight Gateway zu erweitern, und zwar um Kommunikation über MQTT anstatt UDP.

Ich schaffe es aber einfach nicht die gesnifften Werte unit_8 in Hex Werte und in ein format umzuwandeln um den das publish KOmmando abzusetzen:

Zitat#include "ESP8266_Basic.h"
ESP8266_Basic espClient;

void setup() {
  Serial.begin(115200);
  Serial.println("");

  espClient.start_WiFi_connections();

  espClient.pub(3,0,1, "ValueData");    //  hier wird Topic <ESPDeviceName/Control/User/machDas "ValueData">  an den Broker gesendet.
}

void loop() {
  espClient.handle_connections();
}

Welches Format muss die Variable haben die hier durch "ValuData" dargestellt wird? bzw. wie kann ich die aus einer unit_8 convertieren? ich verzweifle schön langsam, alles suche hat bis jetzt auch nichts gebracht.

vg

Karl

Edit:  Hat sich erledigt, habs herausgefunden.
M: Thinclient x64 Debian | CUL FS20, HMS100WD, HMS100TF, HMS100T, HMS100CO, S300, S555TH | OWServer DS1420, DS18B20, DS2408 | RFXCOM UVN128, THWR800, THGR228N,RTGR328, PCR800 |Jeelink PCA301 EC3000|CUNO+IR|HMLAN|HMUSB|CUL433 Somfy|mySensors|espEasy
S1:Raspberry mit BPM810, Jeelink EC3000