ESP8266_Basic Library

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

Vorheriges Thema - Nächstes Thema

Kuzl

#90
Hallo Pf@nne,

ich hab ein paar fragen zu deinem Template:

wie muss ich alles anpassen, dass ich das Template im Sketch-Ordner verwenden kann?
Mir gefällt das im Lib-Ordner nicht, da ich Probleme bekomme, sobald ich das bei mehr als einem Projekt verwenden will.

Ist es möglich, alle Topics, die subscribed werden am Anfang einmal bekannt zu machen (ohne inhalt publishen), damit man weiß, was man überhaupt alles über MQTT steuern kann?
Ich will nicht in einem Jahr im Code schauen müssen, wie nochmal der MQTT-Pfad für einen reset war.

Wird der Passwortschutz bei der Webconfiguration nicht verwendet?
Ich konnte jedenfalls ohne eingabe von Benutzer und Passwort den MQTT-Server ändern.

Ist irgendwo beschrieben, wie die OneWire-Bibliothek, die du ja irgendwie verwendest, bedient wird?

Schon mal vielen Dank und viele Grüße,
Kuzl

Pf@nne

Moin Kuzl,

Zitat von: Kuzl am 19 Oktober 2016, 11:15:01
wie muss ich alles anpassen, dass ich das Template im Sketch-Ordner verwenden kann?
Mir gefällt das im Lib-Ordner nicht, da ich Probleme bekomme, sobald ich das bei mehr als einem Projekt verwenden will.

Gedacht war das mal als Library, ich sehe es mittlerweile aber auch eher als Template.
Du brauchst die zusätzlichen Files (*.h, *.cpp) nur in deinen Sketch-Ordner verschieben.
Das ist bei diesem Template schon gemacht:
https://github.com/Pfannex/ESP8266_AktSen

Zitat von: Kuzl am 19 Oktober 2016, 11:15:01
Ist es möglich, alle Topics, die subscribed werden am Anfang einmal bekannt zu machen (ohne inhalt publishen), damit man weiß, was man überhaupt alles über MQTT steuern kann?
Ich will nicht in einem Jahr im Code schauen müssen, wie nochmal der MQTT-Pfad für einen reset war.

Klar, du kannst den ganzen subscribe Topic-Tree beim Start einmal ohne Values publishen.
Auf der Gegenseite kannst du dann ja den ganzen Schwung mit ESP_ID/# einfangen.
Besser wäre es vielleicht wenn man diesen Vorgang über ein eigenes Topic anstoßen könnte z.B. ESP_ID/CMD/showAllTopics.
Dann weiß die Gegenseite ja was sie will.

Ich habe auch schon eine Version (halbfertig) wo die Topics aus externen JSON-Files eingelesen werden.
Dann sind die Topics nicht mehr "hardgecodet".


Zitat von: Kuzl am 19 Oktober 2016, 11:15:01
Wird der Passwortschutz bei der Webconfiguration nicht verwendet?
Ich konnte jedenfalls ohne eingabe von Benutzer und Passwort den MQTT-Server ändern.
Passwortschutz ist noch nicht implementiert.
Ist auch die Frage wie weit man da gehen will......

Ungeschützt ist man ja auch nur bei der ersten Einschaltung.
Wenn die SSID deines Netzwerkes einmal eingegeben worden ist,
sollte der AP ja zu bleiben.

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

Kuzl

Hallo Pf@nne,

danke für deine umfangreiche Anwort, werde ich heute gleich probieren :)
Hast recht, eigentlich muss ich ja nur über das Komplette Array loopen, dann hab ich alles gepublisht :)

Wie ist das eigentlich bei den subscribes, wenn ich eine Funktion oder Variable aus meinem Sketch verwenden will?
Muss ich da irgendwie ein Headerfile oder so machen? Hab das bei Arduino bisher noch nie gebraucht  ::)

Den Passwortschutz sehe ich ähnlich wie du - ist im Privaten Netzwerk nicht unbedingt nötig. War nur weils mir aufgefallen ist.

Viele Grüße,
Kuzl

Pf@nne

Moin Kuzl,

Zitat von: Kuzl am 20 Oktober 2016, 07:48:38
Wie ist das eigentlich bei den subscribes, wenn ich eine Funktion oder Variable aus meinem Sketch verwenden will?
Muss ich da irgendwie ein Headerfile oder so machen? Hab das bei Arduino bisher noch nie gebraucht  ::)

Ich habe das hier mal weitestgehend zusammengefasst....
https://forum.fhem.de/index.php/topic,50238.msg431833.html#msg431833


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

Kuzl

Hi,

das kannte ich schon ...  ich muss quasi die subs in ESP8266_Basic.cpp verarbeiten. Ich würde allerdings gerne damit eine Variable aus meinem Sketch (.ino-Datei) setzen. Genauer gesagt gehts dabei um ein Messinterval, das du ja auch bei deinem AktSen-Projekt über MQTT setzen kannst. Für die 1-Wire-Sensoren kann ich das ja einfach so verwenden, nur für den DHT22 nicht, weil ich da die Auswertung im Sketch mache.

vg
Kuzl

