Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Gaszähler

    NEWS

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker goes Matter ... Matter Adapter in Stable

    Gaszähler

    This topic has been deleted. Only users with topic management privileges can see it.
    • N
      noxx last edited by

      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

      1 Reply Last reply Reply Quote 0
      • arteck
        arteck Developer Most Active last edited by

        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..

        1 Reply Last reply Reply Quote 0
        • N
          noxx last edited by

          @arteck:

          klar geht das.. super idee werde ich mal in angriff nehmen `

          schon was erreicht?

          1 Reply Last reply Reply Quote 0
          • K
            knopers1 last edited by

            @noxx,

            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....

            1 Reply Last reply Reply Quote 0
            • N
              noxx last edited by

              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 = 3
              insz};
              char MACStr[outsz];
              char * pout = MACStr;

              message += "<myhome>\n<esp8266_gasmeter>\n";
              message += "<data name="&quot;SSID&quot;" value="&quot;"" +/wifi.ssid()/""/valueunit="&quot;&quot;/">\n";
              message += "<data name="&quot;IP&quot;" value="&quot;"" +/wifi.localip().tostring()/""/valueunit="&quot;xxx.xxx.xxx.xxx&quot;/">\n";
              message += "<data name="&quot;help&quot;" value="&quot;use" setvalue?value="xx" to/set/new/value"/valueunit="&quot;text&quot;/">\n";
              WiFi.macAddress(MAC);
              tohex(MAC, insz, MACStr, outsz);
              message = message + "<data name="&quot;MAC&quot;" value="&quot;"" +/macstr/""/valueunit="&quot;AA:BB:CC:DD:EE:FF&quot;/">\n";
              message += "<data name="&quot;GasMeter&quot;" value="&quot;"" +/string(float(value)/100)/""/valueunit="&quot;m^3&quot;/">\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.
              1 Reply Last reply Reply Quote 0
              • K
                knopers1 last edited by

                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>

                1 Reply Last reply Reply Quote 0
                • N
                  noxx last edited by

                  den wert kannst du mit

                  192.168.XXX.YYY/SetValue?Value=1234.5

                  anpassen

                  1 Reply Last reply Reply Quote 0
                  • N
                    Nepomukl last edited by

                    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

                    1 Reply Last reply Reply Quote 0
                    • K
                      knopers1 last edited by

                      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.

                      1 Reply Last reply Reply Quote 0
                      • N
                        Nepomukl last edited by

                        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

                        1 Reply Last reply Reply Quote 0
                        • K
                          knopers1 last edited by

                          sehr schön…

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post

                          Support us

                          ioBroker
                          Community Adapters
                          Donate
                          FAQ Cloud / IOT
                          HowTo: Node.js-Update
                          HowTo: Backup/Restore
                          Downloads
                          BLOG

                          575
                          Online

                          32.0k
                          Users

                          80.5k
                          Topics

                          1.3m
                          Posts

                          4
                          11
                          4258
                          Loading More Posts
                          • Oldest to Newest
                          • Newest to Oldest
                          • Most Votes
                          Reply
                          • Reply as topic
                          Log in to reply
                          Community
                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                          The ioBroker Community 2014-2023
                          logo