NEWS
Gaszähler
-
Hallo,
danke der Hilfe kommen nun Daten von meinem ESP im ioBroker an.
Unter FHEM hatte ich mir mit Hilfe diese Seite
https://voizchat.de/gaszaehler-verbrauc … erry-gpio/
meinen Gaszähler eingerichtet um den Gasverbrauch zu ermitteln.
Wie lässt sich das gleiche mit ioBroker am einfachsten realisieren?
Oder, vielleicht hat sowas schon einer gemacht...
Gruß
2880_1.png -
klar geht das.. super idee werde ich mal in angriff nehmen
du kannst mit dem rpi adapter die gpio's abgreifen und mit javascript den rest..
-
-
fange gerade damit an…
Die Werte vom Pulse Counter bekomme ich richtung IOBroker über den MQTT Adapter.
Allrdings habe jetzt keine Idee wie ich den Stromverbrauch daraus ermitteln soll...
0.01 m³ (=10l) pro Schaltvorgang. Da wird wohl ein script benötigt glaube ich... Kammst Du weiter mit dem Projekt?
Ich würde gerne aktuellen Gasverbrauch, gesamten Gasverbrauch und Gesamtkosten errechnen Wollen....
-
Ja, habs fast.
ESPeasy habe ich runtergemacht und dafür folgendes Script verwendet:
(Reed Schalter hängt am GND und GPIO-2 (D4)
! ````
#include <esp8266wifi.h>#include <esp8266webserver.h>IPAddress ip(192,168,X,Y); //Node static IP
IPAddress gateway(192,168,X,1);
IPAddress subnet(255,255,255,0);
! ESP8266WebServer server(80); //Web server object. Will be listening in port 80 (default for HTTP)
! #define ledPin 0
#define inPin 2
#define ssid "YourSSID"
#define password "YourPassword"
! int actual = 1;
int prev = 1;
long int value = 0;
! // ****************************************************************
! void tohex(unsigned char * in, size_t insz, char * out, size_t outsz)
{
unsigned char * pin = in;
const char * hex = "0123456789ABCDEF";
char * pout = out;
for(; pin < in+insz; pout +=3, pin++){
pout[0] = hex[(*pin>>4) & 0xF];
pout[1] = hex[ pin & 0xF];
pout[2] = ':';
if (pout + 3 - out > outsz){
/ Better to truncate output string than overflow buffer /
/ it would be still better to either return a status /
/ or ensure the target buffer is large enough and it never happen /
break;
}
}
pout[-1] = 0;
}
! // ****************************************************************
! void handleAll() { //Handler
! String message = "";
byte MAC[6];
enum {insz = 6, outsz = 3insz};
char MACStr[outsz];
char * pout = MACStr;message += "<myhome>\n<esp8266_gasmeter>\n";
message += "<data name=""SSID"" value="""" +/wifi.ssid()/""/valueunit="""/">\n";
message += "<data name=""IP"" value="""" +/wifi.localip().tostring()/""/valueunit=""xxx.xxx.xxx.xxx"/">\n";
message += "<data name=""help"" value=""use" setvalue?value="xx" to/set/new/value"/valueunit=""text"/">\n";
WiFi.macAddress(MAC);
tohex(MAC, insz, MACStr, outsz);
message = message + "<data name=""MAC"" value="""" +/macstr/""/valueunit=""AA:BB:CC:DD:EE:FF"/">\n";
message += "<data name=""GasMeter"" value="""" +/string(float(value)/100)/""/valueunit=""m^3"/">\n";
message += "</data></data></data></data></data></esp8266_gasmeter>\n</myhome>";server.send(200, "text/plain", message); //Response to the HTTP request
}! // ****************************************************************
! void handleGenericArgs() { //Handler
! String message = "Number of args received:";
message += server.args(); //Get number of parameters
message += "\n"; //Add a new line
! for (int i = 0; i < server.args(); i++) {message += "Arg no" + (String)i + " –> "; //Include the current iteration value message += server.argName(i) + ": "; //Get the name of the parameter message += server.arg(i) + "\n"; //Get the value of the parameter
}
server.send(200, "text/plain", message); //Response to the HTTP request
}! // ****************************************************************
! void handleSetValue() {
! String message = "";
String valuestr = "";
! if (server.arg("Value")== ""){ //Parameter not found
! message = "Value Argument not found";
! } else { //Parameter found
! message = "New Value = ";
message += server.arg("Value"); //Gets the value of the query parameter
valuestr = server.arg("Value");
value = valuestr.toFloat() * 100;
! }
server.send(200, "text/plain", message); //Returns the HTTP response
}
! // ****************************************************************
! void setup() {
! Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password); //Connect to the WiFi network
WiFi.config(ip, gateway, subnet);
! while (WiFi.status() != WL_CONNECTED) { //Wait for connection
! delay(500);
Serial.println("Waiting to connect...");
}
! Serial.print("WIFI connected to: ");
Serial.println(WiFi.SSID());
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
! server.on("/genericArgs", handleGenericArgs);
server.on("/SetValue", handleSetValue);
server.on("/", handleAll);
! server.begin(); //Start the server
Serial.println("Server listening");
Serial.println("use /SetValue?Value=xx to set new value");
actual = digitalRead(inPin);
! pinMode(ledPin, OUTPUT);
}
! // ****************************************************************
! void loop() {
! server.handleClient(); //Handling of incoming requests
actual = digitalRead(inPin);
! if (actual == 1 && actual != prev) {
value++;
Serial.println(value);
}
! if (actual == 1) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, HIGH);
delay(10);
digitalWrite(ledPin, LOW);
}prev = actual;
delay(980);! }</esp8266webserver.h></esp8266wifi.h>
Die Ausgabe sieht dann so aus:
<myhome><esp8266_gasmeter><data name="SSID" value="FRITZ!Box Fon WLAN 7390" valueunit=""><data name="IP" value="192.168.1.43" valueunit="xxx.xxx.xxx.xxx"><data name="help" value="use /SetValue?Value=xx to set new value" valueunit="text"><data name="MAC" value="11:F1:31:E1:11:31" valueunit="AA:BB:CC:DD:EE:FF"><data name="GasMeter" value="26456.91" valueunit="m^3"></data></data></data></data></data></esp8266_gasmeter></myhome>
Den Wert lese ich mit folgendem JS Script ein:
var request = require('request');
var parseString = require('xml2js').parseString;var url="http://192.168.1.43"; // hier die Adresse der Webseite eintragen
var GaszaehlerId = "Gaszaehler.Wert"; // Der Wert steht in "javascript.0."
function processData(body){
parseString(body, function (err, result) {
// log(JSON.stringify(result.MyHome.ESP8266_GasMeter[0].data[4].$.value));
if (!err)
setState(GaszaehlerId,result.MyHome.ESP8266_GasMeter[0].data[4].$.value);
});
}createState(GaszaehlerId,
0,
false,
{
type:"number",
unit:"m³"
});schedule ("* * * * *", function(){ // alle 3 Minuten aufrufen
request({
uri: url,
method: "GET",
timeout: 10000,
followRedirect: true,
maxRedirects: 10
}, function(error, response, body) {
if (!error) {
if (response.statusCode == 200) {
processData(body);
}
} else log("Fehler: "+error);
});
})Die Auswertung versuche ich gerade mit dem Betriebsstundenzaehler (Script im Forum) zu realisieren.
-
Danke Noxx,
ganz kurz zum Verständniss…
Das Sketch für ESP8266 liest den Readkontakt aus und stellt den Wert auf dem Webserver zur Verfügung.
Das JS-Script angelt den Counter-Wert aus der Webanwendung heraus und stellt unter javascript.0
den Wert zur Verfügung... bei Dir sah es so aus 26456.91
Erste Frage:
Wie oder wo gleiche ich meinen Zählerstand bei dem Script an?
Du bekommst folgende Ausgabe. Das Script wird jedoch von Null anfangen wollen richtig?
<data name="GasMeter" <color/color="#FF0000">value="26456.91" valueunit="m^3"/>
Geht es hier weiter?
http://forum.iobroker.net/viewtopic.php?t=2175
Ich baue heute die Schaltung auf.
Du schreibst dass der Magnetschalter am GND und GPIO-2 (D4) hängt. Hast Du irgenwelche Bauteile noch für die Entprellung eingebaut? (zB Kondi mit nem Widerstand?) oder hängt dein Reedschalter wirklich zwischen GPIO und GND ???
Das JS Script kann ich auch schon mal installieren.
Gruß Lukas</data>
-
den wert kannst du mit
192.168.XXX.YYY/SetValue?Value=1234.5
anpassen
-
Hallo in die Runde,
habe jetzt erst diesen Fred gesehen, muss ihn noch einmal hoch holen.
Ich hoffe es läuft noch alles
Warum hast du die Espeasy runter gemacht? Das geht doch super mit der.
Das Entprellen kann man auch Softwareseitig konfigurieren.
Ich habe das auch im Einsatz und lass es über MQTT an den Broker senden. Dazu brauch man
sich nicht zu verbiegen.
Das einzige was man da anpassen muss ist ein Script was die doppelten Counts runter rechnet
und dem gespeicherten Zählerstand zuschlägt.
Gruß Andreas
-
das Script ist klasse… Nutze es einmal für Gas & Stromzähler. Ich habe keine Probleme mit Prellen, dank der guten Schaltung.
Jetzt bin ich aber neugierig, wie Du unter Espeasy die Softwarseitige Entprellung eingestellt hast. Kannst Du es verraten?
Doppelten Counts gibt es nicht, und wenn es sie geben sollte, dann ist die Schaltung doch nicht entprellt.
-
Moin moin,
beim Espeasy stellst du doch die Entprellzeit mit "Debounce Time (mSec):" ein.
Da brauchst du nix mit weiterer Software machen.
Und die 2 Counts sind Sicherheit bei mir. Er zählt einmal wenn der Reed anzieht und
einmal wenn er wieder abfällt.
Auch werte ich nicht die Counts aus, sondern die Totale. Die werden immer hoch gezählt.
So ein Count kann schon mal verloren gehen, wenn z.B. das WLan spinnt oder der Broker.
Der letzte Total Wert wird bei mir im Broker abgelegt. Kommt jetzt ein neuer Wert vom Zähler
wird die Differenz berechnet. Da spielt es keine Rolle ob eine Komponente mal nicht online war.
Wenn jetzt der Esp mal Stromlos war ist das auch nicht so schlimm.
Dann wird die Differenz von 0 genommen und von vorn gezählt. Klappt Super.
Habe keine Differenzen mehr drin.
Das gleiche mache ich auch beim Strom. Das war nur etwas frickeliger, weil der TCRT5000
der die Umdrehungen zählt sich nicht gescheit einstellen ließ.
Da habe ich dann einfach das 10k Einstellpoti gegen ein Präzisionspoti ausgetauscht und
schon klappte die Einstellung.
Gruß Andreas
847_gas.jpg -
sehr schön…