ESP8266_Basic Library

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

Vorheriges Thema - Nächstes Thema

Spielmann

Hallo Pf@nne,
danke für den Tipp. Normalerweise hätte ich das intuitiv auch so getan. Allerdings habe ich mich von dem bereits vorhandenen Onewire und I2C (aus dem 1W-I2C-Gateway) im handle_Measurement() verleiten lassen die Routinen hier einzufügen. Das macht zudem auch mehr Sinn, da ich den iButton und die Tastendrücke schnellstmöglich publishen möchte. Ich werde das mal so umsetzen.
Was auch schon angesprochen wurde ist das sichtbare Passwort im Web-Server. Ich fühle mich da auch ein bisschen unwohl (obwohl es ja nur im eigenen Netzwerk ist). Kann man das auf die Schnelle ändern bzw. wann kommt deine V1.0 heraus?

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

Zitat von: sn0000py am 07 März 2017, 07:54:11
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 ... )

Die wartezeit auf die konfigurierte WiFi-Verbindung kannst du in der "ESP8266_Basic.cpp" beeinflussen:
//===> WIFI SETUP <------------------------------------------------------------
bool ESP8266_Basic::start_WiFi(){
bool WiFiOK = false;

  delay(10);
  Serial.println();
  Serial.print("Connecting WiFi to: ");
  Serial.println(cfg.wifiSSID);
   
  WiFi.begin(cfg.wifiSSID, cfg.wifiPSK);

  int i = 0;
  while (WiFi.status() != WL_CONNECTED and i < 31) {
    delay(500);
    Serial.print(".");
i++;
  }
Serial.println("");


Du könntest die while-Schleife ohne das "and i < 31" laufen lassen, dann wartet er bis zur Verbindung.
Vorher müsstest du aber abfragen ob bereits eine WiFi-SSID und ein Passwort vorhanden sind,
sonst bekommst du beim ersten mal Probleme.






Zitat von: Spielmann am 07 März 2017, 12:42:09
Was auch schon angesprochen wurde ist das sichtbare Passwort im Web-Server. Ich fühle mich da auch ein bisschen unwohl (obwohl es ja nur im eigenen Netzwerk ist). Kann man das auf die Schnelle ändern bzw. wann kommt deine V1.0 heraus?

An der V1.0 sitze ich immer mal so nebenbei, es fehlt einfach die Zeit.....
Ich möchte da so einiges ummodeln.... z.B. frisst das Topic-Array einfach zu viel Speicher.
Die Topics wollte ich in einen json-File ins FS auslagern.

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

sn0000py

ich hab schon den WIFI TEil bei mir selber gebaut, und glaube das es auch so funktioniert (also im prinzip nur den start im setup machen und dann die setup sofort verlassen)
glaub das müsste für meine Zwecke reichen.
Nur wie gesagt den rest das OTA und MQTT müsste ich auch alles neu und selber machen ...
Aber das würde bedeuten, das ich einiges umbauen muss ...

Spielmann

Hallo Pf@nne,
langsam macht mir die Programmiererei an deinem Template Spaß. Dein Template ist ein guter Einstieg für Anfänger. Dein Tipp mit der Main-Loop zu arbeiten funktioniert. Inzwischen wird:
- ein iButton im 500ms Takt ausgelesen und gepublisht
- Das I2C Keypad übergibt die einzelnen Tastendrücke ohne prellen oder Verzögerung direkt an die mqtt Schnittstelle
- Ein I2C LCD bildet die Tastendrücke ab.
- Parallel bilde ich einen String der Tastendrücke. Dieser wird bei Tastendruck "*" zur Korrekturmöglichkeit geleert (auch das LCD) und bei "#" gepublisht. (z.B. um mein kmStand bzw. Geheimpin am Stück zu übergeben)

Jetzt möchte ich einen DS2423 Counter anschließen. Allerdings möchte ich möglichst einen zweiten Onewire-Bus anlegen, da der Bus des iButton Reader zum Bediener nach außen geführt wird und ich Bedenken vor einer Überspannung/ESD habe. Ich habe zwar Klemm-, Z- und Supressordioden eingebaut, aber bei einem ,,stärkeren" ESD/Überspannungsereignis würde es evtl. ,,nur" den ESP und nicht den teuren und seltenen DS2423 zerschießen. Ist das mit der bestehenden oneWire Library einfach so möglich und wenn ja wie könnte man da ansetzen?

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

#109
Moin,

als ersten Ansatz würde ich einen 1W-ESD-Protection-Chip empfehlen (z.B. DS9503).
Ich nutze hierfür ein eigenes Board mit Gehäuse.
https://forum.fhem.de/index.php/topic,63898.0.html

Natürlich kannst auch einen freien GPIO mit einem zweiten 1W-Bus belegen.

ESP8266_Basic.h

//===> GPIO <--------------------------------------------------------------
//1Wire
  #define oneW   2     //GPIO 2
  #define oneW2 x     //freier GPIO


ESP8266_Basic.cpp

//===> run 1Wire <-----------------------------------------------------
void ESP8266_Basic::run_oneWire(){
  OneWire oneWire(oneW);                   //GPIO 2
  DallasTemperature DS18B20(&oneWire);

  OneWire oneWire2(oneW2);                   
  DallasTemperature DS18B20(&oneWire2);



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

Spielmann

Hallo ich noch mal,
eigentlich wollte ich schon viel weiter sein. Jetzt bin ich über ein (Anfänger)problem gestolpert, dass mich (wieder mal) die ganze Nacht gekostet hat.

Beim Erstellen von subscribes bin ich auf das Problem gestoßen, dass beim Einbinden des lcd in der ESP8266_Basic.cpp:


if (dissectResult.itemPath == "4/1/0"){
    if (strcmp(value, "Walter") == 0){
        lcd.print("Walter war es!");
    }
    Serial.println("Jeder war es!");     
    }
}


die Fehlermeldung erhalte:
exit status 1
'lcd' was not declared in this scope

Wie muss ich im Code erklären, dass dies zur LiquidCrystal_I2C Library gehört? Mit Serial.println funktioniert es.

Gruß
Spielmann

PS: Ist ein WEMOS kompaibel zum ESP-12e (ausser natürlich den Pins)? Dann wäre deine PCB für mein Projekt interessant. Ich müsste dann nur noch ein Levelshifter fürs LCD einbauen und zwei Relais reinpfrimeln.

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,

du hast das LCD sicherlich in deinem Hauptsketch deklariert, dann weiß die ESP8266_Basic doch nichts von dessen Existenz.
Deklariere doch das LCD in der ESP8266_Basic.h / .cpp dann kannst du es sowohl in der ESP8266_Basic als auch in deinem Hauptsketch nutzen.

Auf dem WeMos ist ein ESP12e verbaut, also alles kompatibel.
Wie wird denn das Display angesteuert? I2C?

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

Spielmann

Hallo,
Wochenende ist vorbei und bin leider nicht viel weitergekommen. Jetzt habe ich das LCD in der ESP8266_Basic.h / .cpp deklariert und kann es auch direkt aus der incoming subscribe Funktion ansteuern. Leider funktioniert dann das LCD nicht mehr im .ino Hauptsketch. Auch bei zukünftigen Variablen werde ich vermutlich immer auf das Problem der Deklarationen stoßen. Ich meine "regenbieger" hat im Topic #86ff das gleiche Problem gehabt.
Ich benötige einfach(?) eine gemeinsame Verbindung der Deklarationen zwischen den Hauptsketch und der void ESP8266_Basic::mqttBroker_Callback(char* topic, byte* payload, unsigned int length) Funktion. Dann kann ich wie im Kurzworkshop für Noobs beschrieben mein Code im Hauptsketch schreiben und im incomming subscribe meine Topics einfach abfangen.

Andere Thema: Ja. Das ist ein Standard 20 x 4 LCD mit aufgesetztem PCF8574 (Adr. 0x3F) und benötigt 5V. Die Pull-up Widerstände aus dem PCF8574 auslöten und diese an die 3,3V anbinden reicht lt. Datenblatt des PCF8574 nicht aus bzw. ist knapp (3,3/5=0,66 -> Soll min 0.7 VDD sein).  Aktuell ist bei mir noch alles fliegend verlötet/verdrahtet. Ich denke, ich werde so ein Board die nächsten Tage bei dir bestellen (falls noch vorhanden).

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,

wenn du es in der ESP8266_Basic.h deklarierst und die ESP8266_Basic.h im Hauptsketch enthalten ist, dann sollte alles was in der ESP8266_Basic.h steht auch im Hauptsketch laufen.
Hänge mal deinen Code als ZIP an.

Die Callback-Routine ist ein "Rückruf" der MQTT-Routinen und hat damit erstmal nichts zu tun.

Das LCD sollte mit einem Levelshifter 3V3 <-> 5V problemlos am I2C-Bus laufen.
Boards sind noch welche da, einen 4-Kanal-Level-Shifter habe ich auch da.

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

Spielmann

Hallo Pf@nne,
alles was ich in der ESP8266_Basic.h an LCD Deklarationen einfüge, wird vom Compiler mit einem Fehler quittiert. Deswegen habe ich an allen möglichen Stellen in der ESP8266_Basic.cpp mit dem LCD herumgespielt (habe halt noch nicht die Syntax mit den Deklarationen und dem #include so ganz begriffen).
Im zip habe ich in Zeile 20,303-306 der ESP8266_Basic.cpp aus Verzweiflung die Deklarationen eingefügt (ich dachte halt die Funktion  ESP8266_Basic::start_WiFi_connections() wird im setup des Hauptsketsh aufgerufen).
In fhem habe ich folgende Definitionen zum Ansteuern (was auch funktioniert). Mit dem Notify key_echo kann ich die Tastendrücke ans LCD weitergeben, bzw. unterdrücken (beim derzeitigen Software Stand des ESP ist mir nichts eleganteres eingefallen).


defmod mqtt_LCD MQTT_DEVICE
attr mqtt_LCD IODev mqtt
attr mqtt_LCD publishSet_blight Zapfsaeule/I2C/LCD/backlight
attr mqtt_LCD publishSet_clear Zapfsaeule/I2C/LCD/clear
attr mqtt_LCD publishSet_delrow Zapfsaeule/I2C/LCD/delrow
attr mqtt_LCD publishSet_print Zapfsaeule/I2C/LCD/print
attr mqtt_LCD room MQTT
attr mqtt_LCD stateFormat print

defmod mqtt_Key MQTT_DEVICE
attr mqtt_Key IODev mqtt
attr mqtt_Key event-on-update-reading Key
attr mqtt_Key room MQTT
attr mqtt_Key stateFormat Key
attr mqtt_Key subscribeReading_Key Zapfsaeule/I2C/Keypad/Key

defmod Key_echo notify mqtt_Key:Key:.*[0-9] set mqtt_LCD print $EVTPART1
attr Key_echo room MQTT


Der Levelshifter funktioniert auch aktuell am Testaufbau. Das war nur so ein Gedanke den Levelshifter (zwecks Optik / zusätzliche Verdrahtung) einzusparen. Notfalls kommt dieser dann rein. Du bekommst eine PM.

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

Schaue ich am WE mal rein.

Als erste Idee würde ich vielleicht dein Display einfach in die Class ESP8266_Basic integrieren.

class ESP8266_Basic{

public:
  ESP8266_Basic();
  void start_WiFi_connections();
  void handle_connections();
  void cfgChange_Callback();
  void mqttBroker_Callback(char* topic, byte* payload, unsigned int length);

  bool pub(int e1, char* Payload);
  bool pub(int e1, int e2, char* Payload);
  bool pub(int e1, int e2, int e3, char* Payload);
 
  //AktSen
  void handle_Measurement();
  //Display
  LiquidCrystal_I2C lcd( LCD_ADR, LCD_CHRS, LCD_LINS );

private:


In der .ino kommst du dann mit espClient.lcd an das Display, vielleicht hilft das ja schon.

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

regenbieger

Ich habe für mich vor einiger Zeit eine Lösung gefunden, ich verwende nun DHT22,2X16 LCD mit I2C, 4X WS2812B mit FastLED, 'n bischen NTP, BH1750FVI LightSensor, 2 Kanal Relaisplatine und 1XPIR.
Bestimmt schmunzelt der ein oder andere über meine Lösung (ich tue es jeden Tag). Läuft auch nicht völlig rund. Aber mir reicht es. Also wer's brauchen kann, aber bitte nicht fragen was und wie, ist schon 3 Monate her und ich habe das schon wieder verdrängt.

mfg Regenbieger
FHEM und WEEWX auf Raspberry

Spielmann

Hallo regenbieger,
danke für dein sketch. Ich schmunzle bei deinem sketch bestimmt nicht - ich bin dankbar über solche Beispiele. Ich habe mal auf die Schnelle (auf der Arbeit) dein sketch mit dem original Template per Winmerge verglichen und interessante Ansätze gesehen um weiterzukommen.
So wie ich das sehe kopierst du dein incomming subscribe in ein string, der im class field definiert ist. Dann wird dieser string mit espClient.string im Hauptsketch verwendet.
Das könnte meine Lösung sein. Mal schauen, wie weit ich heute Abend komme.

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

Spielmann

#118
Hallo,
nach fast einem Monat fast täglichen Probieren und Testen habe ich mit Hilfe von Pf@nnes Basic Template und regenbiegers sketch es tatsächlich geschafft, meinen Arduino Mega mit configurable firmata durch einen Aufbau mit ESP8266 und mqtt zu ersetzen. Meine Hardware/sketch hat folgende Funktionen und steuert eine Diesel-Zapfsäule:
-   Kommunikation per mqtt
-   I2C LCD Display (4 x 20) ansteuerbar
-    ein iButton im 500ms Takt auslesen und gepublisht
-    Das I2C Keypad (0-9,+,#) übergibt die einzelnen Tastendrücke ohne prellen oder Verzögerung direkt an die mqtt Schnittstelle
-    Ein I2C LCD bildet die Tastendrücke ab (wobei ein ,,*" für Pinabfrage oder sichtbar für km-Stand einstellbar ist)
-    Parallel bilde ich einen String der Tastendrücke. Dieser wird bei Tastendruck "*" zur Korrekturmöglichkeit geleert (auch das LCD) und bei "#" gepublisht.
-   1Wire DS2423 Zähler angeschlossen
-   Fünf Ausgänge
-   Zwei  Eingänge (davon ein analoger Eingang)

Ich stelle hier mal meinen laienhaften sketch Anderen zur Verfügung - vielleicht kann der eine oder andere etwas für sich finden. Wahrscheinlich schmunzeln manche noch mehr wie bei regenbiegers sketch -  jedoch funktioniert alles zuverlässig wie gewünscht.
Jetzt stehe ich fast vor dem produktiven Einsatz. Ich werde noch einen Watchdog bzw. Fehleranzeige für die FHEM – ESP8266 Verbindung einbauen und einen DS18B20 als Temperatur-Info einbauen (falls ich es umsetzen kann).

Jetzt habe ich noch ein Problem:
Schließe ich ein DS18B20 an, wird nur noch die ID des DS18B20 am 1-Wire Bus gefunden. Ein angelegter iButton (ID "01") wird nicht mehr erkannt. Ab Zeile 65 in der Basic.cpp wird die ID "1d" (DS2423 Counter) und "28" (DS18B20 Temp) ausgeblendet und nicht gepublisht. Hat jemand eine Idee die iButons zu finden, wenn auch der 18B20 auf dem Bus liegt?

Gruß
Spielmann


@Marco Pf@nne: Ich habe den DS2423 bei deiner Leiterplatte hinter dem 1W-ESD-Protection-Chip angeschlossen um diesen besser vor ESD Events am IButton Reader zu schützen. 
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,

freut mich, dass es läuft!
Wenn du zeitkritische I2C-Geräte angeschlossen hast, wie z.B. dein Keypad,
dann würde ich möglichst auf 1W verzichten.
1W ist ziemlich langsam und "blockiert" dir während des Auslesen den Controller.
Nimm doch für Temperaturmessung lieber einen I2C-Chip.
Auch der Zähler könnte doch über I2C laufen.
Hängt natürlich auch von der Länge des Buses ab.

Ist denn ein iButton ein reiner "echter" 1W-Device?
Werden denn mehrere DS18B20 richtig erkannt?

Der Anschluss hinter dem ESD-Chip ist natürlich richtig, dafür ist er ja da.
Auf dem Board stehen ja genügend 1W-Anschlüsse zur Verfügung.

Gruß
Pf@nne

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