ESP8266 flashen? (Gasverbrauchszähler)

Der chaotische Hauptfaden

Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese

Antworten
Benutzeravatar
Hansele
Beiträge: 3726
Registriert: So 11. Aug 2013, 15:15
Wohnort: Bw
Kontaktdaten:

ESP8266 flashen? (Gasverbrauchszähler)

Beitrag von Hansele »

Hi zusammen,

ich würde gerne das hier nachstricken und habe auch alle Teile zusammen,
ging flott ist ja Bauteil technisch überschaubar.

https://blog.gwarg.de/2021/12/22/gaszae ... -per-mqtt/

Nur leider bin ich erst daran gescheitert die fehlenden Bibliotheken in die Arduino IDE zu bekommen,
dass habe ich jetzt geschafft, dass ich alle doppelt habe.

Code: Alles auswählen

#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <InfluxDbClient.h>

#include <NTPClient.h>
#include <WiFiUdp.h> 

#include <ESP8266WebServer.h>

#include <time.h>

// #############################################
// WLAN-Zugang
// #############################################
#define wifi_ssid "WLAN-SSID"
#define wifi_password "WLAN-PW

// #############################################
// MQTT-Server (Openhab)
// #############################################
#define mqtt_server "192.168.2.17"
#define mqtt_user "openhabian"
#define mqtt_password ""

// #############################################
// InfluxDB-Server und DB-Name
// #############################################
#define INFLUXDB_URL "http://192.168.2.18:8086"
#define INFLUXDB_DB_NAME "gaszaehler"

// #############################################
// NTP-Client
// #############################################
#define MY_NTP_SERVER "192.168.2.1"           
#define MY_TZ "CET-1CEST,M3.5.0/02,M10.5.0/03"   

time_t now;
tm tm;
String TimeStamp;

ESP8266WebServer server(80);
String htmltext;

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

int Analog_Eingang = A0; // Analogwert
int Digital_Eingang = 5; // Binärer Wert

int analog_temp = 0;
int digital_temp = 0;
float diff = 0.5;
int daily_count_gas = 0;

void setup ()
{
  pinMode (Analog_Eingang, INPUT);
  pinMode (Digital_Eingang, INPUT);
       
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  
  configTime(MY_TZ, MY_NTP_SERVER);
  
  server.on("/", handle_OnData);
  server.on("/f.css", handleCss);
  server.onNotFound(handle_NotFound);
  server.begin();
  
  Serial.println("HTTP server started");
}
  
void loop ()
{
  if (!client.connected()) {
    reconnect();
  }

  server.handleClient();

  float Analog;
  int Digital;
    
  //Aktuelle Werte werden ausgelesen, auf den Spannungswert konvertiert...
  Analog = analogRead (Analog_Eingang) * (5.0 / 1023.0); 
  Digital = digitalRead (Digital_Eingang);
    
  // Single InfluxDB instance
  InfluxDBClient influx_client(INFLUXDB_URL, INFLUXDB_DB_NAME);
  // Define data point with measurement name 'device_status`
  Point pointDevice("gaszaehler");
  // Add data
  pointDevice.addField("Analog", Analog);
  pointDevice.addField("Digital", Digital);

  // Write data
  if (checkBound(analog_temp, Analog, diff)) {
    analog_temp = Analog;
    influx_client.writePoint(pointDevice);
    client.publish("gas/analog", String(Analog).c_str(), true);
    client.publish("gas/digital", String(Digital).c_str(), true);
    client.publish("gas/tagesstand", String(Digital).c_str(), true);

    //... und an dieser Stelle ausgegeben
    Serial.print ("Analoger Spannungswert:"); Serial.print (Analog, 4);  Serial.print ("V, ");
    Serial.print ("Grenzwert:");
    
    if(Digital==1) {
        Serial.println (" erreicht");
        daily_count_gas++;
    } else {
        Serial.println (" noch nicht erreicht");
    }
  }

  time(&now);                       // read the current time
  localtime_r(&now, &tm);           // update the structure tm with the current time
/*  
  Serial.print("year:");
  Serial.print(tm.tm_year + 1900);  // years since 1900
  Serial.print("\tmonth:");
  Serial.print(tm.tm_mon + 1);      // January = 0 (!)
  Serial.print("\tday:");
  Serial.print(tm.tm_mday);         // day of month
  Serial.print("\thour:");
  Serial.print(tm.tm_hour);         // hours since midnight  0-23
  Serial.print("\tmin:");
  Serial.print(tm.tm_min);          // minutes after the hour  0-59
  Serial.print("\tsec:");
  Serial.print(tm.tm_sec);          // seconds after the minute  0-61*
  Serial.print("\twday");
  Serial.print(tm.tm_wday);         // days since Sunday 0-6
  if (tm.tm_isdst == 1)             // Daylight Saving Time flag
    Serial.print("\tDST");
  else
    Serial.print("\tstandard");
  Serial.println();
*/

  // Um Null Uhr den Zähler wieder zurück setzen!
  if (tm.tm_hour == 0 && tm.tm_min == 0 && tm.tm_sec == 0) {
    daily_count_gas = 0;
  }
  TimeStamp = String(tm.tm_mday) + "." + String(tm.tm_mon + 1) + "." + String(tm.tm_year + 1900) + " " + String(tm.tm_hour) + ":" + String(tm.tm_min) + ":" + String(tm.tm_sec);
  
  htmltext = "";
  htmltext += "<h2>Uhrzeit</h2>"; 
  htmltext += "<p><b>" + String(TimeStamp) + "</b></p>";
  htmltext += "<h2>Werte</h2>"; 
  htmltext += "<p>Analog: <b>" + String(Analog) + " V</b></p>";
  htmltext += "<p>Digital: <b>" + String(Digital) + "</b></p>";
  htmltext += "<h2>Zähler</h2>"; 
  htmltext += "<p>heute: <b>" + String(daily_count_gas * 0.01) + "m³</b></p>";
  
  delay (200);
}

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

  WiFi.begin(wifi_ssid, wifi_password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.print(WiFi.localIP());
}