Pf@nne

Du sprichst von subscribes, möchtest du denn die Abfrage des DHT22 Messwertes aktiv anstoßen oder sollen die DHT22-Messwerte z.B. alle 30 Sekunden automatisch gepublisht werden?
FHEM auf: DS415+ (Master), Raspberry Pi 2

Kuzl

Habs mitlerweile hinbekommen :)

Ich wollte, dass eine Messung in einem Einstellbaren Zeitabstand gemacht wird.
Hab gefunden, dass du so was für die Temperatursensoren schon hast - habs auf public gesetzt und dann im Sketch für den DHT22 verwendet.
Funktioniert alles wunderbar - genial was du da gemacht hast.

Pf@nne

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

mifh

Moin,

ich bin zufällig über diese Library gestolpert und habe sie gleich mal genutzt.

Natürlich kommen einem da gleich ein paar Verbesserungsvorschläge, nur mal als Anregung...
Zitat von: Pf@nne am 19 Oktober 2016, 11:38:16
Passwortschutz ist noch nicht implementiert.
Ist auch die Frage wie weit man da gehen will......

Ungeschützt ist man ja auch nur bei der ersten Einschaltung.
Wenn die SSID deines Netzwerkes einmal eingegeben worden ist,
sollte der AP ja zu bleiben.

Solange der Webserver unter der IP des esp8266 aktiv ist (und zumindest in meiner Konfiguration ist er das), kann sich jeder das WLAN PWD anschauen. Das lasse zumindest ich nicht so in mein Netz, muss natürlich jeder für sich entscheiden.
Auf der anderen Seite ist das schnell korrigiert, einfach in ESP8266_Basic_webServer::rootPageHandler() aus den entsprechenden type text ein type password machen.

Weiterhin soll es Menschen geben, die ihren MQTT-Server mit einem password absichern. Wäre schick, wenn man das konfiguieren könnte.

Ok, genug der Anregungen. Das ist Meckern auf hohem Niveau  ;)
Wenn ich die Library schon vor einem halben Jahr gesehen hätte, hätte ich eine Menge Zeit sparen können, Kompliment!

Pf@nne

Moin,

ich sitze gerade an der V1.00, die bisherige ist ja eher alpha-Stadium.
In der nächsten Version kommen diese features natürlich mit rein.
Das war jetzt ja nur mal so zum Kennenlernen um zu schauen was so alles geht.

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

Spielmann

Hallo Pf@nne,

ich bin über den 1Wire Thread https://forum.fhem.de/index.php/topic,67427.0.html auf das ganze Thema ESP, MQTT und deiner Library gestoßen. Mein Ziel ist es, meine labile configurable firmata durch etwas stabileres zu ersetzen. Ich habe mich am Wochenende in deine Library eingelesen und konnte auch schon trotz geringer Programmierkenntnisse Erfolge erzielen (iButtons IDs lesen und Tastendrücke von einem Keypad mit I2C und PCF8574 per mqtt auf fhem weitergeben). Jetzt fehlt doch das LCD (I2C) Display und eventuell eine direkte Übergabe des Keypads ans LCD.
Allerdings habe ich den kompletten Code in die AktSen Control eingebunden und somit ist alles in der Loop was  nicht so optimal ist. Dies hat z.B. jetzt den Nachteil, dass sich der Tastendruck des Keypads im Takt der updateMeasure_time wiederholt (soll jedoch nur einmal pro Tastendruck ausgegeben werden).  Wo platziert man in deinem Template am besten den setup Teil?

Auszug der ESP8266_Basic.cpp
//===============================================================================
//  AktSen Control
//===============================================================================
//===> updateMeasurement <-----------------------------------------------------
void ESP8266_Basic::handle_Measurement(){
  if (mqtt_client.connected()){
    long now = millis();
    if (now - lastMeasure_time > updateMeasure_time) {
      lastMeasure_time = now;
      run_oneWire();
      run_I2C();
    }
  }
}
//===> run 1Wire <-----------------------------------------------------
void ESP8266_Basic::run_oneWire(){
  byte addr[8];
  char Key[50];
  OneWire oneWire(2);                   //GPIO2
if ( !oneWire.search(addr)) {
    oneWire.reset_search();
    delay(250);
    return;
  }
sprintf (Key, "%02x%02x%02x%02x%02x%02x%02x%02x",addr[0],addr[1],addr[2],addr[3],addr[4],addr[5],addr[6],addr[7]);
// Serial.println(Key);
// client.publish("outTopic", Key);
pub(3,1,0, Key);

}

//===============================================================================
//  Keypad Control
//===============================================================================
void ESP8266_Basic::run_I2C(){

#define I2CADDR 0x20


const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
   {'1','2','3'},
   {'4','5','6'},
   {'7','8','9'},
   {'*','0','#'}
  };

// Digitran keypad, bit numbers of PCF8574 i/o port
byte rowPins[ROWS] = {0, 1, 2, 3}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {4, 5, 6}; //connect to the column pinouts of the keypad

  Keypad_I2C kpd( makeKeymap(keys), rowPins, colPins, ROWS, COLS, I2CADDR, PCF8574 );

  Wire.begin(I2C_SDA, I2C_SCL);
  kpd.begin(makeKeymap(keys));
