SMA-Wechselrichter per Modbus integrieren

Mit ** gekennzeichnete Links auf dieser Seite sind Affiliatelinks.

SMA-Wechselrichter per Modbus integrieren
SMA-Wechselrichter per Modbus integrieren
  • Matthias Kleine
  • 18.12.2020
  • Integration
  • Blockly
  • Hardware

Unsere Nachbarn haben einen Wechselrichter von SMA (Sunny Tripower 10.0). Nachdem ich nun schon viele Fragen im ioBroker Forum und auf Facebook gesehen habe, wie diese Geräte integriert werden können, zeige ich Dir heute einen möglichen Weg auf. Und zwar komplett lokal. Die meisten versuchen die Anbindung wahrscheinlich über das “Sunny Portal” von SMA zu realisieren. Dann pusht der Wechselrichter die Ertragsinformationen in die SMA-Cloud. Der zugehörige ioBroker-Adapter loggt sich dann auf der Webseite ein und versucht die Erträge von dort zu lesen. Umständlicher geht es wohl kaum, oder? Da schien eine lokale Integration per Modbus doch wesentlich einfacher zu sein.

Leider war auch das nicht so einfach. Denn als normaler Benutzer kann man die Modbus-Schnittstelle auf den Geräten nicht aktivieren. Das kann nur der Installateur mit seinem Passwort. Nun wollte dieser aber einfach nicht vorbei kommen - also half nur ein Reset des Passworts. Und das kann man selbst tun! Dazu füllt man bei SMA ein Formular aus und erhält eine PUK. Mit Hilfe dieser PUK kann dann ein neues Installateuers-Passwort vergeben werden. Und schon ist die Schnittstelle aktiviert und kann für Integrationen genutzt werden. Das kostet einmalig unter 20 Euro. Man kann also nicht ausgesperrt werden! Das ist schonmal ein gutes Zeichen.

Video

ioBroker-Kurs

Modbus-Register

Hier kannst Du eine Dokumentation mit allen Modbus-Registern herunterladen. Die interessanten Register aus diesem Video sind folgende:

Beschreibung Register Datentyp Faktor
Gesamtertrag (Wh) 30513 Unsigned (64 Bit) 0
Wirkleistung gesamt (W) 30775 Signed (32 Bit) 0
DC-Strom Eingang 1 (A) 30769 Signed (32 Bit) 0,001
DC-Spannung Eingang 1 (V) 30771 Signed (32 Bit) 0,01
DC-Leistung Eingang 1 (W) 30773 Signed (32 Bit) 0
DC-Strom Eingang 2 (A) 30957 Signed (32 Bit) 0,001
DC-Spannung Eingang 2 (V) 30959 Signed (32 Bit) 0,01
DC-Leistung Eingang 2 (W) 30961 Signed (32 Bit) 0

Alle Register sind Eingangsregister. Die Slave-ID ist im Standard die 3. Alle Datentypen sind als Big Endian kodiert.

Leider kann der Wechselrichter per Modbus keine Gleitkommazahlen übermitteln (obwohl der Standard das vorsieht). Daher muss man einige Werte selbst umrechnen.

Blockly-Script

Das Blockly-Script aus dem Video kannst Du hier einfach kopieren und importieren. Das Script baut auf der Wirkleistung gesamt auf (siehe oben). Dazu muss Register 30775 gelesen werden.

