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.
    • E
      el_kassi @jomjol last edited by

      @jomjol alles klar.

      Schwarzer Hintergrund kann leider etwas dauern, da das die Vorkommastellen sind.
      Du erwähntest irgendwo 3-4 Bilder pro Ziffer. Sollten die dann von verschiedenen Stellen sein, da sie sich ja ggf (Winkel, Licht) leicht unterscheiden? Und brauchst du die auch mit verschiedenem Drehwinkel, also Bilder, wo die 2 zwar komplett zu sehen ist, aber mal mittig, mal am oberen Rand, mal am unteren? Das könnte dann noch länger dauern.

      Roter Hintergrund dürfte bald durch sein, zumindest wenn du sie nicht von jeder Stelle brauchst, sondern die letzte und ggf. vorletzte ausreicht.

      Zwecks Wertigkeit: kein Thema, dafür nehm ich mir mal die Zeit. Will es ja zum Laufen bekommen 😉

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

        @el_kassi Unterschiedliche Beleuchtung etc. ist wichtiger wie die Variation der genauen Position innerhalb eines ROIs.
        Letzteres kompensiere ich durch einen random Shift während des Trainings (zusätzlich zu Streckung und Intensität). Das macht das neuronale Netz in Summe stabiler gegenüber der genauen Ausrichtung der ROIs. Scheint sich auch zu bewähren, denn bei fast allen Usern liefert es auf Anhieb ganz gute Ergebnisse.

        Du kannst mir auch gerne einfach mal einen Zwischenstand schicken, wenn die Datenerfassung länger dauert. Ich kann mit wenig Aufwand alle 2-3 Wochen mal ein Update für die tflite-Files erstellen. Bei mir ist alles eingerichtet.

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

          @all es gibt eine neue rolling-Version. Dort habe ich dank des Commits des github-users kassi eine deutlich bessere und schlankere Docker-Erstellung implementiert.

          Arbeitsverzeichnis ist jetzt "/app", anstatt "/", daher muss beim Start von Docker das Einbinden von log und config leicht modifiziert werden:

          /config --> /app/config
          /log --> /app/log

          Zusäzlicher Hinweis: wer mit Portainer seinen Docker verwaltet, muss auch händisch das Arbeitsverzeichnis updaten (auf /app).

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

            @jomjol Noch ein Hinweis: man kann jetzt mit einmalig

            docker build --tag watermeter:local -f Dockerfile_synology .
            

            und

            docker run -p 3000:3000 --mount type=bind,source=(PATH_TO_LOCAL_CONFIG,target=/app/config --mount type=bind,source=/PATH_TO_LOCAL_LOG,target=/app/log --rm --mount type=bind,source="/path/to/water-meter-system-complete/code",target=/app watermeter:local
            

            den Code bearbeiten und lokal laufen lassen (läuft bis jetzt sauber unter MacOS).
            Nach Code-Änderungen reicht ein CTRL-C und erneutes docker run ..., um den Container auf den neuesten Stand zu bringen. Neues docker build ist nicht notwendig, da das code Verzeichnis in /app gemountet ist.

            Leider reicht es in Python nicht aus, den Code einfach zu ändern, wie in anderen Sprachen bzw Frameworks, die code dynamisch nachladen können. Aber es sollte ein Geschwindigkeitsboost sein, auf das build verzichten zu können.

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

              @jomjol Kannst Du bitte nochmals darlegen, was man alles Ändern muss (auch in der config.ini) Muss man die Verzeichnisse config und log nun unter app transferieren?

              Nachtrag: Muss man im Aufruf nun überall app einfügen?

              sudo docker run -d --name wasser --restart unless-stopped -p 3000:3000 --mount type=bind,source=/home/pi/Wasserzaehler_4.2/code/app/config,target=/app/config --mount type=bind,source=/home/pi/Wasserzaehler_4.2/code/app/log,target=/app/log --memory-swap -1 jomjol/wasserzaehler:raspi-rolling
              
              
              J 1 Reply Last reply Reply Quote 0
              • J
                jomjol @pfried last edited by

                @pfried Du musst nur die Pfade im Start des Docker-Containers anpassen, so wie du es beschrieben hast:
                docker run ....,target=/app/config ...,target=/app/log ...

                In der Config.ini etc. musst du nichts ändern.

                Intern im Docker-Container liegen jetzt die Verzeichnisse nicht mehr im Root Verzeichnis /, sondern sind jetzt alle ins Unterverzeichnis /app umgezogen worden. Dass ermöglichst zum Beispiel solche Tricks, wie sie @el_kassi eins weiter oben beschrieben hat. Das macht das Testen und Programmieren etwas einfacher.

                Sorry für die Umstände!

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

                  @jomjol Kein Problem, wenn man weiß was zu tun ist 😊

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

                    @jomjol Es hat mir einfach keine Ruhe gelassen und ich wollte wissen, ob ich das mit dem Neural Network auch irgendwie und ohne Vorwissen hinkriege 😁

                    Heute habe ich mir Anaconda, Tensorflow, Keras und alles was es benötigt auf meinem Laptop installiert und ein paar Bilder von der Ziffer 3 meines Zählers (die als Ziffer 1 erkannt wurde) im Verzeichnis \ziffer_sortiert_raw\3\ abgelegt.

                    1. jupyter notebook gestartet
                    2. Image_Preparation.ipynb ausgeführt
                    3. Train_CNN_Digital-Readout.ipynb ausgeführt
                    4. Neues tflite-File auf den Raspi kopiert
                    5. Docker neu gestartet

                    Resultat:

                    de7c98cc-c296-47ab-84bc-a5eac4d318a6-image.png

                    993N.662 00993N 662

                    Die 3 wird erkannt 💪 !!

                    Und das alles nur dank deiner riesigen Vorarbeit & Dokumentation! Besten Dank nochmals! Ok, ein paar Hürden gab es schon zu überwinden bis alles lief.

                    Ich werde dir später trotzdem meine gesammelten Ziffern schicken damit alle profitieren. Kann einfach etwas dauern, da sich mein Wasserverbrauch ziemlich in Grenzen hält.

                    Gruss
                    Michael

                    E 1 Reply Last reply Reply Quote 0
                    • E
                      el_kassi last edited by

                      @jomjol hier einmal mit rotem Hintergrund. rot.zip
                      Viel Variation im Licht ist nicht, da es ziemlich konstant und in einer abgeschlossenen Halterung verbaut ist.

                      1 Reply Last reply Reply Quote 0
                      • E
                        el_kassi last edited by el_kassi

                        Und hier eine erste Fuhre weiß auf schwarz. (0,2,3,4). schwarz.zip

                        Wie es ausschaut gibt's hier keine in 10, da der Zähler scheinbar sauber umspringt. Zumindest erkenne ich das so aus den Bilder, aber ist noch nicht vie Zeit ins Land gezogen.

                        Wenn noch jemand einen Sensus 620 hat, kann er gerne hier mithelfen, Bilder hochzuladen. 🙂

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

                          @el_kassi Okay, danke. Du schneidest ziemlich knapp aus. Etwas mehr Rand könnte zusätzlich helfen und macht das Bild robuster gegenüber einen Shift im Alignment.
                          Ich melde mich, wenn ich die Bilder trainiert habe.

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

                            @jomjol Ok, kann ich einstellen. Ich bin allerdings schon am Rand des Rades. Wenn ich oben/unten mehr dazu gebe, dann kommt blaue Umrandung dazu.
                            capture_with_flashlight_4000_uxga.jpg

                            Noch was: Da meine 4 bereits oft als 8 falsch erkannt wird (und andere auch), macht es wahrscheinlich Sinn, für die weiß auf schwarz/rot gelagerten Ziffern eine eigene tflite Datei anzulegen, die man dann auswählen kann. Ansonsten dürfte es schwierig werden, was erkannt wird am Ende.

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

                              @el_kassi Der blaue Rand dürfte nicht so sehr stören. Du kannst auch ein leicht anderes Aspektverhältnis wählen (einfach von Hand in der Config.ini die Größe des ROIs anpassen).
                              Eine zweite tflite ist schon ein etwas größeres Ding, da im Code fest ein digitales und ein analoges CNN hinterlegt sind. Da muss ich an den Quellcode ran.
                              Momentan bin ich gerade daran, das System direkt auf dem ESP32 zum laufen zu bekommen. Dort habe ich schon eine etwas flexiblere Implementierung gewählt und die wäre grundsätzlich leichter anpassbar. Wenn das soweit ist, könnte ich das vielleicht auch auf den Docker zurück importieren. Ist dann aber C++ statt Python.

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

                                @jomjol Ich kann in der config doch im modelfile eine tflite Wählen. Die sollte doch dann verwendet werden. Im Code wird ja auf die tflite zurückgegriffen. So nur mein Verständnis. Ich befürchte halt, dass wenn alle Ziffern in einer Datei zusammengefasst sind, dass das System hier Fehlalarm schlägt, da er jetzt schon statt einer weiß-auf-schwarz 4 eine schwarz-auf-weiß 8 erkennt.

                                Ich bin gerade parallel dabei, die Python Version etwas zu modifizieren. Hauptsächlich refactorings, die wir natürlich besprechen müssten.
                                Das Ganze bräuchte ich, um einen Zähler mit Vor- und Nachkommazahlen zu betreiben.
                                Auf dem ESP wäre das natürlich auch willkommen, wenn das ginge. Allerdings ist das schwieriger zu aktualisieren, da mann dafür den ESP jedesmal rausnehmen, oben anschließen, programmieren und wieder einsetzen muss. Geht auch, aber der Entwicklungszyklus ist definitiv länger, wenn man das häufiger machen muss.
                                Bin gespannt.
                                Wenn du reviews benötigst, gib bescheid. Meinen github account kennst du ja.

                                1 Reply Last reply Reply Quote 0
                                • E
                                  el_kassi last edited by el_kassi

                                  Wäre das hier ein besserer Schnitt?
                                  Bildschirmfoto 2020-06-24 um 18.31.10.png
                                  Oder geht das zu weit runter? Hab versucht, mich an die 23% und 78% zu halten. Die 3 an Pos. 5 ist warum auch immer recht tief und der blaue Rand hat da eine Wölbung. Ist dann aber auch weiß mit auf dem Bild ganz unten.

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

                                    @el_kassi Enschuldige die später RM, ich war ein paar Tage offline. Von der Größe der Zahlen passt das. Ich würde die ROIs noch etwas nach oben setzen, so dass die Zahlen mittig sind.

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

                                      @jomjol
                                      Hi, ich habe seit heute das Problem dass der Server mir beim Aufruf über http://192.168.1.36:3000/wasserzaehler.html nichts liefert. Die Seite bleibt leer. Der Parser-Adapter meckert auch:

                                      Cannot read link "http://192.168.1.36:3000/wasserzaehler.html": {"statusCode":200,"body":"","headers":{"server":"BaseHTTP/0.6 Python/3.7.4","date":"Tue, 30 Jun 2020 12:10:00 GMT","content-type"
                                      

                                      Der Aufruf http://192.168.1.36:3000/wasserzaehler.html&full funktioniert, hat aber die 6 falsch erkannt (letztes tf-file)

                                      2020-06-30_1504.png

                                      Server und ESP sind bereits neu gestartet. Eine Idee was es sein kann?

                                      J W 2 Replies Last reply Reply Quote 0
                                      • J
                                        jomjol @watcherkb last edited by

                                        @watcherkb Ist das genau der Output von "...&full" oder hast du die erste Reihe einfach nicht ausgeschnitten?

                                        Normalerweise stehen dort auch die Ziffern in der ersten Reihe und erst dann kommen die Bilder. Wäre ein Hinweis, wo ich suchen könnte. So einen Fehler hat noch keiner berichtet.

                                        P.S.: ich würde etwas mehr Rand um die Ziffern lassen, dann ist die Bilderkennung etwas stabiler.

                                        W 2 Replies Last reply Reply Quote 0
                                        • W
                                          watcherkb @jomjol last edited by

                                          @jomjol in der ersten Reihe sind auch keine Ziffern, und das große Gesamtbild habe ich auch nicht gescreenshotet.

                                          Danke werde es anpassen

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

                                            @jomjol heute gehts wieder obwohl ich nichts verändert habe. Einzig die 6 die gestern als 8 berechnet wurde, ist heute korrekt. Evtl. liegt es dadran? Anbei Screenshot und meine Settings:

                                            2020-07-01_1445.png

                                            [Imagesource]
                                            timeoutloadimage = 30
                                            #ip durch die ip des esp32 ersetzen!
                                            urlimagesource = http://192.168.1.209/capture_with_flashlight?quality=25&size=svga
                                            logimagelocation = ./log/source_image
                                            #logonlyfalsepictures=false
                                            
                                            [ConsistencyCheck]
                                            enabled = False
                                            #stores the last value in a file for the case of a restart (e.g. docker container after update)
                                            readprevaluefromfileatstartup = True
                                            #maximum time spanning since last startup for use of prevalue from filestorage in minutes
                                            readprevaluefromfilemaxage = 30
                                            allownegativerates = true
                                            #maximum change of new to old value (+ or -)
                                            maxratevalue = 0.5
                                            #return in case of error: value = oldvalue or newvalue
                                            #                         errormessage = return text with problem (seperated by tabstopp) if nothing, then no error message
                                            #                         readout = real readout without corrections (newvalue)
                                            errorreturn = errormessage
                                            
                                            [AnalogReadOut]
                                            #if enabled analog counters will be read, if disabled only digital counters will be read.
                                            enabled = True
                                            
                                            [alignment]
                                            initial_rotation_angle = 180.0
                                            
                                            [alignment.ref0]
                                            image = ./config/ref0.jpg
                                            pos_x = 51
                                            pos_y = 125
                                            
                                            [alignment.ref1]
                                            image = ./config/ref1.jpg
                                            pos_x = 611
                                            pos_y = 59
                                            
                                            [alignment.ref2]
                                            image = ./config/ref2.jpg
                                            pos_x = 362
                                            pos_y = 398
                                            
                                            [Digital_Digit]
                                            names = ziffer1, ziffer2, ziffer3, ziffer4, ziffer5
                                            modelfile = ./config/neuralnets/Train_CNN_Digital-Readout_Version_6.1.2.tflite
                                            logimagelocation = ./log/digital_digit
                                            #lognames=
                                            
                                            [Analog_Counter]
                                            names = zeiger1, zeiger2, zeiger3, zeiger4
                                            modelfile = ./config/neuralnets/CNN_Analog-Readout_Version-6.2.0.tflite
                                            logimagelocation=./log/analog_counter
                                            #lognames=
                                            
                                            [Analog_Counter.zeiger1]
                                            pos_x = 572
                                            pos_y = 174
                                            dx = 158
                                            dy = 158
                                            
                                            [Analog_Counter.zeiger2]
                                            pos_x = 486
                                            pos_y = 344
                                            dx = 155
                                            dy = 155
                                            
                                            [Analog_Counter.zeiger3]
                                            pos_x = 329
                                            pos_y = 423
                                            dx = 156
                                            dy = 156
                                            
                                            [Analog_Counter.zeiger4]
                                            pos_x = 101
                                            pos_y = 352
                                            dx = 168
                                            dy = 168
                                            
                                            [Digital_Digit.ziffer1]
                                            pos_x = 174
                                            pos_y = 6
                                            dx = 48
                                            dy = 86
                                            
                                            [Digital_Digit.ziffer2]
                                            pos_x = 258
                                            pos_y = 7
                                            dx = 49
                                            dy = 88
                                            
                                            [Digital_Digit.ziffer3]
                                            pos_x = 345
                                            pos_y = 5
                                            dx = 50
                                            dy = 89
                                            
                                            [Digital_Digit.ziffer4]
                                            pos_x = 430
                                            pos_y = 8
                                            dx = 48
                                            dy = 85
                                            
                                            [Digital_Digit.ziffer5]
                                            pos_x = 516
                                            pos_y = 7
                                            dx = 46
                                            dy = 83
                                            
                                            
                                            
                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            782
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

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