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).
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 🙂
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
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.
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
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?!
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
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
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
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
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?
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. 😉
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.
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.
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
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
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
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.
Hi Ingo,
freut mich wenn er jetzt zählt 😉
Ich habe bei Grafana “field“ (digital). Beim Tagesverbrauch Heute&Gestern (value).
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?
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 😬
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
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
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
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?
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.
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
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.
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
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