Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Hardware
  4. WMZ Sharky 775 einbinden

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    11
    1
    81

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    11
    1
    554

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.7k

WMZ Sharky 775 einbinden

Geplant Angeheftet Gesperrt Verschoben Hardware
24 Beiträge 11 Kommentatoren 4.7k Aufrufe 11 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • T Tom H.

    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 Offline
    W Offline
    wavoigt
    schrieb am zuletzt editiert von
    #10

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

    1 Antwort Letzte Antwort
    0
    • T Tom H.

      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 :-(

      S Offline
      S Offline
      sharky
      schrieb am zuletzt editiert von
      #11

      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 Antwort Letzte Antwort
      0
      • S sharky

        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 Online
        D Online
        darkblu
        schrieb am zuletzt editiert von
        #12

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

        Raspi 4, 4GB für Influxdb 1.8 und Grafana
        Raspi 5, 8 GB für ioBroker

        S 1 Antwort Letzte Antwort
        0
        • D darkblu

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

          S Offline
          S Offline
          sharky
          schrieb am zuletzt editiert von
          #13

          @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 Antwort Letzte Antwort
          0
          • S sharky

            @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 Offline
            F Offline
            flispy
            schrieb am zuletzt editiert von
            #14

            @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 Antwort Letzte Antwort
            0
            • F flispy

              @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 Offline
              S Offline
              sharky
              schrieb am zuletzt editiert von
              #15

              @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 Antwort Letzte Antwort
              0
              • S sharky

                @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 Offline
                F Offline
                flispy
                schrieb am zuletzt editiert von
                #16

                @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 Antwort Letzte Antwort
                0
                • F flispy

                  @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 Offline
                  S Offline
                  sharky
                  schrieb am zuletzt editiert von
                  #17

                  @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 NiemannT 2 Antworten Letzte Antwort
                  0
                  • S sharky

                    @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 Online
                    D Online
                    darkblu
                    schrieb am zuletzt editiert von
                    #18

                    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 ?

                    Raspi 4, 4GB für Influxdb 1.8 und Grafana
                    Raspi 5, 8 GB für ioBroker

                    1 Antwort Letzte Antwort
                    0
                    • S Offline
                      S Offline
                      sharky
                      schrieb am zuletzt editiert von
                      #19

                      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 Antwort Letzte Antwort
                      0
                      • S sharky

                        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 Online
                        D Online
                        darkblu
                        schrieb am zuletzt editiert von
                        #20

                        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.

                        Raspi 4, 4GB für Influxdb 1.8 und Grafana
                        Raspi 5, 8 GB für ioBroker

                        S 1 Antwort Letzte Antwort
                        0
                        • D darkblu

                          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 Offline
                          S Offline
                          sharky
                          schrieb am zuletzt editiert von
                          #21

                          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 Antworten Letzte Antwort
                          0
                          • S sharky

                            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 Offline
                            W Offline
                            wavoigt
                            schrieb am zuletzt editiert von
                            #22

                            @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 Antwort Letzte Antwort
                            0
                            • S sharky

                              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.

                              D Online
                              D Online
                              darkblu
                              schrieb am zuletzt editiert von darkblu
                              #23

                              @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

                              Raspi 4, 4GB für Influxdb 1.8 und Grafana
                              Raspi 5, 8 GB für ioBroker

                              1 Antwort Letzte Antwort
                              0
                              • S sharky

                                @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)
                                
                                Thorsten NiemannT Offline
                                Thorsten NiemannT Offline
                                Thorsten Niemann
                                schrieb am zuletzt editiert von
                                #24

                                @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 Antwort Letzte Antwort
                                0
                                Antworten
                                • In einem neuen Thema antworten
                                Anmelden zum Antworten
                                • Älteste zuerst
                                • Neuste zuerst
                                • Meiste Stimmen


                                Support us

                                ioBroker
                                Community Adapters
                                Donate

                                343

                                Online

                                32.5k

                                Benutzer

                                81.8k

                                Themen

                                1.3m

                                Beiträge
                                Community
                                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                ioBroker Community 2014-2025
                                logo
                                • Anmelden

                                • Du hast noch kein Konto? Registrieren

                                • Anmelden oder registrieren, um zu suchen
                                • Erster Beitrag
                                  Letzter Beitrag
                                0
                                • Home
                                • Aktuell
                                • Tags
                                • Ungelesen 0
                                • Kategorien
                                • Unreplied
                                • Beliebt
                                • GitHub
                                • Docu
                                • Hilfe