Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Hardware
    4. Wasserzähler - Selfmade

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Wasserzähler - Selfmade

    This topic has been deleted. Only users with topic management privileges can see it.
    • Knallochse
      Knallochse @jomjol last edited by

      @jomjol stimme dir in jedem Punkt zu. Vielleicht kannst du ja einen Adapter Programmierer dazu bewegen, einen IoBroker Adapter zu erstellen. (dann würde auch der Weg über Parser entfallen) .
      Wenn der Adapter einen Datenpunkt "Fehler" mit True/False steuert, dann könnte man darauf reagieren mit z.Bsp. Message per Telegramm; VIS Ausgabe etc.
      Mit der Meldung müsste man dann wieder manuell (SetpreValue) nachjustieren.

      1 Reply Last reply Reply Quote 0
      • Atifan
        Atifan last edited by Atifan

        Ich habe um die Fehlerquote zu verringern und genauere Werte zu erhalten die config angepasst.
        alt -> MaxRateValue=0.1
        neu-> MaxRateValue=0.01

        1m³=1000L
        0,1m³=100L
        0,01m³=10L
        0,001m³=1L
        0,0001m³=100mL

        Das ganze muss natürlich auch auf die Abtastrate passen.
        Bei mir ist diese 60 Sekunden.
        Werde testen ob es ausreicht.
        Man könnte die MaxRateValue natürlich auch noch erhöhen auf z.B. 0.02 was dann 20L/min entsprechen.

        PS: Es gibt aber ein Problem, dass mir gerade eingefallen ist. Wenn der Wasserzähler Server mal offline ist und in dieser Zeit mehr als 10-20L Wasser verbraucht werden, geht der Zähler der Uhr ja höher und der Bildvergleichsserver spuckt dann zukünftig nur noch Fehler raus, weil der Abstand zu groß ist. Dann müsste man den Docker Container manuell stoppen den aktuellen Wert in die prevalue.ini schreiben und dann den Container wieder starten.

        Knallochse pfried 2 Replies Last reply Reply Quote 0
        • Knallochse
          Knallochse @Atifan last edited by Knallochse

          @Atifan den Wert kannst du mit
          IPServer:Port/setPreValue.html?value=
          mitgeben. Ohne stoppen oder Starten des Servers

          1 Reply Last reply Reply Quote 0
          • Atifan
            Atifan last edited by

            Ah super, Danke für die Info!
            Dann kann man im Notfall ja schnell korrigieren.

            1 Reply Last reply Reply Quote 0
            • pfried
              pfried @Atifan last edited by

              @Atifan Hi Atfian, Dein MaxRateValue=0.01 wird nicht funktionieren, da bei einem Wechsel von einer zur anderen Ziffer bei mir circa 130 Liter "vergehen". Ich habe mit MaxRateValue=0.15 gute Erfahrungen gemacht. Weiter oben im Thread gibt es von mir auch eine Berechnung wieviel Liter maximal pro Sekunde über eine Wasseruhr laufen können. Die multiplizierst Du dann mit Deiner Abtastrate, aber wie schon von @jomjol und @Knallochse geschrieben, wäre eine zweite Auswertelogikschicht sicher das optimale Auswerteverfahren.

              @jomjol Auf Deine Frage weiter oben, es sollte niemanden stören wie der Wert zustande kommt, da die gesamte SW eh in einem Docker läuft und damit eh nicht mehr editierbar / lesbar ist.

              1 Reply Last reply Reply Quote 0
              • Atifan
                Atifan last edited by

                Hi, ja habe es schon gemerkt. Beim Duschen wurde ca. 0.3 pro Minute geändert. Wenn dann noch jemand nebenbei Wasser zapft hat man noch höheren Verbrauch. Habe es bei mir jetzt auf 0.5 angepasst.

                1 Reply Last reply Reply Quote 0
                • sissiwup
                  sissiwup @jomjol last edited by

                  @jomjol
                  Hallo,

                  ich probiere hier mit den neuronalen Netzen für die Erkennung der digitalen Ziffern rum.
                  Leider ist das Ergebnis immer noch nicht so toll, wie man sich das wünschen könnte.

                  Ich habe den Ansatz probiert, ein std. Netz zu nehmen und es zu trainieren, dass geht, aber dass ist vermutlich zu gross für einen Raspi.

                  Vlt. aber eine interessante alternative, die nicht so dramatische Änderungen nach sich zieht:

                  Von OpenCV gibt es tesseract. Das kann OCR mit LSTM und klassisch.

                  Ich habe recht gute Ergebnisse erzielt (erstmal ohne Integration in den Server) mit

                  tesseract ziffer5_2020-02-20_16-10-04.jpg stdout --dpi 70 --oem 2 --psm 10

                  wobei das jpg eine Ziffer darstellt. Selbst bei NAN Werten ist es nicht schlecht.
                  Was aber gut funktioniert ist die Unterscheidung von 3 9 6 und 5.

                  tesseract nutze ich in Version 4.0.0

                  tesseract kann man auch sehr gut per wrapper direkt aus python nutzen.

                  1 Reply Last reply Reply Quote 1
                  • Atifan
                    Atifan last edited by

                    Meint ihr die ESP32 CAM macht es auf dauer mit, wenn sie jede Minute ein Bild macht und die LED an geht?
                    Das sind pro Tag 60 x 24 = 1440 Bilder bzw. Auslösungen und im Jahr 525600 Auslösungen.
                    Ich denke das ist etwas zu hohe Abtastrate oder hat jemand Langzeiterfahrung und macht die CAM bzw. die LED das mit?
                    In welchen Intervallen tastet ihr denn so ab?

                    1 Reply Last reply Reply Quote 0
                    • pfried
                      pfried last edited by

                      @Atifan Ich taste mit 30 Sekunden-Intervallen ab, da ich damit auch in meinem Haus eine Art "Leckerkennung" betreibe (habe viele alte Kupferrohre). Ich habe mir einen zweiten ESP32CAM hergerichtet, welchen ich dann bei Versagen des in Betrieb befindlichen austauschen kann. Bei circa 10 Euro für einen ESP32CAM ist das auch kein hoher finanzieller Verlust. Mein ESP32CAM läuft nun seit circa 5 Monaten ohne Probleme durch.

                      1 Reply Last reply Reply Quote 0
                      • Atifan
                        Atifan last edited by

                        Hi ja, ich lasse es einfach mal auf 1 Minute Abtastung. Wenn die Cam stirbt gibts ne neue und dann kann ich ggf. anders konfigurieren.

                        1 Reply Last reply Reply Quote 0
                        • Atifan
                          Atifan last edited by

                          Hi, ich habe das Problem, dass der Parser anscheinend nach paar Stunden nicht mehr weitermacht und den Datenpunkt nicht mehr aktualisiert.
                          Ich muss dann einfach die Instanz parser.0 stoppen und neustarten, dann funktioniert es wieder.
                          Hat jemand das gleiche Problem?

                          761ca3fd-527a-401c-a65a-254469f410a5-image.png

                          1 Reply Last reply Reply Quote 0
                          • sissiwup
                            sissiwup @jomjol last edited by

                            @jomjol
                            Hallo,

                            tesseract hat es bei meinen Tests nicht so sehr gebracht.
                            Habe aber die Bildoptimierung in den normalen Zweig eingebaut. Damit sind bei mir die Ergebnisse besser.
                            Natürlich sollte man das Modell dann auch auf solch optimierten Bildern trainieren.

                            Habs als Pullrequest eingestellt.

                            sissiwup 1 Reply Last reply Reply Quote 0
                            • sissiwup
                              sissiwup @sissiwup last edited by sissiwup

                              Hallo,

                              wer mal gerne mit einigen Optimierungen testen möchte:

                              Anmelden an docker (z.B. um orginal Datei zu sichern):

                              docker exec -it wasser bash
                              

                              Datei nach Docker kopieren:

                              docker cp ReadDigitalDigitClass.py wasser:/lib/ReadDigitalDigitClass.py
                              

                              (wasser ist dabei bei mir der Name des Docker-Files)

                              und natürlich neustarten

                              docker restart wasser
                              

                              ReadDigitalDigitClass.py

                              sissiwup 1 Reply Last reply Reply Quote 0
                              • sissiwup
                                sissiwup @sissiwup last edited by sissiwup

                                Hallo,

                                nochmal ein Tipp zur Ausrichtung der analogen Zeiger:

                                roi.jpg

                                Es ist nicht wichtig den Kreis genau um die Ziffern zu legen.
                                Das Kreuz sollte genau auf der Achse des Zeigers sein.
                                Auf dem Bild sieht man, dass durch die nahe Kamera da einiges an Verzerrung entsteht.

                                @jomjol Zum Ausrichten wäre es besser ein Kreuz in die Quadrate zu zeichnen. Der Kreis hilft nicht so sehr.

                                W J 2 Replies Last reply Reply Quote 0
                                • Atifan
                                  Atifan last edited by Atifan

                                  Hi. Ansich funktioniert die Erkennung bei mir wunderbar. Außer wenn eine digitale Ziffer wechselt, dann gibt es Probleme.
                                  Hatte heute den Fall.
                                  Zähler 381,6961
                                  Die Ziffer 1 von "381" ist dann schon nicht mehr richtig sichtbar, sondern steht schon fast auf 2.
                                  Bis dahin funktioniert die Fehlerkorrektur.
                                  Jetzt kommt aber der Punkt wo die Ziffer umspringt auf 2.
                                  Dann hätte ich kurzzeitig 382.xxxx.
                                  Geloggt wird dann auch dieser Wert.
                                  Dann springen die Nachkommastellen auf 0 und der neue Wert ist kleiner als der vorherige.
                                  Dann wird solange nicht geloggt, bis die Nachkommastellen wieder stimmen.
                                  Ich hoffe ihr versteht was ich meine.
                                  Das Problem hatte ich schon mehrmals.
                                  Ich habe jetzt in der config eingestellt, dass ein Rückwärtssprung erlaubt ist.
                                  Hoffe nur das beeinflusst dann nicht meine Logging-Werte falsch.

                                  Hier ein Screenshot mit den geloggten Werten. Dort erkennt man schön den Wechsel, wo auf einmal die Vorkommastelle um 1 erhöht wird, die Nachkommastellen aber noch nicht auf 0 sind.

                                  d7c8aa78-2ac2-43af-9eb0-8910dff7d448-image.png

                                  pfried 1 Reply Last reply Reply Quote 0
                                  • coyote
                                    coyote Most Active last edited by

                                    @sissiwup ich habe dein Script im Einsatz und habe es eigentlich so verstanden, dass damit auch keine kleineren Zählerstände entstehen oder sehe ich das falsch?
                                    Hier mal die History Tabelle, die zeigt, dass doch kleinere Zählerstände geloggt werden und ich glaube deshalb funktioniert auch der Datenpunkt in Sourceanalytix nicht.
                                    Anbei noch das Script dazu:

                                    createState('javascript.0.Wasserzaehler.Stand',"");
                                    createState('javascript.0.Wasserzaehler.Log',"");
                                    
                                     
                                    schedule('*/10 * * * *', function () {
                                     
                                    if (isNaN(Number(getState('javascript.0.Wasserzaehler.Stand').val))) {
                                        log("Set NaN!!!!","warn");
                                    } else {
                                        var url = "http://192.168.66.38:3000/setPreValue?value="+getState('javascript.0.Wasserzaehler.Stand').val;
                                     
                                        request(url, function(error, response, body) {
                                            if (body){
                                                log("Set OK:"+ body,"info");
                                            }
                                            else
                                            {
                                                log("Set fehlerhaft:" +url+"->"+ body,"warn");
                                            }
                                        })
                                    }
                                     
                                    var url = "http://192.168.66.38:3000/wasserzaehler.html?usePreValue";
                                     
                                    request(url, function(error, response, body) {
                                        if (body){
                                            var count=String(body.match(/^[0-9.N]+/));
                                            var err=body.search("Error");
                                            var org=count;
                                            if (err>=0) {
                                                org= String(body.match(/[0-9.N]+$/));
                                                var oar = org.split(".");
                                                var last = String(getState('javascript.0.Wasserzaehler.Stand').val);
                                                var lar= last.split(".");
                                                var calc = lar[0]+"."+oar[1];
                                                if (Number(calc)<Number(last) && (Number("0."+oar[1])<0.1) && (Number("0."+lar[1])>0.9)){
                                                    	calc=(String(Number(lar[0])+1))+"."+oar[1];
                                                  }
                                                  log("Body Calc:"+calc,"info");
                                                  count=calc;
                                            }
                                            if (isNaN(Number(count))) {
                                                log("Body OK/NaN:"+body,"warn");
                                            } else {
                                                log("Body OK:"+body+"->" + count,"info");
                                                setState("javascript.0.Wasserzaehler.Stand",count);
                                            }
                                            setState("javascript.0.Wasserzaehler.Log",String(body));
                                        }
                                        else
                                        {
                                            log("Body fehlerhaft:" +url+"->"+ body,"warn");
                                        } 
                                    }) 
                                    }); 
                                    

                                    Wasser_tabelle.JPG

                                    Den Tip zur Ausrichtung der Analogen Zeiger werde ich mal noch testen.

                                    1 Reply Last reply Reply Quote 0
                                    • pfried
                                      pfried @Atifan last edited by

                                      @Atifan Dieses Verhalten sollte aber durch den Aufruf mit: xxx.xxx.xxxx.xxx:3000/wasserzaehler.html?usepreValue
                                      nicht passieren......

                                      Atifan 1 Reply Last reply Reply Quote 0
                                      • W
                                        watcherkb @sissiwup last edited by

                                        @sissiwup danke für den Tip. Habe ähnlichen Zähler wie du und noch Probleme mit den Zeigern. Werde das mal probieren.

                                        1 Reply Last reply Reply Quote 0
                                        • Atifan
                                          Atifan @pfried last edited by Atifan

                                          @pfried sagte in Wasserzähler - Selfmade:

                                          @Atifan Dieses Verhalten sollte aber durch den Aufruf mit: xxx.xxx.xxxx.xxx:3000/wasserzaehler.html?usepreValue
                                          nicht passieren......

                                          Hi, ist aber passiert. Ich nute ja das usepreValue. Das funktioniert ja auch. usepreValue bewirkt ja nur, dass solange ein "alter" Wert genommen wird, bis die Ziffer wieder lesbar ist und eine plausible Zahl ergibt. usepreValue verhindert aber nicht, dass falsche Werte geschrieben werden.
                                          Im Grunde genommen funktioniert die Bildauswertung ja auch richtig. Das Problem ist, dass die Nachkommastellen erst 0000 erreichen, nachdem die digitalen Ziffern umgseprungen sind.

                                          J 1 Reply Last reply Reply Quote 0
                                          • J
                                            jomjol @sissiwup last edited by

                                            @sissiwup ich habe in der Mitte so ein kleines Kreuz. Meinst du, dass ich es größer machen soll?

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            563
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            how-to wasser wasserzähler
                                            48
                                            1089
                                            310784
                                            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