Ankündigung

Einklappen
Keine Ankündigung bisher.

Verbrauchszähler / Wasseruhr mit binärem Item

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Verbrauchszähler / Wasseruhr mit binärem Item

    Hallo,

    ich möchte meine analoge Wasseruhr mit einbinden. Dazu habe ich einen Reed-Kontakt auf der Uhr befestigt, der von dem Magneten auf dem 0,1m³ Rädchen betätigt wird. Somit wird alle 50l der Reed-Kontakt geöffnet bzw. geschlossen. Das ganze hängt an einem KNX Binäreingang bzw. Tasterschnittstelle. Der Eingang der Tasterschnittstelle kann nur definierte Werte (0, 1 etc) senden. Er hat keinen integrierten Zähler. Aktuell habe ich es so eingestellt, dass immer eine 1 gesendet wird.

    Ich möchte nun in shNG die Impulse zählen und den Zählerstand berechnen.

    Aktuell habe ich es so implementiert.
    Code:
    wasserzaehler:
    
        bezug:
            type: num
            knx_dpt: 1
            knx_cache: 0/6/5
            cache: yes
            on_update: round(.zaehlerstand = sh..zaehlerstand() + 0.05, 2)
    
            zaehlerstand:
                type: num
                visu_acl: 'rw'
                database: 'init'
    Jetzt wird hier geschrieben, dass ein Neustart alle Items triggert, was den Zählerstand verfälschen würde.

    Wie habt ihr das gelöst bzw. mit welchen Items würdet ihr das realisieren?

    Danke für Eure Hinweise!

    Michael

    PS: Hier gibt es ein altes Plugin, was genau das zu tun scheint. Ist das auch Teil von shNG?
    Zuletzt geändert von Sisamiwe; 10.11.2019, 21:05.

    #2
    Wenn du bei   bezug  das   cache  weglässt und   knx_cache  durch   knx_listen  ersetzt, müsste das Item beim Start mit 0 statt mit 1 initialisiert werden.
    Im   on_update  kannst du dann explizit nur auf 1 reagieren mit   .zaehlerstand = round(sh..zaehlerstand() + 0.05, 2) if sh..() else None .

    P.S.: Das   round  in deinem   on_update  steht an der falschen Stelle (vergleiche meinen Ausdruck oben).

    P.P.S.: Das   round  macht da allgemein wenig Sinn. Wozu rundest du, wenn du eh nur eine Zahl mit zwei Dezimalstellen hinzuzählst?

    P.P.P.S.: Der Typ von   bezug  sollte   bool  sein.

    Kommentar


      #3
      smai
      Vielen Dank. Ich habe die Verbesserungen eingebaut. Klappt nun besser.

      So sieht es nun aus:
      Code:
      wasserzaehler:
      
          bezug:
              type: bool
              knx_dpt: 1
              knx_listen: 0/6/5
              on_update: .zaehlerstand = round(sh..zaehlerstand() + 0.05, 2) if sh..() else None
      
              zaehlerstand:
                  type: num
                  visu_acl: 'rw'
                  database: 'init'
      Das wäre auch was für die Doku unter Tipps&Tricks

      Beste Grüße

      Kommentar


        #4
        OT: poste doch mal ein Photo vom Aufbau bzw. den Typ vom Wasserzähler und Reedkontakt

        Kommentar


          #5
          gama ma

          Gern.
          Hier ein Bild vom "nackten" Wasserzähler:
          IMG_20170409_143332.jpg
          Auf dem Drehrad 0,01 siehst Du den Magenten, der sich mit dem Rad dreht.

          Hier das Bild vom "bestückten" Wasserzähler:
          IMG_20191115_211834.jpg Da ist der Reedkontakt direkt über dem Magenten fixiert. Der Magent schaltet alle 2x pro Radumdrehung um, also lassen sich 50l erfassen.
          Klappt ganz gut.

          Michael

          Kommentar


            #6
            Zitat von Sisamiwe smai Beitrag anzeigen
            Das wäre auch was für die Doku unter Tipps&Tricks

            Hallo Michael,

            leider führt der Link ins Nichts.

            Hast Du die "bis zur Nachrüstung des Reedkontaktes verbrauchten Liter" irgendwo addiert oder hast du den Stand ab dort als "0" genommen. Sprich - zeigt dir SHNG den realen Wert der Wasseruhr oder nicht?

            Kommentar


              #7
              Hast Du mal in der User Doku in die Suche Items Tipps und Tricks eingegeben?

              Der erste Eintrag führt Dich auf die Seite https://www.smarthomeng.de/user/beispiele/items_tipps_und_tricks.html. Das ist vermutlich die Seite, die Sisamiwe gemeint hat.
              Viele Grüße
              Martin

              There is no cloud. It's only someone else's computer.

              Kommentar


                #8
                Msinn

                hatte ich nicht. Allerdings habe ich die Seite schon mehrmals durchgesehen (wenn ein neues Problem auftaucht). Aber so eine richtige Lösung wie ich einem Zähler einen Startwert mitgeben kann habe ich nicht gefunden.

                Kommentar


                  #9
                  Zitat von Maexle Beitrag anzeigen
                  Msinn

                  ... Aber so eine richtige Lösung wie ich einem Zähler einen Startwert mitgeben kann habe ich nicht gefunden.
                  Ich verwende hierfür das Admin-Webinterface:
                  https://www.smarthomeng.de/user/admi...html#item-baum

                  Über den Item-Baum wähle ich den absoluten Zähler aus und editiere den Wert direkt auf der Webseite.
                  Voraussetzung ist, dass für den absoluten Zähler-Item Cache = True gesetzt wurde. (Damit dieser beim Neustart erhalten bleibt)

                  Siehe Absatz 13 : https://www.smarthomeng.de/user/refe...f_startup.html

                  Es wird für jedes definierte Item ein Objekt erzeugt. Der Wert des Items wird aus den folgenden Quellen (in der angegebenen Reihenfolge) initialisiert:
                  • ..
                  • aus dem Cache, falls das Attribut cache auf True gesetzt ist.
                  • ...
                  Über das Admin-Webinterface Item-Tree lassen sich somit auch kleine Abweichung zur Laufzeit korrigieren.

                  Kommentar


                    #10
                    Zitat von KHome Beitrag anzeigen
                    Über den Item-Baum wähle ich den absoluten Zähler aus und editiere den Wert direkt auf der Webseite.
                    das hatt ich zu Anfangs schon versucht - aber der Wert wurde nur so lange gehalten bis vom KNX wieder was kam.
                    Könntest Du Deine Item(s) hier einstellen?

                    Danke

                    Kommentar


                      #11
                      Zitat von Maexle Beitrag anzeigen

                      das hatt ich zu Anfangs schon versucht - aber der Wert wurde nur so lange gehalten bis vom KNX wieder was kam.
                      Ich nutze hierfür 3 Items:
                      • Einen Tageszähler, der immer wieder von KNX überschrieben wird,
                      • einen Reset-Befehl, der den Tageszähler des Binäreingangs zurücksetzt
                      • und einen absoluten Zählerstand, der den Wert des Tageszählers vor dem Reset akkumuliert. Diesen absoluten Zählerstand habe ich per Admin-Website initial gesetzt
                      Eine Logik, die per Cron jede Nacht ausgelöst wird, verarbeitet die 3 zuvor genannten Items
                      (Die Einrückung sollte noch angepasst werden - ist beim Einfügen verloren gegangen)

                      Code:
                      verbraucher:
                      
                       wasser_tageszaehler:
                        name: Wasserzaehler Binaereingang
                        type: num
                        sqlite: 'yes'
                        knx_dpt: 13
                        knx_listen: x/x/x
                        knx_init: x/x/x
                        enforces_updates: 'true'
                        cache: 'true'
                      
                       wasser_reset:
                        name: Wasserzaehler Reset
                        type: bool
                        sqlite: 'yes'
                        knx_dpt: 1
                        knx_listen: x/x/y
                        knx_send: x/x/y
                        enforces_updates: 'true'
                      
                       wasser_absolute_m3:
                        name: Wasserzahler absolute m3, offset inkl
                        type: num
                        sqlite: 'yes'
                        enforces_updates: 'true'
                        cache: 'true'
                      Folgende einfache Logik steuert den Tageszähler und passt gleichzeitig einen Faktor für die Summenbildung an.
                      Code:
                      #!/usr/bin/env python3
                      # wasserzaehler_sum.py
                      import time
                      
                      control_item_name = trigger['source']
                      triggered_by = trigger['by']
                      trigger_value = trigger['value']
                      logger.warning("LOGIC {0} triggered from source {1} by {2} with value {3}".format(logic.name, control_item_name, triggered_by,trigger_value))
                      
                      myday_sum=sh.verbraucher.wasser_tageszaehler()
                      mytotal = sh.verbraucher.wasser_absolute_m3()
                      # 06.Jan.2022 (9:37) - xxx.xx qm
                      # 07.Jan.2022 (12:30) - xxx.xx qm
                      
                      # reset day value
                      sh.verbraucher.wasser_reset(True)
                      time.sleep(2)
                      sh.verbraucher.wasser_reset(False)
                      
                      mynewtotal = mytotal+ myday_sum / 100 # faktor angepasst
                      sh.verbraucher.wasser_absolute_m3(mynewtotal)
                      Ich hoffe, dass Dir dieser Ansatz hilft.

                      (Es ist sicherlich auch möglich alles direkt in einer Item-Logik (eval...) zu realisieren - Alternative Lösungsvorschläge sind gerne willkommen)

                      Kommentar


                        #12
                        Zitat von KHome Beitrag anzeigen
                        Es ist sicherlich auch möglich alles direkt in einer Item-Logik
                        oder direkt in Items:

                        Code:
                        %YAML 1.1
                        ---
                        wasserzaehler:
                            zaehlerstand:
                                type: num
                                visu_acl: ro
                                database: init
                                eval: sh.wasserzaehler.zaehlerstand.zaehlerstand_offset() + sh.wasserzaehler.zaehlerstand.zaehlerstand_knx()
                                eval_trigger:
                                  - wasserzaehler.zaehlerstand.zaehlerstand_knx
                                  - wasserzaehler.zaehlerstand.zaehlerstand_offset
                                # enforce_change: yes
                                # crontab: 59 23 * * = 1
                                struct: my.wertehistorie.total
                            
                                zaehlerstand_knx:
                                    type: num
                                    knx_dpt: 12
                                    knx_cache: 5/3/4
                                    eval: round(value/1000, 1)
                                    cache: yes
                                    
                                    zaehlerstand_knx_reset:
                                        type: bool
                                        knx_dpt: 1
                                        knx_send: 5/3/6
                                        knx_cache: 5/3/6
                                        enforce_updates: yes
                                
                                zaehlerstand_offset:
                                    name: Zählerstand der Wasseruhr bei KNX-Zähler = 0
                                    type: num
                                    initial_value: 725.6
                                    cache: yes

                        Kommentar


                          #13
                          Danke an euch beide.

                          KHome Danke Dir - allerdings habe ich mich für den Code von Sisamiwe entschieden. (da ich diesen noch halbwegs verstehe)


                          Das "struct" hat eine Fehlermeldung erzeugt
                          Code:
                          ERROR: struct 'my.wertehistorie.total' not found!
                          was ja auch irgendwie logisch ist, da die "Datei" bei mir nicht existiert. Hab die Zeile auskommentiert "#"
                          Die Doku zu struct habe ich gelesen - aber verstehen tue ich das überhaupt nicht...


                          Interessant finde ich den Eintrag: initial_value:
                          Evtl. hätte mir das bei meinen zahlreichen Versuchen schon geholfen... irgendwann habe ich das Wirrwar der Items nicht mehr überblickt und alle in die Tonne geklopft...

                          Was mir darüber hinaus auch unklar ist, wo kommt das Signal für "zaehlerstand_knx_reset: " her?
                          Ich habe mir dafür einen Schalter in die Visu gelegt
                          Code:
                          basic.flip
                          O.T. gibt es eigentlich die Möglichkeit einen "Taster" in der Visu zu erstellen?



                          Danke Euch

                          Kommentar


                            #14
                            Zitat von Maexle KHome Sisamiwe Beitrag anzeigen
                            Die Doku zu struct habe ich gelesen - aber verstehen tue ich das überhaupt nicht.
                            Das struct ist wie eine Art Item-Template. D.h. an der Stelle, wo in der item-definition (item.yaml) ein struct eingesetzt wird, wird beim Start von shNG an dieser Stelle der Inhalt des structs eingefügt.

                            Zitat von Maexle KHome Sisamiwe Beitrag anzeigen
                            nteressant finde ich den Eintrag: initial_value:
                            Das ist in der Docu auch beschrieben. initial_value ist der Wert den das Item inital bei start einnimmt. Der initial_value ändert sich zu auch mit der Laufzeit nicht.
                            value dagegen hat mehrere Bedeutungen. Zum einen ist es auch der Startwert, aber value fungiert danach als Zwischenspeicher. value bekommt bzw. den Wert beim Eingang bspw. vom KNX, und kann damit dann im bspw im eval verwendet werden. Erst nach eval wird dem Item dann der Wert von value zugwiesen. (Das ist sicher vereinfacht dargestellt).
                            Zitat von Maexle KHome Sisamiwe Beitrag anzeigen

                            Was mir darüber hinaus auch unklar ist, wo kommt das Signal für "zaehlerstand_knx_reset: " her?
                            Per shNG oder smartvisu kann ich das item triggern und dann setzt das Item den Befehl zum Reset des Zählers auf den KNX.

                            Zitat von Maexle KHome Sisamiwe Beitrag anzeigen
                            O.T. gibt es eigentlich die Möglichkeit einen "Taster" in der Visu zu erstellen?
                            Ich nutze den "basic.stateswitch". Diese sendet beim Drücken eine "1". Der kommt im Item an. Nun ist es wichtig, dass das Item in shNG auch das Attribut
                            Code:
                            enforce_updates: yes
                            hat. Das stellt sicher, dass der Wert auch dann verarbeitet wird, wenn das Item dem gleichen Wert bereits hat.
                            Bsp: Der Itemwert ist 0. Nun drückst du den stateswitch. Dieser sendet eine 1. Damit ändert sich der Wert im Item von 0 auf 1. Da sich der Wert geändert hat, wird der Wert verabeitet und bspw auf den KNX gesendet. Drückst Du nun wieder den stateswitch, sendet der wieder eine 1 auf das Item. Das das Item den gleichen Wert schon hat, wird per Standard dieser Wert nicht verarbeitet. Wenn das passieren soll, muss enforce_updates: yes gesetzt sein. Ist dem so, wird auch bei beim Update des Items auch ohne dessen Änderung der Wert verarbeitet und auch gesendet.
                            Verstanden?

                            Kommentar


                              #15
                              Nur mal so nebenbe weils zu dem Thema passt:schonmal von AI on the edge gehört?

                              https://github.com/jomjol/AI-on-the-edge-device

                              https://www.youtube.com/watch?v=mDIJEyElkAU

                              Das ganze ist etwas genauer als den Impuls auszulesen.

                              Kommentar

                              Lädt...
                              X