Modbus TCP Schritt für Schritt? (Für PV-Anlage S10 von E3DC)

Begonnen von Yeeha, 31 März 2020, 21:27:26

Vorheriges Thema - Nächstes Thema

Yeeha

Hallo zusammen,

seit wenigen Tagen befasse ich mich mit FHEM. Die Installation auf meiner Synology NAS (216+) hat geklappt, Web-Frontend läuft und so. Ich habe allerdings noch nichts nutzbares drauf.

Mein wichtigstes Thema ist die PV-Anlage, Hersteller E3DC, Type S10. Die hat Modbus TCP. Hier und da gibt es Threads von Anwendern, die das an fhem laufen haben und über Details fachsimpeln, z.B. https://forum.fhem.de/index.php/topic,98991.0.html.

Mein Problem ist, dass ich da bei weitem noch nicht folgen kann.

Kann mir bitte jemand helfen, die ersten Schritte zu machen?

Herzlichen Tank!

Yeeha

daelch

Ich bin auch FHEM Anfänger und ich hoffe, dass ich alles korrekt niederschreibe...

Hast Du Modbus bereits in der Anlage aktiviert? Das ist die Voraussetzung für die nächsten Schritte.

Dann gehst Du in FHEM auf ein beliebiges Device und klickst unten auf Raw definition. Aus dem Textfeld löschst Du dann alles heraus und ersetzt es durch diesen Code (die IP Adresse musst Du anpassen):


define S10 ModbusAttr 1 20 192.168.178.92:502 TCP
attr S10 userattr devStateIcon event-min-interval event-on-change-reading icon obj-h40052-len obj-h40052-poll obj-h40052-reading obj-h40052-unpack obj-h40066-len obj-h40066-poll obj-h40066-reading obj-h40066-unpack obj-h40068-len obj-h40068-poll obj-h40068-reading obj-h40068-unpack obj-h40070-len obj-h40070-poll obj-h40070-reading obj-h40070-unpack obj-h40072-len obj-h40072-max obj-h40072-min obj-h40072-poll obj-h40072-reading obj-h40072-unpack obj-h40074-len obj-h40074-poll obj-h40074-reading obj-h40074-unpack obj-h40076-len obj-h40076-poll obj-h40076-reading obj-h40076-unpack obj-h40080-len obj-h40080-poll obj-h40080-reading obj-h40080-unpack obj-h40081-len obj-h40081-poll obj-h40081-reading obj-h40081-unpack obj-h40082-len obj-h40082-poll obj-h40082-reading obj-h40082-unpack obj-h40083-len obj-h40083-poll obj-h40083-reading obj-h40083-unpack obj-h40084-len obj-h40084-poll obj-h40084-reading obj-h40084-unpack obj-h40101-len obj-h40101-poll obj-h40101-reading obj-h40101-unpack obj-h40102-len obj-h40102-poll obj-h40102-reading obj-h40102-unpack userReadings
attr S10 devStateIcon opened:rc_WEB@32CD32  disconnected:rc_WEB@red
attr S10 event-min-interval .*:3600
attr S10 event-on-change-reading .*
attr S10 group E3DC
attr S10 icon measure_photovoltaic_inst@yellow
attr S10 obj-h40052-len 16
attr S10 obj-h40052-poll 1
attr S10 obj-h40052-reading seriennr
attr S10 obj-h40052-unpack n
attr S10 obj-h40066-len 2
attr S10 obj-h40066-poll 1
attr S10 obj-h40066-reading sunwatt
attr S10 obj-h40066-unpack N
attr S10 obj-h40068-len 2
attr S10 obj-h40068-poll 1
attr S10 obj-h40068-reading battwatt0
attr S10 obj-h40068-unpack N
attr S10 obj-h40070-len 2
attr S10 obj-h40070-poll 1
attr S10 obj-h40070-reading homewatt0
attr S10 obj-h40070-unpack N
attr S10 obj-h40072-len 2
attr S10 obj-h40072-max 65537
attr S10 obj-h40072-min 0
attr S10 obj-h40072-poll 1
attr S10 obj-h40072-reading gridwatt0
attr S10 obj-h40072-unpack N
attr S10 obj-h40074-len 2
attr S10 obj-h40074-poll 1
attr S10 obj-h40074-reading zusatzwatt
attr S10 obj-h40074-unpack N
attr S10 obj-h40082-len 1
attr S10 obj-h40082-poll 1
attr S10 obj-h40082-reading battsoc
attr S10 obj-h40082-unpack n
attr S10 obj-h40084-len 1
attr S10 obj-h40084-reading ems
attr S10 obj-h40084-unpack n
attr S10 obj-h40101-len 1
attr S10 obj-h40101-reading s1_p
attr S10 obj-h40101-unpack n
attr S10 obj-h40102-len 1
attr S10 obj-h40102-reading s2_p
attr S10 obj-h40102-unpack n
attr S10 room Aussen
attr S10 userReadings gridwatt { if (ReadingsVal("S10", "gridwatt0", "") <= 32768 ) {(ReadingsVal("S10", "gridwatt0", ""))} else {(ReadingsVal("S10", "gridwatt0", "")) - 65536 };; },\
battwatt { if (ReadingsVal("S10", "battwatt0", "") <= 32768 ) {(ReadingsVal("S10", "battwatt0", ""))} else {(ReadingsVal("S10", "battwatt0", "")) - 65536 };; },\
homewatt { if (ReadingsVal("S10", "homewatt0", "") <= 4294901759 ) {(ReadingsVal("S10", "homewatt0", ""))} else {(ReadingsVal("S10", "homewatt0", "")) - 4294967295 + 65536 };; },\
notstrom { (ReadingsVal("S10", "ems", "")) ;; },\
sun2wat { if (ReadingsVal("S10", "zusatzwatt", "") <= 4294901759 ) {(ReadingsVal("S10", "zusatzwatt", "")) - 65536 } else {(ReadingsVal("S10", "zusatzwatt", "")) - 4294967296 + 65536 };; },\
sun2wat2 { if (ReadingsVal("S10", "sun2wat", "") > 40000 ) {(ReadingsVal("S10", "sun2wat", "")) - 65536 } else {(ReadingsVal("S10", "sun2wat", "")) };; },\
sun2watt { if (ReadingsVal("S10", "sun2wat2", "") < -40000 ) {(ReadingsVal("S10", "sun2wat2", "")) + 65536 } else {(ReadingsVal("S10", "sun2wat2", "")) };; },\
sun2watt2 { (ReadingsVal("S10", "sun2watt", "")) *-1 ;; },\
Leistung { (ReadingsVal("S10", "sun2watt2", "")) + (ReadingsVal("S10", "sunwatt", "")) ;; }



