esp32-Gaszähler / docker / mqtt / telegraf / InfluxDB & Grafana

Hallo!

Ich muß vorwegschicken ich habe Null-Plan oder sonst irgendwelche Kenntnisse und lange mit mir gehadert überhaupt mal irgendwo mein Problem (Projekt) Frage einzustellen!

Ich habe eine Mini PV-Anlage und habe erfolgreich das open DTU von Helmut Karger für mich umgesetzt.
https://blog.helmutkarger.de/balkonkraftwerk-teil-8-opendtu-und-ahoydtu-fuer-hoymiles-wechselrichter/

Dabei bin ich immer wieder darauf gestoßen das sehr viele auch ihre Wasseruhr / Stromzähler oder Gaszähler tracken und sehr oft ist das Wort “ganz Einfach” bei mir hängen geblieben.

Ebenso bei dem Projekt open DTU das telegraf sich sehr gut eignet für spätere Datenaufbereitung, da die Daten mit einem Zeitstempel versehen werden.

Das war mein Grund meinen Gaszähler (ist übrings einer ohne Reedkontakt / metallisches Plättchen was sich dreht) mit LJ12 A3-4-Z/BX Näherungssenso der an einem ESP32 NodeMCU Module WLAN WiFi Dev Kit mit CP2102 angeschloßen ist und über den 5V PIN versorgt wird.

Die Impulse werden angezeigt und auch bei MQTT-Brocker übermittelt.

Hier hänge ich nun seit einigen Monaten fest und es gibt im Internet für mich nicht direkt offensichtlich nichts mehr was ich “klauen” kann bzw. kopieren / einfügen und auf mich anpassen kann. Denn nur dadurch bin ich bisher so weit gekommen wie ich zur Zeit bin!

Mein Bauchgefühl sagt mir das es nicht mehr viel sein muß, wenn man Ahnung und Kenntnis hat.

Ich möchte die Kubikmeter Gas erfassen und dazu müßten die Impulse auf einen Anfangswert addiert werden. Ich weis auch das man dazu den Wert ohne Komma eingibt und zählen läßt und sehr viele haben auch Umrechnungen auf Kubikmeter / Kosten / Tagesverbräuche etc. usw.

Aber leider für mich über espHome / io-Brocker / Home Assistent etc. realisiert, wo ich für mich nicht direkt was herausklauen kann.

Ich habe ein Synology NAS 24/7 laufen, wo auch im docker eben die open DTU mit mqtt / telegraf / InfluxDB / Grafana läuft.

Nun zu meiner eigentlichen Frage, hat bisher kein weiterer die Idee gehabt es über ein NAS-Laufwerk zu machen?

Funktioniert so etwas nicht? Dann aber stellt sich mir die Frage wieso habe ich einen Wert in MQTT-Brocker ?

Wie mache ich nun weiter?

#include <WiFi.h>
#include <WebServer.h>
#include <PubSubClient.h>

// WiFi
const char *ssid = “Name”; // Enter your Wi-Fi name
const char *password = “Code”;  // Enter Wi-Fi password

// MQTT Broker
const char *mqtt_broker = "192.xxx.yyy.zzz";
const char *topic = "docker/Gas/gaszaehler";
const char *mqtt_username = "";
const char *mqtt_password = "";
const int mqtt_port = 1883;

WiFiClient espClient;
PubSubClient client(espClient);

int SchalterInduktiv=13;
int SchalterInduktivStatus=0;
int zaehlerstand = 1851894;
int currday = -1;
int yesterday = -1;
int todayusage[24] = {0};
int yesterdayusage[24] = {0};

char* msg = "";
char* msg_old = "start";

//Week Days
String weekDays[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

//Month names
String months[12] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};

WebServer server(80);

void setup() 
{
    // Set software serial baud to 115200;
    Serial.begin(115200);
    // Connecting to a WiFi network
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.println("Connecting to WiFi..");
    }
    Serial.println("Connected to the Wi-Fi network"); //connecting to a mqtt broker
    client.setServer(mqtt_broker, mqtt_port);
    client.setCallback(callback);
    while (!client.connected()) {
        String client_id = "gaszaehler";
        client_id += String(WiFi.macAddress());
        Serial.printf("The client %s connects to the public MQTT broker\n", client_id.c_str());
        if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
            Serial.println("Public EMQX MQTT broker connected");
        } else {
            Serial.print("failed with state ");
            Serial.print(client.state());
            delay(2000);
        }
      pinMode(SchalterInduktiv, INPUT);
    }
    // Publish and subscribe
    client.publish(topic, "Hi, I'm ESP32 wobi Gaszaehler");
    client.subscribe(topic);
}

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

