SMA-Wechselrichter per Modbus integrieren
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
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>
Transparenz-Hinweis (Level 1)
An diesem Beitrag ist kein Hersteller beteiligt! Sämtliche Produkte habe ich selbst gekauft und trage die kompletten Kosten für diesen Beitrag alleine! Die Inhalte wurden somit von niemandem gesehen oder abgestimmt. Es handelt sich zu 100% um meine persönliche Meinung und Erfahrung!