bool checkBound(float newValue, float prevValue, float maxDiff) {
  return !isnan(newValue) &&
  (newValue < prevValue - maxDiff || newValue > prevValue + maxDiff);
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str(), mqtt_user, mqtt_password)) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("outTopic", "ESP01 alive");
      // ... 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);
      }
   }
}

void handle_OnData() {
  server.send(200, "text/html", SendHTML(htmltext)); 
}
void handle_OnConnect() {
  server.send(200, "text/html", SendHTML("Boot")); 
}

void handle_NotFound(){
  server.send(404, "text/plain", "Not found");
}

String SendHTML(String addtext){
  String ptr = "";
  ptr += "<!DOCTYPE html PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>\n";
  ptr += "<html lang='de'>\n";
  ptr += "<head>\n";
  ptr += "<title>Gaszaehler Webserver</title>\n";
  ptr += "<link rel='stylesheet' type='text/css' href='/f.css'>\n";
  ptr += "<meta content='text/html; charset=UTF-8' http-equiv='content-type'>\n";
  ptr += "</head>\n";
  ptr += "<body>\n";
  ptr += "<h1>Gaszaehler Webserver</h1>\n";
  ptr += addtext;
  ptr += "</body>\n";
  ptr += "</html>";
  
  return ptr;
}

void handleCss()
{
  String message = "";
  message += "*{font-family:sans-serif}\n";
  message += "body{margin:10px;width:300px}\n";
  message += "h1, h2{color:white;background:#8FCE00;text-align:center}\n";
  message += "h1{font-size:1.2em;margin:1px;padding:5px}\n";
  message += "h2{font-size:1.0em}\n";
  message += "h3{font-size:0.9em}\n";
  message += "a{text-decoration:none;color:dimgray;text-align:center}\n";
  message += ".small{font-size:0.6em}\n";
  message += ".value{font-size:1.8em;text-align:center;line-height:50%}\n";
  message += "footer p, .infodaten p{font-size:0.7em;color:dimgray;background:silver;";
  message += "text-align:center;margin-bottom:5px}\n";
  message += "nav{background-color:silver;margin:1px;padding:5px;font-size:0.8em}\n";
  message += "nav a{color:white;padding:10px;text-decoration:none}\n";
  message += "nav a:hover{text-decoration:underline}\n";
  message += "nav p{margin:0px;padding:0px}\n";
  message += ".btn{background-color:#C0C0C0;color:dimgray;text-decoration:none;";
  message += "border-style:solid;border-color:dimgray}\n";
  message += ".on, .off{margin-top:0;margin-bottom:0.2em;margin-left:3em;";
  message += "font-size:1.4em;background-color:#C0C0C0;";
  message += "border-style:solid;width:5em;height:1.5em;text-decoration:none;text-align:center}\n";
  message += ".on{border-color:green}\n)";
  server.send(200, "text/css", message);
}
Nun bricht das Kompilieren immer ab mit dieser Fehlermeldung:

Code: Alles auswählen

c:\Users\pasca\Documents\Arduino\libraries\ESP8266HTTPClient\src\ESP8266HTTPClient.cpp: In member function 'bool HTTPClient::begin(WiFiClient&, const String&)':
c:\Users\pasca\Documents\Arduino\libraries\ESP8266HTTPClient\src\ESP8266HTTPClient.cpp:88:22: error: 'class WiFiClient' has no member named 'clone'
   88 |     _client = client.clone();
      |                      ^~~~~