void loop() {
  Zustand_lesen();
  client.loop();
}

void Zustand_lesen() {
  if (digitalRead(SchalterInduktiv))
      {
        msg = "1";
      }
      else
      {
        msg = "0";
      }
      if (msg_old != msg) {
        client.publish("docker/Gas/Gaszaehler/Impuls", msg);
        msg_old = msg;
      }
}


Evtl. kannst du dir doch etwas bei Fips abschauen.
Da gibt es einen "Gaszähler" für den ESP8266, das sollte aber nach Anpassung auch für den ESP32 klappen.

Danke für den Tip!
Ganz unbekannt ist es mir nicht. Vor einigen Wochen habe ich mich bereits damit schon einmal Versucht🤓
Aber für einen der keine Ahnung hat sind die Unterschiede zwischen dem Flashen von ESP8266 und ESP32 doch zu groß.
Ich habe es nicht hinbekommen und nach einigen Tagen drangegeben.
Vielleicht muß ich es nochmal neu angehen und intensiver betrachten🤔

Da für die Anwendung keine zusätzlich, spezielle Library benötigt wird, sollte doch der Sketch für den ESP32 anzupassen sein.

Von dem, was Du in #1 schreibst, verstehe ich leider nur einen Bruchteil. Aber beim Anpassen an den ESP32 kann ich helfen.

ESP_Gaszaehler.ino
// ****************************************************************
// Sketch Gaszähler Modular(Tab)
// created: Jens Fleischer, 2018-03-30
// last mod: Jens Fleischer, 2023-02-12
// For more information visit: https://fipsok.de
// ****************************************************************
// Hardware: ESP32
// GPIO32  Anschluss Reedrelais vom GPIO32 auf GND
// Software: ESP32 Arduino Core 2.0.6
/******************************************************************
  Copyright (c) 2018 Jens Fleischer. All rights reserved.

  This file is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.
  This file is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.
*******************************************************************/
// Der WebServer Tab ist der Haupt Tab mit "setup" und "loop".
// #include <LittleFS.h> #include <WebServer.h> müssen im Haupttab aufgerufen werden
// Die Funktionalität des ESP32 Webservers ist erforderlich.
// Inklusive Arduino OTA-Updates (Erfordert freien Flash-Speicher )
/**************************************************************************************/

#include <zugangsdaten.h>
#include <WebServer.h>
#include <ArduinoOTA.h>
#include <LittleFS.h>

const byte inputPIN = 32;                             // Reedrelais
const byte HeartbeatLed = 13;
const byte CounterLed = 12;
unsigned long value, oldvalue;
bool ledz = HIGH, ledh = LOW;                         // Merker für ZählerLed AN/Aus , Merker für HeartbeatLed AN/Aus
unsigned long lastError;                              // Zeitpunkt des letzten Fehlers

WebServer server(80);

void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.printf("\nSketchname: %s\nBuild: %s\t\tIDE: %d.%d.%d\n\n", __FILE__, __TIMESTAMP__, ARDUINO / 10000, ARDUINO % 10000 / 100, ARDUINO % 100 / 10 ? ARDUINO % 100 : ARDUINO % 10);
  pinMode(inputPIN, INPUT_PULLUP);
  pinMode(HeartbeatLed, OUTPUT);
  pinMode(CounterLed, OUTPUT);
  digitalWrite(HeartbeatLed, HIGH);
  connectWifi();                                      // ruft die Funktion zum Verbinden mit dem Wlan auf
  webpage();                                          // ruft die Funktion zum bereitstellen einer Webseite auf
  Serial.println(LittleFS.begin() ? "LittleFS gestartet!" : "Sketch wurde mit \"FS:none\" kompilliert!\n");
  server.begin();
  Serial.println("HTTP Server gestartet!\n");
  ArduinoOTA.onStart([]() {                           // Zählerstand speichern bevor OTA Update
    save();
  });
  ArduinoOTA.begin();

  File f = LittleFS.open("/value.txt", "r");          // Zählerstand beim Neustart aus Datei lesen
  String str = f.readStringUntil('\n');
  value = str.toInt();
  oldvalue = value;
  f.close();
}

