Gaszähler an Openhab (per MQTT)

Ich möchte meinen Gaszähler, der über einen Magnetkontakt verfügt, der pro 0,01m³ einen Impuls ausgeben kann, gerne auslesen, speichern und darstellen.

Die Daten sollen per MQTT an openHAB und an eine influx-db geschickt werden.

Das passiert wieder mit einem ESP8266 den ich ja gerne für sows verwende. Auslesen kann ich diesen Magnetkontakt per Reed-Sensor der an den ESP angeschlossen wird. Ich musste ein bisschen fummeln um die richtige Position zu finden (sieht man hier vielleicht auch ein bisschen :)). Das ist bei meinem Zähler (siehe Foto) ganz rechts mit dem Reed-Kontakt nach unten gerichtet. Auf dem Bild kommt der Magnet gerade am Sensor vorbei (bei mir ca. zwischen 8 und 9).

Testaufbau ohne Gehäuse

Material

ESP8266-12F * Affiliatelink

Jumper-Kabel * Affiliatelink

KY-025 Reed-Schalter * Affiliatelink

Pinning

Code

#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);
}

Webserver

Zusätzlich zum senden per MQTT und in die Influx-DB gibts auch einen Webserver der die m³ pro Tag anzeigt und den aktuellen Wert. Das ist für die Einrichtung ganz nett, aber eigentlich nicht notwendig, da der Sensor ja eine Anzeige hat.

Wie immer ist der Code sehr grottig und viel zu viel. Wenn man nur die einfache Funktion braucht um einen MQTT-Status zu versenden ist viel weniger notwendig. Aber das hier ist ja auch ein Blog als mein Notizzettel 🙂

Quellen

https://sensorkit.joy-it.net/de/sensors/ky-025