c:\Users\pasca\Documents\Arduino\libraries\ESP8266HTTPClient\src\ESP8266HTTPClient.cpp: In member function 'bool HTTPClient::begin(WiFiClient&, const String&, uint16_t, const String&, bool)':
c:\Users\pasca\Documents\Arduino\libraries\ESP8266HTTPClient\src\ESP8266HTTPClient.cpp:111:22: error: 'class WiFiClient' has no member named 'clone'
  111 |     _client = client.clone();
      |                      ^~~~~
Mehrere Bibliotheken wurden für "ESP8266HTTPClient.h" gefunden
  Benutzt: C:\Users\pasca\Documents\Arduino\libraries\ESP8266HTTPClient
  Nicht benutzt: C:\Users\pasca\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\libraries\ESP8266HTTPClient
exit status 1
Nun wollte ich euch mal fragen, ob ggf. einer von euch das mal in eine unversaute Arduino IDE werfen kann,
um zu sehen ob ihr mit dem Kompilieren durchkommt?

Falls ja müsste ich nur (wie?) die Arduino IDE komplett inklusive aller Files (einfach den Order in Dokumente löschen) neu aufsetzen?


Der verwendete Controller ist ein: AZDelivery D1 Mini NodeMcu mit ESP8266-12F WLAN.
Anse
Beiträge: 2278
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: ESP8266 flashen? (Gasverbrauchszähler)

Beitrag von Anse »

Könntest du bitte noch reinschreiben welche Bibliotheken du geladen hast?
Benutzeravatar
Marsupilami72
Beiträge: 2857
Registriert: Mo 4. Nov 2013, 23:48
Wohnort: mittendrin

Re: ESP8266 flashen? (Gasverbrauchszähler)

Beitrag von Marsupilami72 »

Naja, die Meldung besagt ja, dass ihm in der ESP8266HTTPClient Bibliothek eine Methode (.clone) fehlt.

Und da die Bibliothek offensichtlich doppelt installiert ist, würde ich als erstes mal BEIDE runterschmeißen und eine neu installieren...

P.S.: und kann mir mal jemand erklären, wofür man bei dem Reed-Relais den Komparator braucht? Reicht da nicht das nackte Relais?
nux
Beiträge: 83
Registriert: So 31. Jul 2016, 12:53

Re: ESP8266 flashen? (Gasverbrauchszähler)

Beitrag von nux »

Bei mir hats durchgebaut mit Arduino 2.0.0rc3 nachdem ich die fehlenden Libs (Influx, NTP, ...) installiert habe und die Anführungszeichen in Zeile 19 ergänzt wurden.

Gruß nux.
Benutzeravatar
phettsack
Beiträge: 1186
Registriert: Mo 12. Aug 2013, 18:17

Re: ESP8266 flashen? (Gasverbrauchszähler)

Beitrag von phettsack »

Ich bin ja echt kein Programmierer, aber hier würde ich den reedPin auf einen Interrupt legen:
attachInterrupt(digitalPinToInterrupt(GPIO)
https://randomnerdtutorials.com/interru ... e-nodemcu/

Ich würde es auf eine fallende Flanke legen, es kann durchaus vorkommen dass der Balg innendrin verharrt weil kein Gas gezogen wird. Hab irgendwo noch ein eigenes Programm, kann ich bei Gelegenheit raussuchen wenn gewünscht.
Benutzeravatar
Hansele
Beiträge: 3726
Registriert: So 11. Aug 2013, 15:15
Wohnort: Bw
Kontaktdaten:

Re: ESP8266 flashen? (Gasverbrauchszähler)

Beitrag von Hansele »

Anse hat geschrieben: So 6. Nov 2022, 23:01 Könntest du bitte noch reinschreiben welche Bibliotheken du geladen hast?
Ich sags mal so, bis ich geschnallt habe ich ich die ESP8266 Source einfach installieren konnte,
habe ich Stück für Stück einfach drauf los installiert und mich fast schon gefreut,
wenn das kompilieren nicht direkt fehlgeschlagen ist.

Ich habe zwar die xxxx.h gegoogelt aber oftmals auch nicht direkt die richtige Bibliothek gefunden,
gibt es da einen Trick wie man sich sicher sein kann, das man die richtige erwischt?
Marsupilami72 hat geschrieben: Mo 7. Nov 2022, 11:20 Naja, die Meldung besagt ja, dass ihm in der ESP8266HTTPClient Bibliothek eine Methode (.clone) fehlt.

Und da die Bibliothek offensichtlich doppelt installiert ist, würde ich als erstes mal BEIDE runterschmeißen und eine neu installieren...

P.S.: und kann mir mal jemand erklären, wofür man bei dem Reed-Relais den Komparator braucht? Reicht da nicht das nackte Relais?
Danke (Kopf Tisch), ich habe die von mir manuelle Bibliothek gelöscht und jetzt hat er die Version gebaut :-).
phettsack hat geschrieben: Mo 7. Nov 2022, 20:26 Ich bin ja echt kein Programmierer, aber hier würde ich den reedPin auf einen Interrupt legen:
attachInterrupt(digitalPinToInterrupt(GPIO)
https://randomnerdtutorials.com/interru ... e-nodemcu/

Ich würde es auf eine fallende Flanke legen, es kann durchaus vorkommen dass der Balg innendrin verharrt weil kein Gas gezogen wird. Hab irgendwo noch ein eigenes Programm, kann ich bei Gelegenheit raussuchen wenn gewünscht.
Werde ich mal nachlesen, ich bin nicht mal ansatzweise ein Programmierer,
aber Stück für Stück findet man sich doch irgendwie rein.

Das Programm wäre sicher auch interessant, würde ich gerne mal sehen :-)