void loop() {
  static unsigned long letzterAufruf = 0;
  ArduinoOTA.handle();
  server.handleClient();
  zaehlerauslesen();  // Funktionsaufruf
  char buf[12];
  snprintf(buf, sizeof(buf), "%li.%02li", value / 100, value % 100);
  //if (!thingspeak(buf)) {
  //  lastError = millis() / 1000;
  //}
  ledh ? digitalWrite(HeartbeatLed, millis() % 500 >= 250) : digitalWrite(HeartbeatLed, HIGH);    // LED zeigt an das der Sketch läuft
  unsigned long aktuelleMillis = millis();
  if (aktuelleMillis - letzterAufruf >= 60000UL * 240 && value != oldvalue) {       // Zählerstand speichern, aller 4 Stunden, wenn der Wert sich geändert hat.
    save();
    oldvalue = value;
    letzterAufruf = aktuelleMillis;
  }
}

void zaehlerauslesen() {
  bool aktueller = 1;
  static bool vorheriger = 1;
  static unsigned long letzteMillis = 0;
  unsigned long aktuelleMillis = millis();
  if (aktuelleMillis - letzteMillis >= 1000) {        // Das Reedrelais wird einmal pro Sekunde abgefragt
    aktueller = digitalRead(inputPIN);
    if (!aktueller && aktueller != vorheriger) {
      value++;
    }
    vorheriger = aktueller;
    letzteMillis = aktuelleMillis;
  }
  !ledz ? digitalWrite(CounterLed, HIGH) : !vorheriger ? digitalWrite(CounterLed, millis() % 500 >= 250) : digitalWrite(CounterLed, HIGH);    // LED blinkt wenn Reedrelais geschlossen
}

void save() {
  File f = LittleFS.open("/value.txt", "w");
  f.printf("%li\n", value);
  f.close();
}
Connect.ino
// ****************************************************************
// Sketch Esp32 Connect Modular(Tab) mit optischer Anzeige
// created: Jens Fleischer, 2018-07-06
// last mod: Jens Fleischer, 2020-03-26
// For more information visit: https://fipsok.de
// ****************************************************************
// Hardware: Esp32
// Software: ESP32 Arduino Core 2.0.6
/******************************************************************
  Copyright (c) 2018 Jens Fleischer. All rights reserved.

  This file is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.
  This file is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.
*******************************************************************/
// Diese Version von Connect sollte als Tab eingebunden werden.
// #include <WebServer.h> muss im Haupttab aufgerufen werden
// Die Funktionalität des ESP32 Webservers ist erforderlich.
// Die Funktion "connectWifi();" muss im Setup eingebunden werden.
/**************************************************************************************/

//#define CONFIG                                // Einkommentieren wenn der ESP dem Router die IP mitteilen soll.
#define NO_SLEEP                                // Auskommentieren wenn der Nodemcu den deep sleep Modus nutzt.

const char* ssid = STA_SSID;                    // << kann bis zu 32 Zeichen haben
const char* password = STA_PASSWORD;            // << mindestens 8 Zeichen jedoch nicht länger als 64 Zeichen

#ifdef CONFIG
IPAddress staticIP(192, 168, 178, 99);          // Statische IP des NodeMCU ESP32
IPAddress gateway(192, 168, 178, 1);            // IP-Adresse des Router
IPAddress subnet(255, 255, 255, 0);             // Subnetzmaske des Netzwerkes
IPAddress dns(192, 168, 178, 1);                // DNS Server
#endif

void connectWifi() {                            // Funktionsaufruf "connectWifi();" muss im Setup eingebunden werden.
  byte i = 0;
  //WiFi.disconnect();                          // Nur erforderlich wenn Esp den AP Modus nicht verlassen will.
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
#ifdef CONFIG
  WiFi.config(staticIP, gateway, subnet, dns);
#endif
  while (WiFi.status() != WL_CONNECTED) {
    digitalWrite(HeartbeatLed, 0);
    delay(250);
    digitalWrite(HeartbeatLed, 1);
    delay(250);
    Serial.printf(" %d sek\n", ++i);
    if (i > 18) {
      Serial.print("\nVerbindung zum AP fehlgeschlagen !\n\n");
      ESP.restart();
    }
  }
  Serial.println("\nVerbunden mit: " + WiFi.SSID());
  Serial.println("ESP32 IP: " + WiFi.localIP().toString());
}
HTML.ino
// ****************************************************************
// Sketch Gaszähler Webinterface Modular(Tab)
// created: Jens Fleischer, 2018-04-08
// last mod: Jens Fleischer, 2023-02-12
// For more information visit: https://fipsok.de
// ****************************************************************
// Hardware: ESP32
// Software: ESP32 Arduino Core 2.0.6
/******************************************************************
  Copyright (c) 2018 Jens Fleischer. All rights reserved.

  This file is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.
  This file is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.
*******************************************************************/
// #include <WebServer.h> muss im Haupttab aufgerufen werden.
// Die Funktionalität des ESP32 Webservers ist erforderlich.
// Die Funktion "webpage();" muss im Setup eingebunden werden.
/**************************************************************************************/