// Serial.begin(9600);

   
    char key_temp = kpd.getKey();
    if (key_temp){
    String str_key = String(key_temp);
    char key[7];
    strcpy(key, str_key.c_str());
    pub(4,1,0, key);
    }

}


original Codeschnipsel als Vorlage:
// I2C Keypad for Arduino
// Venkateswara Rao.E
// 19-oct-2015
// Credits to  @author Alexander Brevig

#include <Wire.h>
#include <Keypad_I2C.h>
#include <Keypad.h>
#define I2CADDR 0x38

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

// Digitran keypad, bit numbers of PCF8574 i/o port
byte rowPins[ROWS] = {0, 1, 2, 3}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {4, 5, 6}; //connect to the column pinouts of the keypad

Keypad_I2C kpd( makeKeymap(keys), rowPins, colPins, ROWS, COLS, I2CADDR, PCF8574 );

void setup(){
  Wire.begin( );
  kpd.begin( makeKeymap(keys) );
  Serial.begin(9600);
  Serial.println( "start" );
}

void loop(){
  char key = kpd.getKey();
 
  if (key){
Serial.println(key);
  }
}

FHEM mit Raspi (Zentrale)
Raspberrymatic (Heizung)
Siemens LOGO8 (Lichtsteuerung)
Philips HUE Gedöns
Diesel-Tankstelle mit fhem und ESP (eine ewige Baustelle)

Pf@nne

Moin,

was passiert den in der Vorlage hier, wenn der Taster dauerhaft gedrückt ist?
void loop(){
  char key = kpd.getKey();

  if (key){
Serial.println(key);
  }
}
FHEM auf: DS415+ (Master), Raspberry Pi 2

Spielmann

Hallo Pf@nne,
dann wird nur ein Zeichen ausgegeben. Erst ein erneutes Drücken des Tastern gibt ein weiteres Zeichen aus. Ich habe den original Code mit diesen Sketsch zunächst getestet:


#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Keypad_I2C.h>
#include <Keypad.h>
#define I2CADDR 0x20


const char* ssid = "spnet";
const char* password = "12345678901234567890";
const char* mqtt_server = "192.168.178.026";

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char Key[50];
int value = 0;

void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  randomSeed(micros());

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();

  // Switch on the LED if an 1 was received as first character
  if ((char)payload[0] == '1') {
    digitalWrite(16, LOW);   // Turn the LED on (Note that LOW is the voltage level
    // but actually the LED is on; this is because
    // it is acive low on the ESP-01)
  } else {
    digitalWrite(16, HIGH);  // Turn the LED off by making the voltage HIGH
  }

}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("outTopic", "iButton Reader connected");
      // ... and resubscribe
      client.subscribe("inTopic");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

// Digitran keypad, bit numbers of PCF8574 i/o port
byte rowPins[ROWS] = {0, 1, 2, 3}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {4, 5, 6}; //connect to the column pinouts of the keypad

Keypad_I2C kpd( makeKeymap(keys), rowPins, colPins, ROWS, COLS, I2CADDR, PCF8574 );

void setup(){
    Wire.begin(0,4 );
    kpd.begin( makeKeymap(keys) );
    Serial.begin(115200);
    Serial.println( "start" );
}

void loop(){
    char key_temp = kpd.getKey();
    if (key_temp){
   
    Serial.println(key_temp);

   
}
}


Hier sind die Funktionen erklärt:
http://playground.arduino.cc/Code/Keypad

Gruß
Spielmann
FHEM mit Raspi (Zentrale)
Raspberrymatic (Heizung)
Siemens LOGO8 (Lichtsteuerung)
Philips HUE Gedöns
Diesel-Tankstelle mit fhem und ESP (eine ewige Baustelle)

Pf@nne

Moin Spielmann,

schreibe doch deine Routinen wie gewohnt in den MainLoop der ESP8266_Basic.cpp.
Jetzt würde ja ein Tastendruck nur "eingefangen" wenn die updateMeasure_time abgelaufen ist.

Du kannst dann im MainLoop ja auch ein publish absetzen.
Auch das Initialisieren der I2C-Komponenten kannst du in der ESP8266_Basic.cpp durchführen.

Das Template war ja so gedacht, dass der MainSketch leer ist um deine eigenen Routinen hier zu platzieren.
Das Template soll die quasi "unsichtbar" im Hintergrund Arbeit abnehmen und weitere Funktionen (z.B. MQTT) zur Verfügung stellen.

Gruß
Pf@nne

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

sn0000py

Hallo :D

Mal ne blöde Frage, schaffe ich es mit dieser Library, das ich auch die main loop als erstes ausführe, und der WLAN Connect dann im Hintergrund läuft?

Möchte auch die Zeit die versucht wird ins WLAN einzuloggen anstatt eines neuen AP aufzumachen eigentlich auf unendlich oder so geben .... (wenn einmal ein WLAN definiert ist sollte immer das verwendet werden, auch wenn der WLAN Router mal ne zeitlang weg ist ... )