In Summe ist das Projekt das ich jetzt mal ins Auge gefasst habe, bestimmt nicht das beste,
soll aber erstmal auch nur der Einstieg sein in die Messerei.

Danke und Gruß
Pascal
Benutzeravatar
phettsack
Beiträge: 1186
Registriert: Mo 12. Aug 2013, 18:17

Re: ESP8266 flashen? (Gasverbrauchszähler)

Beitrag von phettsack »

Hansele hat geschrieben: Mo 7. Nov 2022, 21:11
Das Programm wäre sicher auch interessant, würde ich gerne mal sehen :-)

Danke und Gruß
Pascal

Hier mal die wesentlichen Auszüge:

Code: Alles auswählen

# GPIO12/D6 als PIR benamen (da ist ein Bewegungsmelder dran)
#define PIR  D6   // GPIO 12   Bewegungsmelder
.
.
.
IRAM_ATTR void setpirstate() {
  Serial.println("IRQ");
  client.publish("stat/windowstatus/PIR","1");
}

void setup() {
  Serialinit();
  delay(250);
    pinMode(PIR, INPUT_PULLUP);  // PIR
   attachInterrupt(digitalPinToInterrupt(PIR), setpirstate, RISING);
} 
Vielleicht hilft das ein wenig. Jetzt beim eintragen hier fällt mir auf, der MQTT-windowstatus wird nie wieder 0. Glücklicherweise werte ich das nirgends aus :-)
Die Deklaration mit dem IRAM_ATTR hat irgendwas mit der Speicherverwaltung des ESP zu tun.

Im setup legt man über den attachInterrupt() fest welche Subroutine aufgerufen werden soll, in meinem Fall setpirstate. Und dadrin steht was passieren soll. Also nicht zu lange Programmlaufzeiten da drin. Aber das sehe ich bei meinem PIR und deinem Gaszähler als unkritisch an.
Benutzeravatar
licht_tim
Beiträge: 1472
Registriert: Fr 28. Jun 2013, 09:40
Wohnort: Ganderkesee

Re: ESP8266 flashen? (Gasverbrauchszähler)

Beitrag von licht_tim »

Ich spiele auch gerade mit den esp8266 rum. Zur Zeit nur zur Erfassung von Messwerten, Temperaturen und Luftfeuchtigkeit. Am Gaszähler bin ich auch dran. Da lasse ich den ESP gerade eine Stunde Pulse zählen und denn verschicken. Ich nutze espeasy. Fertigen Code flashen und alles weitere bequem per Weboberfläche. Home assistant stellt die Werte dann da. Mancher wird über ",klicki bunti" schimpfen, ich find's super nicht in Codezeilen planlos rumzumurksen.
nux
Beiträge: 83
Registriert: So 31. Jul 2016, 12:53

Re: ESP8266 flashen? (Gasverbrauchszähler)

Beitrag von nux »

Sobald ein MQTT Broker im Spiel ist könntet ihr sicher auch mit Tasmota ziemlich glücklich werden. Da kann man eigentlich (fast) alles dran betrieben.

Gruß nux.
cosote
Beiträge: 3
Registriert: Do 10. Nov 2022, 18:38

Re: ESP8266 flashen? (Gasverbrauchszähler)

Beitrag von cosote »

Hallo,

ich bin auch beim ESP8266 (D1-Mini) gelandet, aber ganz ohne IDE - nur mit ESPHome in Home Assistant.
Den Quellcode ändere ich direkt in github online, und compilieren und flashen geht dann direkt in ESPHome OTA.
Nutze es um den JKBMS in meinem PV-Projekt auszulesen.
Kann ich nur empfehlen.

LG - Cosote.
Antworten