void webpage() {
  server.on("/", handleRoot);
  server.on("/favicon.ico", handleIcon);
  server.on("/status", handleStatus);
  server.on("/ledh", []() {
    ledh = !ledh;
    handleStatus();
  });
  server.on("/ledz", []() {
    ledz = !ledz;
    handleStatus();
  });
}

void handleStatus() {
  if (server.arg(0).length() > 0 && server.arg(0).length() <= 7) {
    value = server.arg(0).toInt();
    save();                                      // Benutzer Eingabe in der Datei speichern
    Serial.printf("Zählerstand vom Client: %ld\n", value);
  }
  char buf[42];
  snprintf(buf, sizeof(buf), "[\"%05ld,%02ld9 m³\",\"%d\",\"%d\",\"%s\"]", value / 100, value % 100, ledh, ledz, errorTime().c_str());
  server.send(200, "application/json", buf);     // Zählerstand und Led Status an Html Seite senden
}

String errorTime() {                             // ermittelt die vergangene Zeit seit dem letztem Verbindungsfehler zu Thingspeak
  if (lastError > 0) {
    String Time = "";
    uint8_t mm = (millis() / 1000 - lastError) / 60 % 60;
    uint16_t hh = ((millis() / 1000 - lastError) / 60) / 60;
    if (hh > 240) lastError = 0;                 // nach 10 Tagen ohne Fehler, wird die Fehleranzeige zurückgesetzt
    if (hh < 10)Time += "0";
    Time += (String)hh + ":";
    if (mm < 10)Time += "0";
    Time += (String)mm;
    return Time;
  }
  return "0";
}

void handleRoot() {   // Html Webseite, der Zählerstand wird aller 5 Sekunden mittels fetch.api aktuallisiert
  String temp = "<!DOCTYPE HTML><html lang='de'><head><meta charset='UTF-8'><meta name='viewport' content='width=device-width, initial-scale=1'><title>Gaszähler</title><script>";
  temp += "addEventListener('load',()=>{let h=document.querySelector('#ledh'),z=document.querySelector('#ledz');let i=document.querySelector('input'),n=document.querySelector('#note');";
  temp += "document.querySelector('#grey').addEventListener('click',()=>t());z.addEventListener('click',()=>s('ledz'));h.addEventListener('click',()=>s('ledh'));i.addEventListener('blur',";
  temp += "()=>{!i.checkValidity()?(n.innerHTML=i.validationMessage,n.classList.add('note')):s('status',i.value)});function t(){let x=document.getElementById('no');getComputedStyle(x).";
  temp += "display==='none'?x.style.display='flex':x.style.display='none';n.innerHTML='';n.classList.remove('note');i.value=''}async function s(p='status',v){if(Number.isInteger(parseInt";
  temp += "(v)))t();let r=await fetch(p,{method:'POST',body:v});let j=await r.json();document.querySelector('span').innerHTML=j[0];j[1]=='0'?(h.innerHTML='LED Off',h.classList.add('off')):";
  temp += "(h.innerHTML='LED On',h.classList.remove('off'));j[2]=='0'?(z.innerHTML='LED Off',z.classList.add('off')):(z.innerHTML='LED On',z.classList.remove('off'));if(j[3]!='0') document.";
  temp += "querySelector('#err').innerHTML='Sendefehler vor '+j[3]+' hh:mm'}s(),setInterval(s,5000)});</script><style>body{background-color:tan;font-size:1.1em}body,#grey,#no,#black{display";
  temp += ":flex;flex-flow:column;align-items:center}#grey,#no{background-color:#c5c3c3;width:280px;height:150px;border:.3em solid #aeaeab;border-radius:.5em;box-shadow:5px 10px 5px #4e4d4d}";
  temp += "#grey{cursor:pointer}#black{background-color:black;width:14em;border-radius:.2em}#red{border:.28em solid red;position:relative;width:3.8em;height:1.5em;left:1.5em}span{color:white";
  temp += ";position:relative;left:.1em;letter-spacing:.2em;font-size:1.6em;font-weight:bold;top:4.55em;pointer-events:none;z-index:1}#no{display:none}.note{background-color:#fecdee;padding:";
  temp += ".3em;border-radius:.5em;position:relative;top:-5.5em}input,#err{height:30px;margin-top:1em}.button{background-color:#75a27e;height:40px;width:120px;font-size:16px;box-shadow:5px ";
  temp += "5px 5px #4e4d4d}.off{background-color:#cf848c}</style></head><body><span></span><div id='grey'><h1>Zählerstand</h1><div id='black'><div id='red'></div></div></div><div id='no'>";
  temp += "<input placeholder=' Zählerstand eingeben' pattern='[0-9]{1,7}' title='Nur 1 bis 7 Ziffern sind erlaubt' required><div id='err'>Zähler - Led - Heartbeat </div><div><button id='";
  temp += "ledz' class='button'></button><button id='ledh' class='button'></button></div></div><div id='note'></div></body></html>";
  server.send(200, "text/html", temp);
}

