SDM630 Modbus Zähler auslesen

In diesem Tutorial zeige ich dir, wie du mit einem RaspberryPi (oder auch jedem anderen Linux Rechner) einen SDM630 Modbus Zähler auslesen kannst. Das Tutorial soll eher eine Grundlage für ein eigenes Projekt sein. Fertige Software gibt es genug, wie zum Beispiel Smartmeter.

Hardware

An der oberen Klappe des Zählers gibt es u.A. die Anschlüsse A+ und B-. Diese werden mit den Klemmen A und B am Adapter verbunden. Ein Abschlusswiderstand von 150 Ohm kommt an die Endes des Bus bzw. an das letzte und erste Gerät. Da ich nur 2 Geräte habe, ist das der Zähler und der USB Adapter.

Am Bus können theoretisch mehrere Zähler parallel angeschlossen werden.

Software

Einstellungen am Zähler

Am Zähler müssen für den Modbus verschiedene Einstellungen vorgenommen werden. Das geht bei meinem Zähler so:

  1. Lange die Taste E drücken
  2. Passwort eingeben (Standard: 1000)
  3. Lange die Taste E drücken
  4. Es erscheint „Set Addr“
  5. Durch langes Drücken der Taste E die Einstellung wählen und mit den Pfeilen die Adresse ändern. Durch langes Drücken der Taste E die Einstellung Verlassen
  6. Mit den Pfeilen die Einstellungen „Set baud“, „Set Pari“ und „Set Stop“ wählen und ebenfalls einstellen

Die Adresse ist dazu das, das Gerät im Bus zu identifizieren. Wenn du nur ein Gerät hast, kannst du die Adresse bei 1 lassen, wenn du mehrere hast, den Geräten entsprechend unterschiedliche Adressen geben.

Die Baudrate ist einfach gesagt die Übertragungsgeschwindigkeit. Bei höherer Baudrate ist aber nur eine kürzere Kabellänge möglich.

Parität benutze ich keine, also „none“

Der Stop-Bit kann auf 1 gelassen werden

Mit Skript Werte auslesen

Neben den Einstellungen die du vorher vorgenommen hast, brauchst du noch einen weiteren Wert: Den USB Port. Durch ausprobieren ist man hier ziemlich erfolgreich. Mit ls /dev/ttyUSB* kannst du dir alle Ports anzeigen lassen. In meinem Fall gab es nur einen einzigen.

Mein Code sieht folgendermaßen aus:

In Zeile 1 wird das Modbus Modul von Python importiert. Dieses musst du vielleicht noch installieren:

In der nächsten Zeile wird das Gerät initialisiert. Hier musst du evtl. noch den USB Port und die Modbus Adresse ändern. Danach gibt es einen sehr langen Part, durch den das Skript später weiß, welcher Wert welche Nummer und welche Einheit hat. Durch das „use“ kann festgelegt werden, ob der Wert verwendet werden soll oder nicht. Dazu einfach den Wert auf True bzw. False setzen. In Zeile 177 befindet sich eine for Schleife, die einmal für jeden Wert ausgeführt wird. Zeile 178 prüft, ob der Wert verwendet werden soll. Alles danach (Einrückungen nicht vergessen) kannst du jetzt frei programmieren. In meinem Beispiel werden alles Daten einfach nur per print ausgegeben. Die Zeile

gibt den Wert zurück (der, bei der die for Schleife gerade ist). Mit

bekommst du die Einheit.

Dieses Codebeispiel schreib zum Beispiel die Daten in eine Influx Datenbank.

Und jetzt viel Spaß beim Programmieren!

6 Kommentare

  1. malne frage …. sieht aus wie ein bussystem an dem alle teilnehmer mittels adressen agieren –> gelbes kabel 802.3 ; könnte man das für den WR SPH4600 adaptieren um den WR damit zu steuern ? da gibts ne grosse gemeinde …. und danke fd seite hier … meld dich mal per mail danke

    • jjk1

      6. Mai 2022 um 8:09 Uhr

      Schau dir doch mal die Software „Solaranzeige“ an: https://solaranzeige.de
      Die bietet auch die Möglichkeit einen Growatt WR zu steuern/auslesen.
      https://solaranzeige.de/phpBB3/viewtopic.php?t=1054
      Da müsstest du nichts programmieren. Ansonsten wäre es natürlich auch möglich, das mit dem Skript oben im Beitrag zu machen. Man müsste eben manche Sachen ändern

    • Hallo JJK, ich habe keinen Raspberry Pi nur einen Windows PC mit Python 3x und einen USB auf RS485. Dieser ist mit dem Eastron SDM630 verbunden.

      Was muss ich im Python Programm starten um dein Skript direkt auszuführen und die Daten auf dem PC anzuzeigen.

      Danke monette999

      • Theoretisch sollte das Skript auch auf Windows laufen. Du musst nur den USB Port in Zeile 3 ändern. Das wird dort COM1 oder COM2, usw. sein.

        • Etwas so?
          Mein COM Port ist COM6.

          #Set up instrument
          instrument = minimalmodbus.Instrument(PORT,6,mode=minimalmodbus.MODE_RTU)

          #Make the settings explicit
          instrument.serial.baudrate = 9600 # Baud
          instrument.serial.bytesize = 8
          instrument.serial.parity = minimalmodbus.serial.PARITY_NONE
          instrument.serial.stopbits = 1
          instrument.serial.timeout = 1 # seconds

          • So müsste es die Zeile 3 im Skript oben aussehen:
            instrument = minimalmodbus.Instrument('COM6', 1)
            Und dann einfach mein Skript von oben verwenden und mal testen. Auf Windows hab ich so etwas noch nicht gemacht…

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert