Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Hardware
    4. WMZ Sharky 775 einbinden

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    WMZ Sharky 775 einbinden

    This topic has been deleted. Only users with topic management privileges can see it.
    • A
      agsteffan @flispy last edited by

      Hallo @flispy,

      ich habe ein ähnliches Problem. Mein Sharky 755 lässt sich optische auch nicht auslesen.
      Und das obwohl ich es mit LorusFree und anderen Tools schon versucht habe.
      Am Weidmann Optokopf dürfte es auch nicht liegen. So langsam gehen mir die Ideen aus.

      Das Schloss im Display bedeutet nach der Diehl Anleitung nur das es sich um einen "geeichten Wert handelt, mit dem die Abrechnung erfolgen darf".

      Gruß,
      Andreas

      1 Reply Last reply Reply Quote 0
      • T
        Tom H. last edited by

        Hi @flispy und @agsteffan - seid ihr irgendwie voran gekommen? Habe einen Techem Ultra S3 (sollte auch ein Sharky
        775 sein) aber bis dato keinen Erfolg diesen auszulesen 😞

        W S 2 Replies Last reply Reply Quote 0
        • W
          wavoigt @Tom H. last edited by

          Hi,
          hab im Netz folgende Kommunikationsbeschreibung gefunden, vielleicht hilfts...
          SHARKY 775. Kommunikationsbeschreibung.pdf
          Viele Grüße,
          Walter

          1 Reply Last reply Reply Quote 0
          • S
            sharky @Tom H. last edited by

            Hallo @tom-h ,
            die optische Schnittstelle muss erst getriggert werden, indem diverse 0x55-Bytes bei 2400 Baud gesendet werden. Ich denke, ich komme im Laufe der zwei nächsten Wochen dazu, das in Python zu implementieren, da ich demnächst die nötige Hardware verfügbar habe. Oder hast Du schon eine fertige Lösung gefunden?
            Grüße Marco

            D 1 Reply Last reply Reply Quote 0
            • D
              darkblu @sharky last edited by

              @sharky ,
              das hört sich gut. Halte uns bitte auf dem laufenden.

              S 1 Reply Last reply Reply Quote 0
              • S
                sharky @darkblu last edited by

                @darkblu Mit einem Raspberry Pico W habe ich jetzt erfolgreich die Daten ausgelesen. Siehe https://github.com/mh-g/ultramess/tree/main

                Die von wavoigt verlinkte Kommunikationsbeschreibung ist veraltet, im github-Projekt verlinke ich einen neueren Stand der auch zu der Firmware meiner Ultramess / Sharky 775 passt. Ergänzende weitere Dokumente zu Meterbus sind aber trotzdem nötig. (Eine wirklich originelle Schnittstelle, die von WDV Molliné auch noch schlecht beschrieben ist.)

                F 1 Reply Last reply Reply Quote 0
                • F
                  flispy @sharky last edited by

                  @sharky das hört sich interessant an. Da ich ich keinen Rasperry habe: könnte ich das auch von einem Intel NUC ausführen?

                  S 1 Reply Last reply Reply Quote 0
                  • S
                    sharky @flispy last edited by

                    @flispy Bei den NUCs kenne ich mich inzwischen nicht mehr so aus. Letzten Endes benötigt man ein Gerät mit digitalen Inputs/Outputs oder serieller Schnittstelle. Ein Raspberry Pico W kostet gerade mal 7 Euro plus Porto -- und man riskiert maximal den Pico W, wenn man was falsch verdrahtet. Vielleicht einfach einen anschaffen?

                    F 1 Reply Last reply Reply Quote 0
                    • F
                      flispy @sharky last edited by

                      @sharky Also ich habe einen Volkszähler per USB an dem Intel NUC. Ich hätte nun gesagt, dass das irgendwie reichen muss. Ich verstehe nur noch nicht, wie ich nun dein Projekt darauf laufen lassen kann/muss. Python ist installiert. Im ersten Schritt wäre es also einfach interessant, ob ich die Verbindung herstellen kann.
                      Könntest du mich unterstützen was ich machen muss um dein Script auszuführen und mein NUC auch weiß, welchen USB Port er nutzen soll?

                      S 1 Reply Last reply Reply Quote 0
                      • S
                        sharky @flispy last edited by

                        @flispy Ich nehme mal an, dass der Volkszähler eine normale serielle Schnittstelle bereitstellt (also "COMxxx" unter Windows bzw. "/dev/ttyUSBxxx" unter Linux). Dann kannst Du das folgende Programm mal ausprobieren, Du musst nur ganz unten ggf. das "/dev/ttyUSB0" in Zeile 86 durch das in Deinem Fall richtige ersetzen. Außerdem muss mit

                        pip install pySerial
                        

                        noch die Bibliothek für serielle Schnittstellen für Python installiert werden.

                        Keine Erfolgsgarantie, ich habe es nur so trocken heruntergeschrieben ...

                        import serial
                        import time
                        import binascii
                        
                        
                        # === mbus_checksum ===============================================================================
                        def mbus_checksum(data, skip):
                            sum = 0
                            for i in range(0, len(data)):
                                if i >= skip:
                                    sum = sum + int(data[i])
                            return bytearray([sum & 255])
                        
                        
                        # === check_result ================================================================================
                        def check_result(where, ser):
                            result = ser.read(1)
                            if result == b'\xe5':
                                return True
                            else:
                                if result is None:
                                    return True
                                else:
                                    print(f'{where}: bad answer: {binascii.hexlify(bytearray(result), " ")}')
                                    return False
                        
                        
                        # === get_data ====================================================================================
                        def get_data(ser):
                            # 2.5: at 2400, 8N1 to send 2.2s of alternating bits
                            ser.write(b'\x55' * 528)
                        
                            # time.sleep(2.0) # 2.0s sleep -> 0.8s break -> 1.2s until the buffer is empty ...
                            time.sleep(1.2 + 170.0 / 2400.0)
                        
                            # 2.3: change parity
                            ser.parity=serial.PARITY_EVEN
                        
                            # 2.7.1: do selection, use jokers for serial, manufacturer, ID, medium
                            # 17 chars, 0.08s outgoing
                            selection = b'\x68\x0B\x0B\x68\x53\xFD\x52\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF'
                            ser.write(selection)
                            ser.write(mbus_checksum(selection, 4))
                            ser.write(b'\x16')
                            # result arrives after 0.19s - 0.30s
                            check_result('Selection', ser)
                        
                            # 3.1: do application reset 0x50 (to read instant values)
                            # 10 chars, 0.05s outgoing
                            app_reset = b'\x68\x04\x04\x68\x53\xFD\x50\x50'
                            ser.write(app_reset)
                            ser.write(mbus_checksum(app_reset, 4))
                            ser.write(b'\x16')
                            # result arrives after 0.08s
                            check_result('Application reset', ser)
                        
                            # 3.2: do read data
                            # 5 chars, 0.02s
                            read_data = b'\x10\x7B\xFD'
                            ser.write(read_data)
                            ser.write(mbus_checksum(read_data, 1))
                            ser.write(b'\x16')
                            # result arrives after 0.07s, is 0.71s long (ca. 173 bytes)
                            result = ser.read(200)  # 173 bytes plus some reserves
                            if result is None:
                                print('No data received')
                            else:
                                # debug output (hex dump) of received data
                                print(f'user data bytes: {binascii.hexlify(bytearray(result), " ")}')
                        
                                # 2.7.2: do deselection
                                # 5 chars, 0.02s
                                deselection = b'\x10\x40\xfd'
                                ser.write(deselection)
                                ser.write(mbus_checksum(deselection, 0))
                                ser.write(b'\x16')
                                check_result('Deselection', ser)
                        
                                # return bytes received
                            return result
                        
                        
                        # === main ========================================================================================
                        print('Starting up ...\n')
                        # 2.5: 2400, 8N1 to send 2.2s of alternating bits, long timeout due to slow response by Ultramess
                        ser = serial.Serial("/dev/ttyUSB0", baudrate=2400, bytesize=8, parity=serial.PARITY_NONE, stopbits=1, timeout=0.5)
                        
                        while True:
                            print('Reading #0')
                            result = get_data(ser)
                        
                            time.sleep(5.0)
                        
                        D Thorsten Niemann 2 Replies Last reply Reply Quote 0
                        • D
                          darkblu @sharky last edited by

                          Hallo @sharky ,
                          ich hätte ja auch Interesse meinen Sharky auszulesen.
                          Kennst du das hier:
                          Tasmota SMI

                          Wenn ich das richtig verstehe, kompiliert man sich eine Tasmota mit dem was da steht auf zB einen Wemos D1 mini,
                          kopiert das Script und verbindet einen Volkszähler mit dem D1 (keine Ahnung auf welche GPIOs).
                          Und schon hätte man das Ganze per MQTT im ioBroker.

                          Folgender Satz ist mir nicht ganz klar was damit gemeint ist:

                          This heat meter needs a wakeup sequence with 2400 Baud 8N1, wheras communication is done by 2400 Baud 8E1.
                          

                          Hört sich doch gut an, oder ?

                          1 Reply Last reply Reply Quote 0
                          • S
                            sharky last edited by

                            Hallo @darkblu, Tasmota kenne ich nur vom Hörensagen, habe aber nichts Schlechtes gehört. Der ESP32/Wemos D1 mini kommt für mich nicht in Frage, da ich mehrere Geräte auslesen will, dort aber nur eine serielle Schnittstellen wirklich frei ist. Prinzipiell sollte das aber für einen WMZ Sharky 775 funktionieren.

                            Der zitierte Satz bezieht sich auf das, was in meinem obigen Programm in den Zeilen 30-37 passiert.

                            D 1 Reply Last reply Reply Quote 0
                            • D
                              darkblu @sharky last edited by

                              Hallo @sharky ,
                              das ist schade - weil ich bin so eher der cpoy paste Anwender und hoffte, ich könnte von deinem Wissen partizipieren.
                              Aber gut, D1 Minis habe ich noch hier rumfliegen und den "Volkszähler" gibt es ja auch schon für unter 20 Euro.
                              Dann probiere ich das mal in den Weihnachtsferien aus.

                              Wenn ich das richtig deute, steht ja in dem Skript, dass die wakeup sequence mit 8N1 ausgeführt wird
                              und anschließend auf 8E1 gewechselt wird.

                              Ich werde berichten.

                              S 1 Reply Last reply Reply Quote 0
                              • S
                                sharky @darkblu last edited by

                                Hallo @darkblu,
                                ich bin gespannt auf Deine Ergebnisse. Soweit ich weiß, gibt es auch Micropython für den ESP32, vielleicht kann man das Programm ohne größere Änderung übernehmen? Mein Zeitbudget ist leider etwas knapp, da kann ich leider nicht noch eine weitere Plattform angehen.

                                W D 2 Replies Last reply Reply Quote 0
                                • W
                                  wavoigt @sharky last edited by

                                  @sharky
                                  Also mittlerweile gibt es funktionierende Tasmota Scripts für den Sharky 775 und den Hichi Lesekopf:
                                  https://www.mikrocontroller.net/topic/438972#new
                                  (nach "Sharky" suchen, so ab 23.08.2023)

                                  1 Reply Last reply Reply Quote 0
                                  • D
                                    darkblu @sharky last edited by darkblu

                                    @sharky ,
                                    ja also… die Ergebnisse waren dann gleich null.
                                    Der Hichi Lesekopf empfängt bei mir leider nix.
                                    In meinem WMZ ist auch nur eine Diode, ich habe leider keine Position für den Hichi gefunden.
                                    Ich habe den Diehl ICM-T F775.
                                    Zum gegencheck habe ich ihn kurz an meinen Stromzähler gestöpselt und sofort sprudelten die Daten.
                                    Hab dann erstmal entnervt aufgegeben.

                                    Wie @wavoigt schreibt, habe ich mich auch bei mikrocontroller.net durchgearbeitet

                                    1 Reply Last reply Reply Quote 0
                                    • Thorsten Niemann
                                      Thorsten Niemann @sharky last edited by

                                      @sharky said in WMZ Sharky 775 einbinden:

                                      @flispy Ich nehme mal an, dass der Volkszähler eine normale serielle Schnittstelle bereitstellt (also "COMxxx" unter Windows bzw. "/dev/ttyUSBxxx" unter Linux). Dann kannst Du das folgende Programm mal ausprobieren, Du musst nur ganz unten ggf. das "/dev/ttyUSB0" in Zeile 86 durch das in Deinem Fall richtige ersetzen. Außerdem muss mit

                                      pip install pySerial
                                      

                                      noch die Bibliothek für serielle Schnittstellen für Python installiert werden.

                                      Keine Erfolgsgarantie, ich habe es nur so trocken heruntergeschrieben ...

                                      import serial
                                      import time
                                      import binascii
                                      
                                      
                                      # === mbus_checksum ===============================================================================
                                      def mbus_checksum(data, skip):
                                          sum = 0
                                          for i in range(0, len(data)):
                                              if i >= skip:
                                                  sum = sum + int(data[i])
                                          return bytearray([sum & 255])
                                      
                                      
                                      # === check_result ================================================================================
                                      def check_result(where, ser):
                                          result = ser.read(1)
                                          if result == b'\xe5':
                                              return True
                                          else:
                                              if result is None:
                                                  return True
                                              else:
                                                  print(f'{where}: bad answer: {binascii.hexlify(bytearray(result), " ")}')
                                                  return False
                                      
                                      
                                      # === get_data ====================================================================================
                                      def get_data(ser):
                                          # 2.5: at 2400, 8N1 to send 2.2s of alternating bits
                                          ser.write(b'\x55' * 528)
                                      
                                          # time.sleep(2.0) # 2.0s sleep -> 0.8s break -> 1.2s until the buffer is empty ...
                                          time.sleep(1.2 + 170.0 / 2400.0)
                                      
                                          # 2.3: change parity
                                          ser.parity=serial.PARITY_EVEN
                                      
                                          # 2.7.1: do selection, use jokers for serial, manufacturer, ID, medium
                                          # 17 chars, 0.08s outgoing
                                          selection = b'\x68\x0B\x0B\x68\x53\xFD\x52\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF'
                                          ser.write(selection)
                                          ser.write(mbus_checksum(selection, 4))
                                          ser.write(b'\x16')
                                          # result arrives after 0.19s - 0.30s
                                          check_result('Selection', ser)
                                      
                                          # 3.1: do application reset 0x50 (to read instant values)
                                          # 10 chars, 0.05s outgoing
                                          app_reset = b'\x68\x04\x04\x68\x53\xFD\x50\x50'
                                          ser.write(app_reset)
                                          ser.write(mbus_checksum(app_reset, 4))
                                          ser.write(b'\x16')
                                          # result arrives after 0.08s
                                          check_result('Application reset', ser)
                                      
                                          # 3.2: do read data
                                          # 5 chars, 0.02s
                                          read_data = b'\x10\x7B\xFD'
                                          ser.write(read_data)
                                          ser.write(mbus_checksum(read_data, 1))
                                          ser.write(b'\x16')
                                          # result arrives after 0.07s, is 0.71s long (ca. 173 bytes)
                                          result = ser.read(200)  # 173 bytes plus some reserves
                                          if result is None:
                                              print('No data received')
                                          else:
                                              # debug output (hex dump) of received data
                                              print(f'user data bytes: {binascii.hexlify(bytearray(result), " ")}')
                                      
                                              # 2.7.2: do deselection
                                              # 5 chars, 0.02s
                                              deselection = b'\x10\x40\xfd'
                                              ser.write(deselection)
                                              ser.write(mbus_checksum(deselection, 0))
                                              ser.write(b'\x16')
                                              check_result('Deselection', ser)
                                      
                                              # return bytes received
                                          return result
                                      
                                      
                                      # === main ========================================================================================
                                      print('Starting up ...\n')
                                      # 2.5: 2400, 8N1 to send 2.2s of alternating bits, long timeout due to slow response by Ultramess
                                      ser = serial.Serial("/dev/ttyUSB0", baudrate=2400, bytesize=8, parity=serial.PARITY_NONE, stopbits=1, timeout=0.5)
                                      
                                      while True:
                                          print('Reading #0')
                                          result = get_data(ser)
                                      
                                          time.sleep(5.0)
                                      

                                      Hallo, ich versuchte gerade dein Skript an meinem CF Echo 2 anzupassen doch leider verstehe ein paar Sachen in deinen Skript nicht.

                                      Wieso sieht das mit dem time.sleep so komisch aus, warum wird hier addiert und dividiert? Ich denke hier soll doch nur eine Wartezeit generiert werden oder?

                                      Zur Zeit erhalte ich immer einen Fehler beim Check-result, das bedeutet doch auch das die Daten nicht richtig sein können oder? Oder können diese dennoch stimmen?

                                      Hast du eine Ahnung wie ich die Daten richtig parsen kann also die Daten wie verbrauch heraus lesen kann?
                                      Das Skript hat nur auf jeden Fall schon sehr viel weitergeholfen.

                                      Gruß Thorsten Niemann

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

                                      Support us

                                      ioBroker
                                      Community Adapters
                                      Donate

                                      638
                                      Online

                                      31.7k
                                      Users

                                      79.7k
                                      Topics

                                      1.3m
                                      Posts

                                      11
                                      24
                                      3191
                                      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