void handleIcon() {
  const char favicon[] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52,
                                            0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x08, 0x03, 0x00, 0x00, 0x00, 0x44, 0xA4, 0x8A,
                                            0xC6, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4D, 0x41, 0x00, 0x00, 0xB1, 0x8F, 0x0B, 0xFC, 0x61,
                                            0x05, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x26, 0x00, 0x00, 0x80,
                                            0x84, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x80, 0xE8, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA,
                                            0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, 0x17, 0x70, 0x9C, 0xBA, 0x51, 0x3C, 0x00, 0x00, 0x01,
                                            0x50, 0x50, 0x4C, 0x54, 0x45, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3,
                                            0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB5, 0xAF, 0xAF, 0xBC, 0x9F, 0x9F, 0xC0, 0x93, 0x93,
                                            0xC5, 0x87, 0x87, 0xC7, 0x83, 0x83, 0xC6, 0x86, 0x86, 0xC2, 0x8F, 0x8F, 0xBC, 0x9E, 0x9E, 0xB4,
                                            0xB2, 0xB2, 0xC9, 0x7F, 0x7F, 0xDE, 0x4F, 0x4F, 0xEE, 0x27, 0x27, 0xFD, 0x04, 0x04, 0xFF, 0x00,
                                            0x00, 0xFD, 0x05, 0x05, 0xF3, 0x1D, 0x1D, 0xE2, 0x45, 0x45, 0xCF, 0x72, 0x72, 0xBA, 0xA1, 0xA1,
                                            0xB6, 0xAB, 0xAB, 0xD5, 0x62, 0x62, 0xF5, 0x18, 0x18, 0xFE, 0x02, 0x02, 0xE9, 0x33, 0x33, 0xCC,
                                            0x77, 0x77, 0xB5, 0xAE, 0xAE, 0xC7, 0x84, 0x84, 0xF6, 0x15, 0x15, 0xCB, 0x7C, 0x7C, 0xD1, 0x6D,
                                            0x6D, 0xCD, 0x77, 0x77, 0xFE, 0x03, 0x03, 0xEF, 0x24, 0x24, 0xE1, 0x46, 0x46, 0xDB, 0x55, 0x55,
                                            0xD9, 0x5A, 0x5A, 0xDD, 0x4F, 0x4F, 0xE9, 0x34, 0x34, 0xF9, 0x0D, 0x0D, 0xC3, 0x8C, 0x8C, 0xFB,
                                            0x08, 0x08, 0xD8, 0x5B, 0x5B, 0xBA, 0xA4, 0xA4, 0xB4, 0xAF, 0xAF, 0xCA, 0x7E, 0x7E, 0xE5, 0x3C,
                                            0x3C, 0xFE, 0x04, 0x04, 0xB4, 0xB1, 0xB1, 0xF2, 0x1F, 0x1F, 0xF2, 0x20, 0x20, 0xBD, 0x9A, 0x9A,
                                            0xBF, 0x96, 0x96, 0xCC, 0x78, 0x78, 0xBA, 0xA3, 0xA3, 0xCC, 0x79, 0x79, 0xF5, 0x17, 0x17, 0xC9,
                                            0x80, 0x80, 0xE6, 0x3B, 0x3B, 0xFB, 0x09, 0x09, 0xF0, 0x22, 0x22, 0xC2, 0x90, 0x90, 0xCB, 0x79,
                                            0x79, 0xC5, 0x88, 0x88, 0xBE, 0x9A, 0x9A, 0xD0, 0x6F, 0x6F, 0xD3, 0x67, 0x67, 0xD0, 0x70, 0x70,
                                            0xC6, 0x85, 0x85, 0xC2, 0x8E, 0x8E, 0xDC, 0x53, 0x53, 0xB6, 0xAD, 0xAD, 0xFC, 0x07, 0x07, 0xDC,
                                            0x54, 0x54, 0xDD, 0x51, 0x51, 0xE8, 0x35, 0x35, 0xCA, 0x7D, 0x7D, 0xD0, 0x6E, 0x6E, 0xF6, 0x16,
                                            0x16, 0xF7, 0x14, 0x14, 0xBE, 0x98, 0x98, 0xFC, 0x08, 0x08, 0xDA, 0x56, 0x56, 0xDC, 0x52, 0x52,
                                            0xDA, 0x58, 0x58, 0xD5, 0x63, 0x63, 0xD1, 0x6B, 0x6B, 0xD7, 0x5D, 0x5D, 0xB3, 0xB2, 0xB2, 0xF8,
                                            0x12, 0x12, 0xF9, 0x0E, 0x0E, 0xF5, 0x16, 0x16, 0xDF, 0x4C, 0x4C, 0xBF, 0x98, 0x98, 0xB5, 0xAD,
                                            0xAD, 0xCE, 0x74, 0x74, 0xFA, 0x0D, 0x0D, 0xEE, 0x28, 0x28, 0xE1, 0x48, 0x48, 0xCF, 0x71, 0x71,
                                            0xBD, 0x9B, 0x9B, 0xBD, 0x9C, 0x9C, 0xC2, 0x91, 0x91, 0xC7, 0x85, 0x85, 0xC0, 0x96, 0x96, 0xB9,
                                            0xA4, 0xA4, 0xFF, 0xFF, 0xFF, 0xD7, 0xC3, 0x74, 0x75, 0x00, 0x00, 0x00, 0x05, 0x74, 0x52, 0x4E,
                                            0x53, 0xF0, 0xFC, 0xE2, 0xF2, 0xEE, 0x8D, 0xB1, 0xB7, 0x7D, 0x00, 0x00, 0x00, 0x01, 0x62, 0x4B,
                                            0x47, 0x44, 0x6F, 0x55, 0x08, 0x61, 0x81, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00,
                                            0x00, 0x03, 0x3A, 0x00, 0x00, 0x03, 0x3A, 0x01, 0x59, 0x83, 0x48, 0xD2, 0x00, 0x00, 0x00, 0x07,
                                            0x74, 0x49, 0x4D, 0x45, 0x07, 0xE7, 0x02, 0x0B, 0x07, 0x0A, 0x0B, 0x02, 0x26, 0x72, 0x7C, 0x00,
                                            0x00, 0x01, 0x29, 0x49, 0x44, 0x41, 0x54, 0x38, 0xCB, 0x63, 0x60, 0x60, 0xC5, 0x0B, 0x18, 0x19,
                                            0x48, 0x54, 0xC0, 0xC6, 0xCE, 0xC1, 0xC9, 0xC5, 0xCD, 0xC3, 0xCB, 0x87, 0x4D, 0x01, 0x1F, 0xBF,
                                            0x80, 0xA0, 0x90, 0x30, 0x04, 0x88, 0x88, 0x8A, 0x89, 0x4B, 0xA0, 0x2A, 0x90, 0x94, 0x92, 0x16,
                                            0x46, 0x05, 0x32, 0xB2, 0x72, 0xF2, 0x08, 0x05, 0x0A, 0x8A, 0xC2, 0x58, 0x80, 0x12, 0x5C, 0x81,
                                            0xB2, 0x8C, 0x30, 0x5E, 0x05, 0x2A, 0x70, 0x79, 0x55, 0x35, 0x75, 0x0D, 0x4D, 0x2D, 0x6D, 0x1D,
                                            0x54, 0x05, 0xBA, 0x30, 0xB7, 0xE9, 0xE9, 0x1B, 0x40, 0x6C, 0x34, 0x34, 0x32, 0x36, 0x41, 0x28,
                                            0x30, 0x35, 0x83, 0xCA, 0x9B, 0x5B, 0x20, 0xF9, 0xD8, 0x52, 0x16, 0xAE, 0xC0, 0x0A, 0x2A, 0x2F,
                                            0x6D, 0x8D, 0x1A, 0x48, 0x36, 0xB6, 0x76, 0x10, 0x05, 0xF6, 0x50, 0x05, 0x76, 0x38, 0x42, 0x52,
                                            0xDE, 0x01, 0x22, 0xEF, 0x88, 0x2B, 0xA8, 0x9D, 0xA0, 0x06, 0x68, 0xE2, 0x52, 0xC0, 0x0F, 0x55,
                                            0xE0, 0x0C, 0x16, 0x71, 0x91, 0x43, 0x02, 0xAE, 0x60, 0x05, 0x6E, 0x50, 0x05, 0x2E, 0x60, 0x05,
                                            0xB2, 0xC8, 0x01, 0xE5, 0x0E, 0x56, 0xE0, 0x01, 0xE5, 0x79, 0xE2, 0x52, 0x00, 0xB3, 0x42, 0x0E,
                                            0x97, 0x02, 0x2F, 0x28, 0xCF, 0x1B, 0x97, 0x02, 0x1F, 0x5F, 0x08, 0xCF, 0x0C, 0xAC, 0xC0, 0xCD,
                                            0x0F, 0x08, 0xFC, 0x51, 0x14, 0xB0, 0x06, 0x40, 0xB9, 0x81, 0x70, 0xCF, 0xF9, 0xA0, 0x2A, 0x08,
                                            0x82, 0x72, 0x83, 0x25, 0x70, 0x28, 0x90, 0x0F, 0x81, 0x45, 0x56, 0x28, 0x76, 0x05, 0xAC, 0x4A,
                                            0x30, 0x47, 0x85, 0x85, 0xB3, 0x63, 0x55, 0xC0, 0x1A, 0x81, 0x48, 0x88, 0x66, 0x62, 0x91, 0x51,
                                            0xD1, 0x31, 0xE8, 0x0A, 0x62, 0x05, 0xB0, 0xA6, 0x38, 0x84, 0x02, 0x56, 0x56, 0xFE, 0x38, 0x02,
                                            0x0A, 0x58, 0x0D, 0xBC, 0xE3, 0xD1, 0xA5, 0x13, 0x12, 0x93, 0x50, 0x32, 0x4E, 0x72, 0x8A, 0xBA,
                                            0x19, 0x2C, 0xF1, 0xA6, 0xA6, 0xA5, 0x67, 0x64, 0x62, 0xCB, 0x7A, 0x3E, 0x59, 0xD9, 0x39, 0x5C,
                                            0xBA, 0xB9, 0x79, 0xA4, 0x64, 0x5E, 0x26, 0x66, 0xBC, 0x80, 0x05, 0x00, 0x60, 0x24, 0x46, 0xAE,
                                            0xA3, 0x6F, 0x16, 0xCA, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65,
                                            0x3A, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x32, 0x33, 0x2D, 0x30, 0x32, 0x2D,
                                            0x31, 0x31, 0x54, 0x30, 0x37, 0x3A, 0x31, 0x30, 0x3A, 0x31, 0x31, 0x2B, 0x30, 0x30, 0x3A, 0x30,
                                            0x30, 0xBE, 0xBE, 0x45, 0x23, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74,
                                            0x65, 0x3A, 0x6D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x00, 0x32, 0x30, 0x32, 0x33, 0x2D, 0x30, 0x32,
                                            0x2D, 0x31, 0x31, 0x54, 0x30, 0x37, 0x3A, 0x31, 0x30, 0x3A, 0x31, 0x31, 0x2B, 0x30, 0x30, 0x3A,
                                            0x30, 0x30, 0xCF, 0xE3, 0xFD, 0x9F, 0x00, 0x00, 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6F,
                                            0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2E, 0x69, 0x6E, 0x6B, 0x73, 0x63,
                                            0x61, 0x70, 0x65, 0x2E, 0x6F, 0x72, 0x67, 0x9B, 0xEE, 0x3C, 0x1A, 0x00, 0x00, 0x00, 0x57, 0x7A,
                                            0x54, 0x58, 0x74, 0x52, 0x61, 0x77, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x20, 0x74,
                                            0x79, 0x70, 0x65, 0x20, 0x69, 0x70, 0x74, 0x63, 0x00, 0x00, 0x78, 0x9C, 0xE3, 0xF2, 0x0C, 0x08,
                                            0x71, 0x56, 0x28, 0x28, 0xCA, 0x4F, 0xCB, 0xCC, 0x49, 0xE5, 0x52, 0x00, 0x03, 0x23, 0x0B, 0x2E,
                                            0x63, 0x0B, 0x13, 0x23, 0x13, 0x4B, 0x93, 0x14, 0x03, 0x13, 0x20, 0x44, 0x80, 0x34, 0xC3, 0x64,
                                            0x03, 0x23, 0xB3, 0x54, 0x20, 0xCB, 0xD8, 0xD4, 0xC8, 0xC4, 0xCC, 0xC4, 0x1C, 0xC4, 0x07, 0xCB,
                                            0x80, 0x48, 0xA0, 0x4A, 0x2E, 0x00, 0xEA, 0x17, 0x11, 0x74, 0xF2, 0x42, 0x35, 0x95, 0x00, 0x00,
                                            0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82
                                           };
  server.send(200, "image/x-icon", favicon);     // Icon an den Browser senden
}