<xml xmlns="https://developers.google.com/blockly/xml">
  <variables>
    <variable id="xYUx~%zH?3Xa1fa!|/A?">gesamtErtragAktuell</variable>
  </variables>
  <block type="create" id="+O8ykV%2NZL7G5H9dxE=" x="63" y="63">
    <field name="NAME">pv.gesamtErtragTageswechsel</field>
    <value name="VALUE">
      <block type="math_number" id="A,o|kRhPaKEpf{eW;yZ=">
        <field name="NUM">0</field>
      </block>
    </value>
    <value name="COMMON">
      <block type="text" id="^hcAld8Q9KeOx!isXAXM">
        <field name="TEXT">{"type": "number", "unit": "Wh"}</field>
      </block>
    </value>
    <next>
      <block type="create" id="xjA7FP*KVW)~3!h[,,#[">
        <field name="NAME">pv.gesamtErtragHeute</field>
        <value name="VALUE">
          <block type="math_number" id="vPUnV(BV+O,gI{@4hj7*">
            <field name="NUM">0</field>
          </block>
        </value>
        <value name="COMMON">
          <block type="text" id="CE7ZJIPe2y8O07:;]i6H">
            <field name="TEXT">{"type": "number", "unit": "kWh"}</field>
          </block>
        </value>
        <next>
          <block type="create" id="B+GZqg3`T(6@KqZYI@HQ">
            <field name="NAME">pv.gesamtErtragGestern</field>
            <value name="VALUE">
              <block type="math_number" id="*4U1Zo)//7DY9h51$xzO">
                <field name="NUM">0</field>
              </block>
            </value>
            <value name="COMMON">
              <block type="text" id="wSTT^Cx%Ucy$s!oDw6Dd">
                <field name="TEXT">{"type": "number", "unit": "kWh"}</field>
              </block>
            </value>
            <next>
              <block type="schedule" id="I(K/w[aN}Zll#xU(i(!d">
                <field name="SCHEDULE">0 0 * * *</field>
                <statement name="STATEMENT">
                  <block type="variables_set" id="TSzp~B`vF2.}Ek_(fGY5">
                    <field name="VAR" id="xYUx~%zH?3Xa1fa!|/A?">gesamtErtragAktuell</field>
                    <value name="VALUE">
                      <block type="get_value" id="S#Zz2Fx})b9*Y8A~b=-]">
                        <field name="ATTR">val</field>
                        <field name="OID">modbus.0.inputRegisters.3.30513_Gesamtertrag</field>
                      </block>
                    </value>
                    <next>
                      <block type="update" id="x[E7E~hsvQbCO$!jgOW(">
                        <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                        <field name="OID">javascript.0.pv.gesamtErtragGestern</field>
                        <field name="WITH_DELAY">FALSE</field>
                        <value name="VALUE">
                          <block type="math_arithmetic" id="bL0j,js7%4m(jpo`S7Si">
                            <field name="OP">DIVIDE</field>
                            <value name="A">
                              <shadow type="math_number" id="g8D!k5NT[NGj:R]$9i2%">
                                <field name="NUM">1</field>
                              </shadow>
                              <block type="math_arithmetic" id="#))kUV+)f4CXxq}sNn0l" inline="false">
                                <field name="OP">MINUS</field>
                                <value name="A">
                                  <shadow type="math_number" id="OK?Y6Ln):Q0abVX5J,O7">
                                    <field name="NUM">1</field>
                                  </shadow>
                                  <block type="variables_get" id="]E7+W4L2W|ELEPPE}wwF">
                                    <field name="VAR" id="xYUx~%zH?3Xa1fa!|/A?">gesamtErtragAktuell</field>
                                  </block>
                                </value>
                                <value name="B">
                                  <shadow type="math_number" id="Nt/[2e|6f-d;$m|QfX)@">
                                    <field name="NUM">1</field>
                                  </shadow>
                                  <block type="get_value" id="G%Wqy;1XHS)LYXsr^!6E">
                                    <field name="ATTR">val</field>
                                    <field name="OID">javascript.0.pv.gesamtErtragTageswechsel</field>
                                  </block>
                                </value>
                              </block>
                            </value>
                            <value name="B">
                              <shadow type="math_number" id="M,Td`UE4=:n4=icy*JQA">
                                <field name="NUM">1000</field>
                              </shadow>
                            </value>
                          </block>
                        </value>
                        <next>
                          <block type="update" id="G3w*h%?w5S~t[[C(,:rF">
                            <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                            <field name="OID">javascript.0.pv.gesamtErtragTageswechsel</field>
                            <field name="WITH_DELAY">FALSE</field>
                            <value name="VALUE">
                              <block type="variables_get" id="XAWM{@9XIy~HUgl~Ah|1">
                                <field name="VAR" id="xYUx~%zH?3Xa1fa!|/A?">gesamtErtragAktuell</field>
                              </block>
                            </value>
                          </block>
                        </next>
                      </block>
                    </next>
                  </block>
                </statement>
                <next>
                  <block type="on" id="{bvAE8*n[50]yAo)%X4D">
                    <field name="OID">modbus.0.inputRegisters.3.30513_Gesamtertrag</field>
                    <field name="CONDITION">ne</field>
                    <field name="ACK_CONDITION"></field>
                    <statement name="STATEMENT">
                      <block type="update" id="A#Kx_X$sg|Nn6RLe4O2i">
                        <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                        <field name="OID">javascript.0.pv.gesamtErtragHeute</field>
                        <field name="WITH_DELAY">FALSE</field>
                        <value name="VALUE">
                          <block type="math_arithmetic" id="*=8z0l`B`i_*!Oa^R~md">
                            <field name="OP">DIVIDE</field>
                            <value name="A">
                              <shadow type="math_number" id="R`vU[j?3eJyQ(QnA`Lbr">
                                <field name="NUM">1</field>
                              </shadow>
                              <block type="math_arithmetic" id="KQt65QczV*#(QU#:Bc#X" inline="false">
                                <field name="OP">MINUS</field>
                                <value name="A">
                                  <shadow type="math_number" id="V03l+d0]LMt?TYJnZxs)">
                                    <field name="NUM">1</field>
                                  </shadow>
                                  <block type="on_source" id="ZD@:kS(}g7-olIv4(~O%">
                                    <field name="ATTR">state.val</field>
                                  </block>
                                </value>
                                <value name="B">
                                  <shadow type="math_number">
                                    <field name="NUM">1</field>
                                  </shadow>
                                  <block type="get_value" id="Ug[[)KkKHguX^+1]!Q9.">
                                    <field name="ATTR">val</field>
                                    <field name="OID">javascript.0.pv.gesamtErtragTageswechsel</field>
                                  </block>
                                </value>
                              </block>
                            </value>
                            <value name="B">
                              <shadow type="math_number" id="B-waWmjF4h.ewYc`zL8z">
                                <field name="NUM">1000</field>
                              </shadow>
                            </value>
                          </block>
                        </value>
                      </block>
                    </statement>
                  </block>
                </next>
              </block>
            </next>
          </block>
        </next>
      </block>
    </next>
  </block>
</xml>
Ich will mehr

Smart-Home-Training von A-Z

Steig noch tiefer in die Themen ein und meistere Deine Projekte!

ioBroker-Master-Kurs

ioBroker-Master-Kurs

Mehr Infos
NodeRed-Kurs

NodeRed-Kurs

Mehr Infos
Lox-Kurs

Lox-Kurs

Mehr Infos
FHEM-Kurs

FHEM-Kurs

Mehr Infos