Jetzt müsste der Theorie nach die Anlage in FHEM abgebildet werden. Hat es geklappt?

pcbastler

Um die Modbus-Einrichtung auf der S10 zu testen kannst du den Client von Simply Modbus verwenden.

Yeeha

Super, die Verbindung scheint zu funktionieren: "state opened".  :)
Was sollte ich als nächstes tun?

daelch

Nun in wieder in Raw Definition das eingeben um die Readingsgroup zu erstellen:


define E3DC readingsGroup S10:<Batterie>,battwatt S10:<Batterie_Status>,battsoc S10:<Gesamleistung>,Leistung S10:<Verbrauch>,homewatt S10:<Netz>,gridwatt S10:<NotStrom>,notstrom
attr E3DC group E3DC
attr E3DC room Aussen
attr E3DC valueFormat {battsoc => "%.1f %" , homewatt => "%.0f Watt" , sunwatt => "%.0f Watt" , gridwatt => "%.0f Watt" , battwatt => "%.0f Watt" , notstrom => "%.0f" , sun2watt2 => "%.0f Watt" , Leistung => "%.0f Watt" ,}
attr E3DC valueStyle { if($READING eq "battsoc" && $VALUE > 85) { 'style="color:green"'}elsif($READING eq "battsoc" && $VALUE > 60) { 'style="color:green"'}\
elsif($READING eq "battsoc" && $VALUE  > 35) { 'style="color:black"'}elsif($READING eq "battsoc" && $VALUE  > 20) { 'style="color:orange"'}\
elsif($READING eq "battsoc" && $VALUE  < 21 ) { 'style="color:red"'}\
elsif($READING eq "notstrom" && $VALUE > 1){ 'style="color:black"'}elsif($READING eq "notstrom" && $VALUE < 1) { 'style="color:orange"'}\
elsif($READING eq "homewatt" && $VALUE > 401){ 'style="color:orange"'}elsif($READING eq "homewatt" && $VALUE < 400){ 'style="color:green"'}\
elsif($READING eq "homewatt" && $VALUE > 1500){ 'style="color:black"'}elsif($READING eq "homewatt" && $VALUE > 3000){ 'style="color:red"'}\
elsif($READING eq "sunwatt" && $VALUE > 0){ 'style="color:black"'}elsif($READING eq "sunwatt" && $VALUE < 1){ 'style="color:black"'}\
elsif($READING eq "sun2watt2" && $VALUE > 0){ 'style="color:black"'}elsif($READING eq "sun2watt2" && $VALUE < 1){ 'style="color:black"'}\
elsif($READING eq "gridwatt" && $VALUE < 0){ 'style="color:green"'}elsif($READING eq "gridwatt" && $VALUE > 0){ 'style="color:red"'}\
elsif($READING eq "battwatt" && $VALUE > 0){ 'style="color:black"'}elsif($READING eq "battwatt" && $VALUE < 0){ 'style="color:green"'}\
elsif($READING eq "Leistung" && $VALUE > 1){ 'style="color:orange"'}elsif($READING eq "notstrom" && $VALUE > 3){ 'style="color:red"'} }


Yeeha


daelch



define EnergieLog FileLog ./log/e3dc-%Y-%m.log S10:Leistung:.*|S10:battsoc:.*|S10:battwatt:.*|S10:gridwatt:.*|S10:homewatt:.*



Yeeha


daelch



define SVG_EnergieLog_1 SVG EnergieLog:SVG_EnergieLog_1:CURRENT
attr SVG_EnergieLog_1 alias E3DC
attr SVG_EnergieLog_1 devStateIcon .*:dog_silhouette
attr SVG_EnergieLog_1 room Aussen


daelch

Dann im Plot noch die Einstellungen machen wir im Bild. Geht vielleicht auch eleganter, aber da bin ich mit unsicher.

Yeeha

Ah, jetzt tauchen doch Fehler auf. Ich glaube, mein Logfile (e3dc-2020-04.log bzw. dann das Objekt EnergieLog) ist noch komplett leer:
missing data in logfile: won't write incomplete .gplot definition
Muss ich da noch etwas explizit einschalten?

daelch


Yeeha

Nein, STATE kann man nicht setzen.
reopen kann man schicken, scheint aber keinen Unterschied zu machen.

daelch

Dann muss jemand der alten Hasen einspringen. habe keine Idee, sorry.

Tsturm

Hallo zusammen,

vielen Dank für die Anleitung, klappt bei mir.

@Yeeha - werden denn Daten ins log geschrieben? Einfach mal auf die Definition des Log gehen und auf "text" rechts oben klicken.

VG timmo