Der Compiler ist glücklich, ob auch Daten gezählt werden, habe ich nicht geprüft. Die HTML-Seite wird angezeigt und läßt sich ausklappen:

ToDo:

  • HTML-Seite im Dateisystem speichern
  • favicon.inoico im Dateisystem speichern

Möchtest Du mit den Tabs von Fips weitermachen?

Was wäre eine sinnvolle Impulszahl zum Simulieren eines Zählers?

1 m³ Erdgas H hat ca. 11KWh
Nen Gasherd merkst nicht.

Und: In den Zählern wird die 3te Stelle nach dem Komma nicht gezählt. Das Magnet befindet sich so, das immer bei 0 auf der dritten Stelle ein Auslöser kommt.

Sollte nicht ico sein :thinking:

In #5 favicon.ino geändert in favicon.ico.

Danke :slightly_smiling_face:

Geht dann auch ein Hallsensor zum Probieren?

Ich bin es heute morgen nochmal angegangen.
Die ersten Fehler belaufen sich auf HeartbeatLed und CounterLed diese habe ich einfach mal mit // auskommentiert.

Danach kommen diese Meldungen🤔

Im NAS steckt bestimmt auch nur ein kleiner getarnter Raspberry mit Linux drin :grin: und wenn du da dran kommst und was installieren kannst (und das hast du ja offensichtlich schon) wüsste ich nicht warum es nicht klappen sollte.