36 Kommentare

  • Hi Simon,
    erstmal danke das Du Deine Arbeit hier mit anderen teilst.
    Ich bin noch ein Newbie was Arduino angeht, fast alle meine Geräte laufen mit Tasmota Software und ein paar mit ZigBee, das ganze habe ich dann in openHab eingebunden.
    Ich habe Deinen Sketch auf auf einen NodeMCU geschrieben, Web-Server, MQTT, Influx-DB läuft alles.
    Es wird bei der leider der Verbrauch nicht hochgezählt, der Reed- Kontakt (KY-025) liegt noch bei mir auf dem Tisch und gebe ihm die Impulse per Hand mit einem Magneten.
    Auf meinem Zähler steht auch 1 imp. = 0,01 m³.
    Das heißt doch dann, wenn ich den Magneten einmal vorbei führe am Reed-Kontakt sollte auf der Seite vom Zähler bei Tagesverbrauch der Wert hochgehen, was hier bei mir nicht passiert.
    Im Seriellen Monitor kommt diese Ausgabe beim auslösen des Reed-Konaktes:

    15:28:25.304 -> Analoger Spannungswert:0.0978V, Grenzwert: noch nicht erreicht
    15:28:28.410 -> Analoger Spannungswert:5.0049V, Grenzwert: noch nicht erreicht

    Muss ich den Poti am KY-025 anders einstellen ?
    Kannst Du mir evtl. helfen ?

    Danke

    Antworten
    • Genau, am Poti kann man die Empfindlichkeit einstellen. Ich hab noch (leider viel zu spät) die Quelle dafür an den Beitrag angehängt. Damit sollte es dann klappen.

      Antworten
      • Danke für den Hinweis, er zählt jetzt 🙂
        jetzt bekomme ich es nicht hin mir die Daten (Tagesverbrauch) in Grafana anzuzeigen zu lassen, kannst Du mir da auch eine Hilfestellung geben ?
        Im Code habe ich die Datenbank angepasst, das pointDevice(„gaszaehler“ kann ich auch auswählen in Grafana aber es kommen keine Daten 🙁
        Bin da leider auch noch ein Newbie.
        wäre super, Danke für Deine Zeit
        Gruß Sven

        Antworten
        • Hast du die Datenbank im influx angelegt?
          influx
          > CREATE DATABASE weichwasser

          Ich vermute zwar ja, denn sonst würdest du die Daten im Grafana ja nicht auswählen können.
          Im Seriellen Monitor hast du vermutlich auch keine Fehlermeldungen?!

          Antworten
  • Hi,
    habe es hinbekommen.
    Ich musste bei „SELECT“ field(Value) es umstellen auf field(Digital) und sum() hinzufügen, dann waren die Daten da 🙂
    Ist es möglich das man den aktuellen gesamt Zählerstand mit einfügen kann und dann in Grafana mit hochzählen lässt ?
    Das würde das Überprüfen erleichtern ob alle Impulse gezählt wurden. Man bräuchte dann nur den Zählerstand am PC mit dem am Gaszähler vergleichen und hätte alle Daten.

    Danke
    Gruß aus dem hohen Norden

    Antworten
    • Hi. Ich verwende die Daten hauptsächlich in openHAB und berechne auch da ein paar Sachen damit. Dort mache ich auch die Summierung und Auswertungen:

      var Number Letzter_abgelesener_Zaehlerstand = 14950.70

      var Number Einheit = 0.01

      var Number Gaspreis_Monat = 200.1 // € pro Jahr
      var Number Gaspreis_Tag = 54.82191780821918 // ct pro Tag
      var Number Gaspreis_kWh = 19.269 // ct pro kWh
      var Number Gaspreis_zZahl = 0.9645 // z Zahl
      var Number Gaspreis_Brennwert = 10.293 //Brennwert

      rule "Increment Gas Meter"
      when
      Item MQTT_Gaszaehler_Digital changed from 0 to 1
      then
      // Aktuellen Zaehlerstand setzten - die folgenden drei Zeilen auskommentieren und anschließend einen Zählimpuls auslösen damit das Regelwerk einmal durchlaufen wird!
      /**/ if (Gaszaehler_Stand.state != NULL && Gaszaehler_Stand.state < Letzter_abgelesener_Zaehlerstand) { /**/ postUpdate(Gaszaehler_Stand, (Letzter_abgelesener_Zaehlerstand)) /**/ } postUpdate(Gaszaehler_Heute, (Gaszaehler_Heute.state as DecimalType + Einheit)) postUpdate(Gaszaehler_Stand, (Gaszaehler_Stand.state as DecimalType + Einheit)) var Faktor = Gaspreis_zZahl * Gaspreis_Brennwert * Gaspreis_kWh postUpdate(Gaskosten_Heute, ((Gaszaehler_Heute.state as DecimalType * Faktor) + Gaspreis_Tag) / 100) end

      Den Teil hinter "/**/" kann man auch irgendwann auskommentieren. Dann hat man den aktuellen Stand im openHAB als Variable und kann das auch wieder in Grafana verwenden.

      Eine Variable in den ESP zu schrieben habe ich noch nicht umgesetzt, wollte ich aber immer mal machen. Dann könnte man den aktuellen Stand über die Webseite setzen und die würde dann mit übermittelt werden (und kann im nachhinein noch angepasst werden).

      Viele Grüße

      Antworten
      • Hi Simon,
        ich danke Dir für Deine Unterstützung und Erläuterung, leider bekomme ich es nicht hin mit dem Zählerstand und Deiner rule.
        Ich bekomme in openHab 3.3 immer die Fehlermeldung:

        [ERROR] [internal.handler.ScriptActionHandler] – Script execution of rule with UID ‚Gaszaehler_Stand‘ failed: var Number Letzter_abgelesener_Zaehlerstand = 14950.70

        Kannst Du mir weiterhelfen ?
        Ich habe die Werte von Dir dringelassen zum Testen.

        Danke

        Antworten
        • Hi Sven, hab vergessen mitzugeben, dass die Items noch angelegt werden müssen. Also in einer Items-Datei noch folgendes hinein:
          Number Gaszaehler_Stand "Zählerstand Gas [%.2f m³]"
          Number Gaszaehler_Gestern "Gasverbrauch Gestern [%.2f m³]"
          Number Gaszaehler_Heute "Gasverbrauch Heute [%.2f m³]"

          Number Gaskosten_Gestern "Gaskosten Gestern [%.2f €]"
          Number Gaskosten_Heute "Gaskosten Heute [%.2f €]"

          Zum Tageswechsel passiert bei mir folgendes:

          rule "Reset Gas Tagesverbrauch"
          when
          Time is midnight
          then
          postUpdate(Gaszaehler_Gestern, Gaszaehler_Heute.state)
          postUpdate(Gaszaehler_Heute, 0.0)

          postUpdate(Gaskosten_Gestern, Gaskosten_Heute.state)
          postUpdate(Gaskosten_Heute, (Gaspreis_Tag / 100))
          end

          Jetzt sollte es klappen 🙂

          Grüße
          Simon

          Antworten
          • Hi Simon, werde es versuchen.
            Ich schätze mal das Du mit VSC arbeitest und nicht über WebUI. Einfache Dinge wie Schalter, Lampen und einfache Regeln bekomme ich hin, nur wenn es komplexer wird steh ich noch an der Wand. Ich werde Dir berichten ob es dann geklappt hat.
            Danke

          • Hi Simon,
            es wollte einfach nicht laufen, immer kamen Fehlermeldungen.
            Ich habe dann auch mal im Forum gefragt (hoffe es ist Ok gewesen) und wir haben einiges probiert bis es lief.
            Die Änderung hat ein Forum Mitglied gemacht und ich habe es dann bei mir getestet.
            Die geänderte Regel sieht jetzt so aus:

            var Number Letzter_abgelesener_Zaehlerstand = 1495.70
            var Number Einheit = 0.01
            var Number Gaspreis_Monat = 200.1 // € pro Jahr
            var Number Gaspreis_Tag = 54.82191780821918 // ct pro Tag
            var Number Gaspreis_kWh = 19.269 // ct pro kWh
            var Number Gaspreis_zZahl = 0.9645 // z Zahl
            var Number Gaspreis_Brennwert = 10.293 //Brennwert

            rule „Increment Gas Meter“
            when
            Item GASZaehler_ GASZaehler changed from 0 to 1
            then
            logInfo(„Zählerstand“,“Test aktiviert 1″)
            if (!(Gaszaehler_Heute.state instanceof Number)) {
            logInfo(„Zählerstand“,“Test Gaszaehler_Heute wird initialisiert“)
            Gaszaehler_Heute.postUpdate(0)
            }
            if (!(Gaszaehler_Stand.state instanceof Number)) {
            logInfo(„Zählerstand“,“Test Gaszaehler_Stand wird initialisiert“)
            Gaszaehler_Stand.postUpdate(0)
            }

            // Aktuellen Zaehlerstand setzten – die folgenden drei Zeilen auskommentieren und anschließend einen Zählimpuls auslösen damit das Regelwerk einmal durchlaufen wird!
            /**/ if (Gaszaehler_Stand.state != NULL && Gaszaehler_Stand.state < Letzter_abgelesener_Zaehlerstand) {
            logInfo("Zählerstand","Bedingung erfüllt")
            /**/ Gaszaehler_Stand.postUpdate(Letzter_abgelesener_Zaehlerstand) /**/ }
            Gaszaehler_Heute.postUpdate(Gaszaehler_Heute.state as DecimalType + Einheit)
            Gaszaehler_Stand.postUpdate(Gaszaehler_Stand.state as DecimalType + Einheit)
            var Faktor = Gaspreis_zZahl * Gaspreis_Brennwert * Gaspreis_kWh
            postUpdate(Gaskosten_Heute, ((Gaszaehler_Heute.state as DecimalType * Faktor) + Gaspreis_Tag) / 100)
            logInfo("Zählerstand","Test aktiviert 2")
            end

            Danke nochmal für Deine Unterstützung und diesem Projekt

            Gruß
            Sven

          • Vollkommen okay das im Forum zu posten und das mal überprüfen zu lassen 😀

            Ich muss dann die Tage mal sehen wo bei mir der Fehler ist (was seltsam ist weil es bei mir ja läuft).,

            Aber schön, dass es jetzt funktioniert 🙂

          • Hi Simon,
            welche openHab Version hast Du am laufen ? Bei mir läuft 3.3.0 und so wie ich es mitbekommen habe, hat sich bezüglich der Regeln von openHab 2.5 zu 3.3.0 etwas geändert. Vielleicht liegt es daran.

  • Hallo Simon,
    ich habe das soweit nachgebaut. Habe das gleiche Problem wie Sven am Anfang das der „Analoger Spannungswert:5.00V, Grenzwert: noch nicht erreicht“ steht. Egal wie ich den auch drehe, ich bekomme das nicht hin. Die Spannung schon an D5 gemessen der bei 3,2V und 0,5V liegt. Nur wenn ich an D5 noch ein 5k Wiederstand setze zählt er hoch (zwei mal – einmal bei geschlossen und dann beim öffnen)
    Kannst du kurz schreiben, worauf man achten muß oder der Denkfehler liegt?

    Antworten
    • Hi Heinemann,
      der „Grenzwert nicht erreicht“ steht immer da, bis der Kontakt 1x schaltet, dann kommt „Grenzwert erreicht“ und wechselt wieder zu „Grenzwert nicht erreicht“. Hast Du daran gedacht ? Bei mir läuft es super (bis jetzt) in openHab sowie in Grafana.
      Ich dachte ich grätsche hier mal rein. 😉

      Antworten
  • Hallo Sven,
    schön das du geantwortet hast. Immerhin ist die Lösung cool und auch soweit nachvollziehbar.
    Wenn er einmal schaltet fällt die Spannung von ca 5V auf ca 0V ab. „Grenzwert nicht erreicht bleibt“. Auch bei den Schaltzugang. Aber ich bekomme Daten in Grafana herein. Im WEB Tool zählt er pro Durchgang 2 mal. (Statt 0,01 – 0,02m³) Was erstmal egal ist.
    Nachdem du das geschrieben hast, habe ich nochmal versucht, das so hin zu bekommen. Jetzt zeigt er mir nur noch „Grenzwert erreicht an“ und zählen macht er gar nicht mehr oder zählt ständig von selber weiter. Deshalb habe ich mir noch ein neuen 8266 bestellt. Mache das nochmal ganz von vorne. Ich melde mich dann noch mal.

    Antworten
    • Hi Heinemann,
      arbeitest Du auch mit openHab ?
      Ich habe mir in openHab ein Dummy Item als Switch angelegt um dem Prellen vom Reedkontakt entgegen zu wirken, dazu eine Regel erstellt mit einer Wartezeit von 800ms zwischen ON und OFF.
      Wenn der Reedkontakt von 0 auf 1 schaltet, geht der Dummyschalter auf ON wartet 800ms dann auf OFF.
      Den Trigger in der Zähler Regel angepasst. Seitdem läüft es bei mir.
      Ach ich habe noch einen einzelnen Reedkontakt mit 2 Adern an den Kontakt KY-025 angelötet, so habe ich nicht die ganze Platine am Gas Zähler in der Aussparung hängen.

      Das der esp8266 nicht in i.O. kann ich mir nict vorstellen, evtl. hast Du noch nicht die richtige Position für den Kontakt gefunden.

      Antworten
      • Hallo Sven,
        ich habe HomeAssistant im einsatz. Das doppelt zählen kann man umgehen. Entweder mn teilt den Wert in Grafana /2 oder macht das über Node-Red mit Funktion Funktion. Ich kann mir das auch nicht vorstellen, nur möchte ich das einmal auf dem Tisch nachvollziehen und nicht direkt im Keller.
        Ja, ich habe ein Reed Kontakt auch an der Platine angelötet. Den Luxus! Mein Gaszähler hat ein eingebauten Reed Kontakt :-). Beim wechseln hatte ich bei den Stadtwerken angefragt. Hab auch schon mal die Platine gewechselt. Deshalb alles mal von vorne.
        Grüsse Ingo

        Antworten
  • Hallo,
    der neue 8266 ist da. Aufgebaut und das Ergebnis nur noch Grenzwert erreicht.
    20:18:42.487 -> Analoger Spannungswert:0.1026V, Grenzwert: erreicht
    20:18:42.744 -> Analoger Spannungswert:4.3060V, Grenzwert: erreicht
    Über 4,8 rasen die Werte über den Bildschirm.
    Nach einiger Zeit warum auch immer habe ich was am Anfang war.
    23:19:44.243 -> Analoger Spannungswert:0.8651V, Grenzwert: noch nicht erreicht
    23:19:44.490 -> Analoger Spannungswert:5.0049V, Grenzwert: noch nicht erreicht
    23:20:07.053 -> Attempting MQTT connection…connected
    Einstellen lässt sich das nicht. Von 5V runter auf 3,5V. Egal was ich probiere.
    Beim Schalten eht der Wert Richtung 0.
    Kann es sein das ich eine falsche Bibliothek verwende? Welche hast du denn? Oder ist das egal?
    Gruß
    Ingo

    Antworten
    • Hi Ingo,
      ich habe den Sketch von Simon so wie er ist übernommen, nur die Rules für mich angepasst.
      Habe es gerade auch nochmal aufgebaut (für meine Vater) und es läuft auf Anhieb. Mit 5V am KY-025.
      Den richtigen gpio hast genommen oder angepasst ?
      Beim Wemos D1 mini ist gpio 5 = D1 nicht D5, vielleicht nochmal prüfen.

      Gruß Sven

      Antworten
      • Hallo Sven,
        ich glaub es nicht. Stimmt gpio 5 ist D1. Hab ich nachgesehen. Wie blöd. Dann gleich der nächste Tip. Hatte den an 3,3V.
        Nur ist dort immer
        Analoger Spannungswert:0.4106V, Grenzwert: erreicht
        Analoger Spannungswert:5.0049V, Grenzwert: erreicht
        Analoger Spannungswert:0.4106V, Grenzwert: erreicht
        Analoger Spannungswert:5.0049V, Grenzwert: erreicht
        Egal wie lange man schraubt und schaltet. Aber er zählt. Die Zeichnung war irreführend. Bei Grafana nimmst du den Analogen Wert oder Digital? field(Analog).
        Danke erstmal für den Tip.

        Antworten
        • Hi Ingo,
          freut mich wenn er jetzt zählt 😉
          Ich habe bei Grafana “field“ (digital). Beim Tagesverbrauch Heute&Gestern (value).

          Antworten
  • Hey! danke erstmal für deine Anleitung hier. bekomme es auch soweit hin das es in der Weboberfläche angezeigt wird und auch Daten per mqtt übermittlelt werden.

    woran ich scheitere ist, das in meiner influxdb Datenbank keine Daten rein geschrieben werden.
    gibt es da irgendeinen Kniff wie die angelegt sein muss?
    und warum braucht man keinen Benutzernamen und kein Passwort für die influxdb in der config?

    Antworten
    • Nutzt man die InfluxDB v1 braucht man nicht zwingend einen Benutzernamen und ein Passwort. Da ich das nur testweise angebunden habe, hab ich mir die Mühe nicht gemacht.
      Die Frage ist ob man im Seriellen Monitor vom Arduino was sieht oder im syslog von der InfluxDB.
      Ich probiere es bei Gelegenheit aber gerne noch mal aus. Hab da eh noch ein Projekt offen, weiß aber noch nicht wann ich das schaffe 😬

      Antworten
    • Falls Du es noch nicht kennst, kannst Du ja mal das Programm “InfluxDB Studio“ (läuft auf Windows) testen. Damit lassen sich sehr einfach Datenbanken, Benutzer anlegen, sowie Rechte verwalten.
      Ich finde das Programm super. 👍🏼
      Gruß
      Sven

      Antworten
  • Vielen Dank für´s Teilen. Habe mir gerade die Arduino IDE installiert und versuche dein Code zu kompilieren.
    Welche Library nutzt du für die MQTT (wo wohl auch der #include enthalten ist?!)

    Wenn ich die Antares ESP8266 MQTT@0.9.2 Lib nutze bekomme ich immer diesen Fehler in der Console und ich habe keine Ahnung wo das Problem ist?! Ggf. habe ich nur eine falsche Lib?

    c:/users/urmel/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.0.4-gcc10.3-1757bed/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\Urmel\AppData\Local\Temp\arduino-sketch-0521AFFEE4C89D524B84BC12588E3C4A\libraries\Antares_ESP8266_MQTT\AntaresESP8266MQTT.cpp.o:c:\Users\Urmel\Documents\Arduino\libraries\Antares_ESP8266_MQTT\src/AntaresESP8266MQTT.cpp:4: multiple definition of `client‘; C:\Users\Urmel\AppData\Local\Temp\arduino-sketch-0521AFFEE4C89D524B84BC12588E3C4A\sketch\ESP8266 Gaszaehler an mqtt.ino.cpp.o:C:\Users\Urmel\Documents\Arduino\ESP8266 Gaszaehler an mqtt/ESP8266 Gaszaehler an mqtt.ino:48: first defined here
    c:/users/urmel/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.0.4-gcc10.3-1757bed/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\Urmel\AppData\Local\Temp\arduino-sketch-0521AFFEE4C89D524B84BC12588E3C4A\libraries\Antares_ESP8266_MQTT\AntaresESP8266MQTT.cpp.o:c:\Users\Urmel\Documents\Arduino\libraries\Antares_ESP8266_MQTT\src/AntaresESP8266MQTT.cpp:3: multiple definition of `espClient‘; C:\Users\Urmel\AppData\Local\Temp\arduino-sketch-0521AFFEE4C89D524B84BC12588E3C4A\sketch\ESP8266 Gaszaehler an mqtt.ino.cpp.o:C:\Users\Urmel\Documents\Arduino\ESP8266 Gaszaehler an mqtt/ESP8266 Gaszaehler an mqtt.ino:47: first defined here
    collect2.exe: error: ld returned 1 exit status

    Multiple libraries were found for „WiFiClient.h“
    Used: C:\Users\Urmel\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\libraries\ESP8266WiFi
    Not used: C:\Users\Urmel\Documents\Arduino\libraries\WiFi101
    exit status 1

    Compilation error: exit status 1

    Viele Grüße
    Jannik

    Antworten
    • Hallo Jannik. Ich benutze den Standard PubSubClient von Arduino: https://github.com/knolleary/pubsubclient welcher in der Bibliothek PubSubClient (aktuell in der Version 2.8.0) heißt.
      Ist per #include eingebunden.
      Ale WiFi-Client benutze ich den #include , da hast du offenbar den WiFiClient.h verwendet. Da scheinen sich Namen in den Libs zu überschneiden.
      Viele Grüße Simon

      Antworten
  • Ich wollte noch mal fragen was eigentlich passiert wenn die letzte Zahl beim Gaszähler auf 0 stehen bleibt?
    Dann müsste doch der Reedschalter die ganze Zeit schalten und immer höher zählen?

    Antworten
    • Bei der InfluxDB-Anbindung kann das tatsächlich passieren fällt mir auf. Das müsste ich noch mal prüfen. Bei openHAB wird das über „Item changed“ abgefangen. Es wird also auf die Flanke geachtet, nicht auf den Wert an sich.

      Antworten
      • ich muss nochmal nerven ^^
        und zwar könnte man das auf der HTML Seite von dem Gaszähler in dem Script eigentlich auch so eintragen das der den verbrauchten Wert vom Vortag dort anzeigen würde?

        PS: das Script funktioniert auch mit influxdb2 wenn man es ein wenig umschreibt.
        pss: vielleicht magst du ja das Bild noch abändern mit D1 und D5 und in dem Script auch.

        und müsste eigentlich in dem Script dann davor ein „D“? (bei digitaler Eingang die 5 die ja eigentlich eine 1 sein sollte und wemos auch auf d1 sein sollte)
        ——–
        int Analog_Eingang = A0; // Analogwert
        int Digital_Eingang = 5; // Binärer Wert

        Antworten
        • Bild ist angepasst, vielen Dank für den Hinweis.

          Bei mir klappts so mit „5“, eigentlich sollte das „A0“ nicht klappen wenn man das in ein „int“ schreiben will 😀

          Um den Vortagesstand zu speichern müsste man noch was erweitern:

          int daily_count_gas_y = 0;
          [...]
          // 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_y = daily_count_gas;
          daily_count_gas = 0;
          }
          [...]
          htmltext += "

          gestern: " + String(daily_count_gas_y * 0.01) + "m³

          ";

          Ich habs mal ein bisschen eingeküfzt an den „[…]“-Stellen.

          Antworten
          • Sicher das das so richtig ist? 🙂
            besonders das hier?
            –> daily_count_gas_y = daily_count_gas_y; <—
            Weil irgendwie zeigt der mir beim gestrigen Gasverbrauch einfach 0 an.

            PS: Habe noch für nen Pipersberg BK-G4 … ein Gehäuse erstellt wo man dann unten den Reedkontakt mitsamt ESP usw. montieren kann.
            Wenn gewünscht kann ich das ja mal auf Thingiverse hoch laden und hier nen Link posten.

          • Ja, du hast recht, das „_y“ muss weg. In der Zeile wird der aktuelle Stand in der Variable für gestern gespeichert und dann wieder geleert. Da hab ich mich vertippt oder einfach einen Denkfehler gehabt.
            Korrigiere es jetzt

          • Vielleicht magst du das ja mal selber ausprobieren, aber bei mir funktioniert das trotzdem nicht.
            er schreibt einfach 0 dahin.

            PS: frohes neues Jahr:)

  • Hi Simon,
    kannst Du mir noch einmal helfen mit dem Gaszähler unter OpenHab.
    Ich wollte den aktuellen Zählerstand neu setzen, da mein Wemos sich verabschiedet hat.
    Ich komme im Moment nicht damit klar welche 3 Zeilen ich genau in der Regel auskommentieren soll.
    Habe etliche Varianten probiert, aber der von mir gesetzte Wert
    „var Number Letzter_abgelesener_Zaehlerstand = 16507.25“
    wird nicht übernommen.
    Danke für Deine Zeit
    Gruß Sven

    Antworten
  • so sieht die Regel bei mir aus

    // Aktuellen Zaehlerstand setzten – die folgenden drei Zeilen auskommentieren und anschließend einen Zählimpuls auslösen damit das Regelwerk einmal durchlaufen wird!
    /**/ if (Gaszaehler_Stand.state != NULL && Gaszaehler_Stand.state < Letzter_abgelesener_Zaehlerstand) {
    logInfo("Zählerstand","Bedingung erfüllt")
    /**/ Gaszaehler_Stand.postUpdate(Letzter_abgelesener_Zaehlerstand) /**/ }
    Gaszaehler_Heute.postUpdate(Gaszaehler_Heute.state as DecimalType + Einheit)
    Gaszaehler_Stand.postUpdate(Gaszaehler_Stand.state as DecimalType + Einheit)
    var Faktor = Gaspreis_zZahl * Gaspreis_Brennwert * Gaspreis_kWh
    postUpdate(Gaskosten_Heute, ((Gaszaehler_Heute.state as DecimalType * Faktor) + Gaspreis_Tag) / 100)
    logInfo("Zählerstand","Zählerstand aktualisiert")
    end

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert