Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin für Solaredge Wechselrichter / Sunspec in Arbeit

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

    Neues Plugin für Solaredge Wechselrichter / Sunspec in Arbeit

    Hallo,

    Nachdem ich nichts fertiges gefunden habe und Henning Behrend ein schönes Pluggit Plugin gebastelt hat das auf Modbus TCP basiert habe ich mich mal drangemacht das entsprechend zu adaptieren...

    Da ich aktuell auf einige Probleme stoße fange ich hier den Thread an um die Fragen zu sammeln, wäre nett wenn der eine oder ander eine Blick drauf werfen kann...
    Solaredge verwendet das Sunspec Protokoll, somit sollte das Plugin dann auch für ander Sunspec kompatible WR (z.B. Fronius) passen.

    Ich werwende den SH.py ausschließlich als Gateway zwischen verschiedenen Netzen, DMX, und Modbus Serial (Systemair Lüftung) hängen schon dran...

    Da ich im Linux nicht der fitteste bin habe ich das Image von OnkelAndy als Basis...

    Probleme bereitet mit das installieren von ModbusPi, nachdem ich 5 verschieden Wege versucht hatte lief es dann, aber aktuell kann ich z.B. keine Shellscripte testen da es nicht gefunden wird... wenn jemand einen Sauberen Weg hat wie man das nachinstalliert, dann setze ich gerne noch mal neu auf...

    Aktuell hänge ich noch mit der Formatierung, die Modbus Werte sind INT16 small codiert, da ich nicht weiß was Pluggit macht kann ich da wohl nicht abschreiben...

    Code:
    t2 = self._Pluggit.read_holding_registers(values, 2, unit=22)
    decodert2 = BinaryPayloadDecoder.fromRegisters(t2.registers, endian=Endian.Big)
    Ich finde aktuell keine Doku zu den Units und dem Payload Decoder (ob der INT16 small kann)

    Wenn da jemand eine Idee hat...?

    Uwe


    Update readme 03.08.2017:
    Angehängte Dateien
    Zuletzt geändert von boardman; 03.08.2017, 18:45.

    #2
    Benutzt der plugin Autor nicht pymodbus? Dazu gibts es eine schöne doku, gerade zu dem binarydecoder

    http://pymodbus.readthedocs.io/en/la...y/payload.html

    http://www.sma.de/produkte/monitorin...ittstelle.html

    https://www.google.de/url?sa=t&sourc...a6G5rjUAhVRLFA KHZB0AsAQFggcMAA&usg=AFQjCNGgXnX3wzXQeN8UX6K6e85SV I8hHQ&sig2=ZNOXKBXOuFABrNtnwsCQ_g

    Btw grad gelesen, das sma das azch unterstuetzt
    Zuletzt geändert von Bonze; 12.06.2017, 18:12.

    Kommentar


      #3
      Hi, die Doku ist wirklich besser als das was ich gefunden hatte - aber ganz ohne Beispiele ist das schon mühsam wenn man keine richtiges System zum spielen hat....

      ABER: meien Schnittstelle läuft auch so, ich schiebe alle Daten unkonventiert zu KNX, mit den Richtigen Datenobjekten macht der Homeserver das prima...
      Damit ist nun die Schnittstelle zwar für mich nahezu fertig, aber es ist kein richtiges Plugin geworden, da man im SH nicht wirklich was mit anfangen kann...

      Deswegen werde ich die Dateien wohl nur hier anhängen und nicht korrekt einchecken...

      Wer bedarf hat, bzw. eine ähnliche Konstellation hat, darf sich gerne vorab schon mal melden...

      Uwe

      Kommentar


        #4
        So, nachdem ich auch ein Pythonscript zum laufen gebracht habe konnte ich alles außer Strings einbauen, beim String scheitere ich aufgrund meines Python unvermögens...

        Mein Testscript :
        Code:
        address = 40044
        count   = 8
        len     = count * 2
        result  = client.read_holding_registers(40044, 8,  unit=1)
        decoder = BinaryPayloadDecoder.fromRegisters(result.registers, endian=Endian.Little)
        decoded = {
            'string': decoder.decode_string(len),
        }
        print ("--------------------------------------------------------")
        for name, value in decoded.iteritems():
          print ("%s\t" % name), value
        gibt das richtige Ergebnis aus:
        Version 0003.2019

        Aber ich bekomme da snicht in mein Plugin integriert....
        selbst wenn ich das fast 1:1 mache:
        Code:
                        if values == self._modbusRegisterDic['C_Version']:
                            logger.debug("Solaredge: --------------------------------------------------------------------------------> ")
                            logger.debug("Solaredge: CPU Version {0}".format(registerValue))
                            result = self._Solaredge.read_holding_registers(values, 8, unit=1) # 8 words 16 bit
                            decoder = BinaryPayloadDecoder.fromRegisters(result.registers, endian=Endian.Little)
                            decoded = {
                                'string': decoder.decode_string(16),
                                'string2': decoder.decode_string(16),
                            }
        
                            for name, value in decoded.items():
                                print ("Version"), value
        
                            vers = value
        
                            #vers = decoder.decode_string(16)
                            logger.debug("Solaredge: CPU Version: {0}".format(vers))
                            item(vers, 'Solaredge')
        Bekomme ich diesen Fehler:
        2017-06-15 21:55:39 DEBUG __init__ Solaredge Solaredge: CPU Version: b'' -- __init__.py:_refresh:252
        2017-06-15 21:55:39 WARNING item Solaredge Item pv.C_Version: value b'' does not match type str. Via Solaredge None -- item.py:__update:689

        Selbst in der Einfachen Version:
        Code:
                        if values == self._modbusRegisterDic['C_Version']:
                            logger.debug("Solaredge: --------------------------------------------------------------------------------> ")
                            logger.debug("Solaredge: CPU Version {0}".format(registerValue))
                            result = self._Solaredge.read_holding_registers(values, 8, unit=1) # 8 words 16 bit
                            decoder = BinaryPayloadDecoder.fromRegisters(result.registers, endian=Endian.Little)
                            vers = decoder.decode_string(16)
                            logger.debug("Solaredge: CPU Version: {0}".format(vers))
                            item(vers, 'Solaredge')
        Bekomme ich Müll, hier kommt de rDecoder wohl durcheinander...


        2017-06-15 22:05:39 DEBUG __init__ Solaredge Solaredge: CPU Version: b'00302.10\x009\x00\x00\x00\x00\x00\x00' -- __init__.py:_refresh:242
        2017-06-15 22:05:39 WARNING item Solaredge Item pv.C_Version: value b'00302.10\x009\x00\x00\x00\x00\x00\x00' does not match type str. Via Solaredge None -- item.py:__update:689

        Hat jemand eine Tip wir man das sauber formatiert?

        Kommentar


          #5
          Du bekommst vom Auslesen wohl nur einen bytestring. Starte mal ein Python3 auf der Shell und vollziehe den folgenden Code dort nach:

          Code:
          >>> a = b'00302.10'
          >>> a += bytearray( [ 9, 0,0,0,0,0,0])
          >>> a
          b'00302.10\t\x00\x00\x00\x00\x00\x00'
          >>> b =  str( a, 'ASCII')
          >>> b
          '00302.10\t\x00\x00\x00\x00\x00\x00'
          >>> c = b.split('\t')
          >>> c
          ['00302.10', '\x00\x00\x00\x00\x00\x00']
          >>> d = c[0]
          >>> d
          '00302.10'
          >>> e = float(d)
          >>> e
          302.1
          für Deinen Fall könntest Du also verkürzt schreiben:

          Code:
          vers = float(str(vers, 'ASCII').split('\t')[0])
          Ob das aber immer so ist, das die Version vorne mit '0' aufgefüllt ist und nach einem Tab dann Nullbytes kommen kannst nur Du wissen.

          Kommentar


            #6
            Hi, Danke - das war ein Volltreffer.. aber zu kompliziert gedacht... (-:
            b = str( vers, 'ASCII')
            hat schon genügt umd Klartext zu erzeugen, der Rest machte so von der Formatierung keinen Sinn, kurz rumprobiert mit folgender Erkenntnis...

            Bug in der pymodbus für Python 3!
            Wenn ich auf Endian Big wechsele
            decoder = BinaryPayloadDecoder.fromRegisters(result.register s, endian=Endian.Big)
            und dann b = str( vers, 'ASCII') mache dann kommt wunderschön
            0003.2019

            als Ergebnis...
            Alles andere dekodiere ich mit endian Little, auch unter Python 2 ging das mit dem String, mal gucken wo ich das melden kann...

            Vielen Dank
            Uwe

            Kommentar


              #7
              Wie sieht eigentlich so ein Wechseltrichter genau aus, etwa so?

              wechseltrichter.jpg


              (SCNR)

              Kommentar


                #8
                Hey cool... und Überschriften kann man nicht korrigieren

                Kommentar


                  #9
                  Ok, ich habe das mal korrigiert aber die nette Bildidee dringelassen...

                  Kommentar


                    #10
                    Oh, jetzt wo du das sagst merke ich, dass ich den Titel ja auch hätte korrigieren können

                    Kommentar


                      #11
                      ach passt schon.. (-, ich fands witzig, weil ich es so total überlesen hatte...

                      Kommentar


                        #12
                        So, sieht schon ganz gut aus, ich musste noch ein wenig umbauen aber jetzt steht auch die Verbindung und bleibt nicht mehr hängen, ich optimiere noch ein wenig, aber falls jemand Bedarf hat stelle ich die dateien schon mal im Eingangspot zur Verfügung... Falls es jemand testen kann/will, bitte geren Rückmeldung!

                        Kommentar


                          #13
                          Wenn ich das ganze richtig verstehe und ich damit SMA-Wechelrichter über die LAN-Schnitstelle( Sofern die Wechselrichter Firmware Modbus kann) auslesen kann, würde ich testen.

                          Kommentar


                            #14
                            soweit ich das auf die Schnelle überflogenhabe müsste es passen...
                            Unsere Produkte für die Anlagenüberwachung bieten Ihnen verschiedenste Möglichkeiten: funk- oder internetbasiert, kompakt oder komplex, kurz oder ausführlich. Dabei spielt es keine Rolle, ob Sie den Ertrag einer Hausdach-Anlage oder eines Freiflächen-Solarkraftwerkes überwachen wollen.

                            Kommentar


                              #15
                              Ok, dann her damit...am besten mit kleinen item und plugin conf Beschreibung. Danke

                              Kommentar

                              Lädt...
                              X