Das ist denke ich optional bzw nice-to-have.

Ich verstehe deinen workflow so

  • der esp liest die impulse aus und berechnet m3
  • esp schickt die daten per mqtt an den broker
  • telegraf (was ich noch nicht kannte, aber sich gut/sinnvoll anhört für diesen zweck) subscribed auf das gaszähler topic und schiebt die daten in die influxDB
  • grafana holt sich die daten aus der DB und stellt sie dar
  • optional in grafana kannst du dir dein dashboard so basteln das die m3 noch in kWh, momentanverbrauch (annähernd) oder was auch immer umgerechnet werden

:+1:richtig!
So sollte der workflow sein bzw. so läuft es mit meiner Mini-Solaranlage.

Wurde hier schon oft gesagt keine D Nr. nimm GPIO Nr
D4 =2
Und Fehler Meldung auch in CodeTag

D4 durch 2 ersetzt und was bei CounterLED?

Benötige ich die LED-configs wirklich zum zählen von Impulsen?

Das ist natürlich löblich, aber hast Du meine compilierfähige Lösung in #5 gesehen?

Ich speichere übrigens die Meßwerte meines Stromzählers in eine csv-Datei im Dateisystem des ESP32 und kopiere sie wöchentlich auf eine Festplatte, die per USB an meiner Fritzbox hängt.

Wegen der nutzbaren Pins: ESP32 Pinout Reference: Which GPIO pins should you use?

Weil sich auf der rechten Seite viele Schnittstellen (UART, I²C, SPI) tummeln, nutze ich für Eingänge und LEDs eher die linke Seite. Dabei GPIO13 einfach als 13 verwenden, ohne D oder sowas davor.


Wenn Du in der IDE beispielsweise "WEMOS D1 MINI ESP32" auswählst, kannst Du auch die Pinbezeichnungen mit D verwenden:

Dieser ESP ist schön klein und eignet sich gut zum Einlöten in fertige Projekte, trotzdem verwende ich nur die Zahlen.

Warum nutzt du weiterhin die D Bezeichnung?
Und noch mall unten in der IDE steht doch "Fehlermeldungen kopieren" warum nutzt du das nicht ?

... compilierfähige Lösung in #5 gesehen?

sorry aber ich habe noch nicht mal einen Plan was mit #5 gemeint ist???

Den GPIO13 habe ich schon mitbekommen und selber in 13 geändert. Da genau da hängt auch mein Sensor

Hier dein ESP32

Fehlermeldung kopieren habe ich auch keinen Plan von bzw. dadurch bekomme ich den Fehler korrigiert?

Damit ist der hier gemachte Post #5 gemeint.
Die passende Nummerierung findest du immer oben, rechts des betreffenden Post.

in dem du die D löscht bei deinem Modul D ist gleich GPIO

Indem du danach SRTG + C benutzt