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


Andy#22

Herzlichen Dank auch von mir für die perfekte Anleitung. Hat fehlerfrei funktioniert, und ich selbst bin Anfänger!
Alle Daumen hoch!
Grüße, Andy

odie13690

Hallo zusammen,

habe mich an die Anleitung von daelch (2. Post) gehalten. Der Status bleibt allerdings bei disconnected  :-[

Einstellungen im S10 habe ich vorgenommen, also Modbus aktiviert. Eigentlich kann man da ja auch nichts verkehrt machen.

Habe keine Ahnung, warum ich keine Verbindung hinbekomme.

odie13690

Rewe2000

#17
Hallo odie13690,

um dir hier wirklich helfen zu können, musst du schon ein wenig mehr Details liefern.
Guck mal das Menü vom S10 genau an, ob du wirklich alles freigeschaltet hast. Ist auch der Port korrekt eingestellt und vom Router nicht blockiert?
Hast du im Beispielcode die IP Adresse deines Hauskraftwerks eingetragen?
Kannst du das S10E per Ping erreichen?
Bist du im gleichen Subnetz wie dein E3DC?

Lade dir vom E§DC Portal die passende Anleitung herunter, hier gibt es auch eine zum Thema Modbus.

Ist soweit alles in Ordnung und du bekommst immer noch keine Verbindung, so stell mal ein list von deinem ModbusAttr (in CodeTags hier ein.

Gruß Reinhard
Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky

odie13690

Hallo,

habe noch mal alles geprüft. Einstellungen Modbus im S10 sind korrekt (Port 502, ID 1). Portfreigabe im Router ist gesetzt. ping auf die IP des S10 klappt. FHEM-IP ist die 192.168.0.39, also im selben Subnetz.

Anbei das List

Internals:
   DEF        192.168.0.100:502
   DeviceName 192.168.0.100:502
   EXPECT     idle
   FUUID      5f9d46e8-f33f-9c2c-975c-11e3b2812330b832
   LASTOPEN   1608546517.11419
   NAME       S3DC
   NEXT_OPEN  1608546528.75201
   NR         1434
   NTFY_ORDER 50-S3DC
   PARTIAL   
   STATE      disconnected
   SerialConn 1
   TYPE       Modbus
   devioLoglevel 3
   nextOpenDelay 60
   READ:
     BUFFER     
   READINGS:
     2020-12-21 11:27:48   state           disconnected
Attributes:
   alias      S3DC
   room       Photovoltaik


odie13690

Rewe2000

#19
Hallo odie13690,

mir fehlt in deinem List bei define die Angabe von <Id> <Interval> und <TCP>, prüfe bitte nochmals deine define Anweisung, diese müsste in deinem Fall genauso wie in der Zeile 2 (bei CodeTags unten) aussehen.
define <name> ModbusAttr <Id> <Interval> <Address:Port> <RTU|ASCII|TCP>
define S3DC ModbusAttr 1 20 192.168.0.100:502 TCP


Guck dir bitte nochmals den Screen vom Hauskraftwerk genau an, ob du Modbus tatsächlich freigeschaltet hast, E3DC hat eine eigene Philosophie wie betätigte Button dargestellt werden. Die Einstellung bei dir muss genauso wie im angehängten Bild (aus Modbus Handbuch E3DC) aussehen, die obere Zeile muss zwingend grün sein!

Sollte es immer noch nicht klappen, so könnte in deinem Heimnetz noch ein Firewall (Portfreigabe) die Kommunikation verhindern, klappt das Pingen, ist zumindest der Speicher von Fhem aus zu erreichen.

Stehen bei dir noch weiter Fehler im Fhem Log, ggf. für einige Minuten den Loglevel (verbose) vom ModbusAttr Modul erhöhen, auf 4 oder 5 (produziert aber ggf. viele Meldungen im Log.

Bringt dies alles nicht die Lösung, so würde ich ein externes ModBus Programm im Heimnetz starten und versuchen mit diesem Daten über ModBus vom Speicher abzuholen, somit lässt sich dann eingrenzen wo überhaupt der Fehler liegt.

Hinweis:
Unter Windows kannst du mit telnet von einem Rechner im Heimnetz testen, ob ein Port geöffnet ist. Telnet ist bei Windows standardmäßig nicht aktiv, du kannst es aber gemäß folgender Anleitung https://www.acronis.com/de-de/articles/telnet/ ausführen.

Viel Erfolg
Gruß Reinhard


Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky

odie13690

Zitat von: Rewe2000 am 21 Dezember 2020, 12:19:44
Guck dir bitte nochmals den Screen vom Hauskraftwerk genau an, ob du Modbus tatsächlich freigeschaltet hast, E3DC hat eine eigene Philosophie wie betätigte Button dargestellt werden. Die Einstellung bei dir muss genauso wie im angehängten Bild (aus Modbus Handbuch E3DC) aussehen, die obere Zeile muss zwingend grün sein!

Das war der Grund! Ich hatte mich von dem umrahmten "Ein"-Button überzeugen lassen. Danke!

odie13690

dyna

Hallo,

ich habe die Einbindung der E3DC super mit der Beschreibung hier hinbekommen. Danke dafür.

Ich würde gerne auch die Autarkie und den Eigenstrom anzeigen lassen und habe mir dazu die API-Beschreibung der E3DC angesehen, kann das aber nicht in fhem umsetzen. Kann mir jemand dabei helfen?

Ich habe die API-Doku angehangen.

Grüße
dyna


mutschler

hallo, ich habe die Anbindung meines E3DC auch auf diese Weise super hin bekommen!
Vielen Dank dafür!!!!

lasse mir daraus aus psuhnachrichten z.b über den Akkustatus senden (wenn man es braucht :-)  )

weiss vielleicht jemand wie diese "Notstrom"- Anzeige funktioniert

Hintergrund ist, dass ich mir gerne auch eine Nachricht senden würde wenn das HKW in den Inselbetrieb geht.

Vielen Dank im voraus

Rewe2000

#24
Hallo mutschler,

du muss das Modbus Register 40084 Emergency-Power Status auswerten, der Notstromstatus wird hier kodiert (Uint16 - Werte 0-4) übertragen.
Ich erledige dies mit einem userreading, direkt in meinem Modbus Baustein.

Du wirst vermutlich Modbus anders empfangen, aber die Auswertung über userreading sollte auch bei dir gleich möglich sein.

Anbei mein Device als RAW-Import:
defmod Notstrom_Status ModbusRegister 40084
attr Notstrom_Status DbLogExclude .*
attr Notstrom_Status IODev Stromspeicher
attr Notstrom_Status event-on-change-reading .*
attr Notstrom_Status group Kommunikation
attr Notstrom_Status icon sani_solar@red
attr Notstrom_Status plcDataType INT
attr Notstrom_Status registerType Holding
attr Notstrom_Status room Hauskraftwerk
attr Notstrom_Status stateFormat { sprintf("%016b",ReadingsNum($name, "state", "0")) }
attr Notstrom_Status updateInterval 10
attr Notstrom_Status userReadings STATE {\
if (ReadingsNum($name,"state",0)  == 0) {return "nicht unterstüzt"}\
elsif (ReadingsNum($name,"state",0)  == 1) {return "Notstrombetrieb"}\
elsif (ReadingsNum($name,"state",0)  == 2) {return "Netzbetrieb"}\
elsif (ReadingsNum($name,"state",0)  == 3) {return "Notstrom nicht vorhanden"}\
elsif (ReadingsNum($name,"state",0)  == 4) {return "Notstromschalter keine Grundstellung"}\
else {return "unbekannt"}\
}

setstate Notstrom_Status 0000000000000010
setstate Notstrom_Status 2023-03-20 19:41:41 IODev Stromspeicher
setstate Notstrom_Status 2023-03-22 17:27:02 RAW 0002
setstate Notstrom_Status 2023-03-22 17:27:02 STATE Netzbetrieb
setstate Notstrom_Status 2023-03-22 17:27:02 state 2

Ich stelle analog vom Status STATE vom Device den Betriebszustand vom Hauskraftwerk, mit unterschiedlichen Icons in FUIP dar, das klappt prima.
Bei Fragen einfach nochmals melden.

Du kannst natürlich auch ein notify oder doif erstellen welches die Werte von state direkt numerisch abfragt.
1 = Notstrombetrieb
2 = Netzbetrieb
Das ist für dich wahrscheinlich passender.

Gruß Reinhard
Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky

mutschler

#25
Zitat von: Rewe2000 am 22 März 2023, 17:40:15Hallo mutschler,

du muss das Modbus Register 40084 Emergency-Power Status auswerten, der Notstromstatus wird hier kodiert (Uint16 - Werte 0-4) übertragen.
Ich erledige dies mit einem userreading, direkt in meinem Modbus Baustein.

Du wirst vermutlich Modbus anders empfangen, aber die Auswertung über userreading sollte auch bei dir gleich möglich sein.

Anbei mein Device als RAW-Import:
defmod Notstrom_Status ModbusRegister 40084
attr Notstrom_Status DbLogExclude .*
attr Notstrom_Status IODev Stromspeicher
attr Notstrom_Status event-on-change-reading .*
attr Notstrom_Status group Kommunikation
attr Notstrom_Status icon sani_solar@red
attr Notstrom_Status plcDataType INT
attr Notstrom_Status registerType Holding
attr Notstrom_Status room Hauskraftwerk
attr Notstrom_Status stateFormat { sprintf("%016b",ReadingsNum($name, "state", "0")) }
attr Notstrom_Status updateInterval 10
attr Notstrom_Status userReadings STATE {\
if (ReadingsNum($name,"state",0)  == 0) {return "nicht unterstüzt"}\
elsif (ReadingsNum($name,"state",0)  == 1) {return "Notstrombetrieb"}\
elsif (ReadingsNum($name,"state",0)  == 2) {return "Netzbetrieb"}\
elsif (ReadingsNum($name,"state",0)  == 3) {return "Notstrom nicht vorhanden"}\
elsif (ReadingsNum($name,"state",0)  == 4) {return "Notstromschalter keine Grundstellung"}\
else {return "unbekannt"}\
}

setstate Notstrom_Status 0000000000000010
setstate Notstrom_Status 2023-03-20 19:41:41 IODev Stromspeicher
setstate Notstrom_Status 2023-03-22 17:27:02 RAW 0002
setstate Notstrom_Status 2023-03-22 17:27:02 STATE Netzbetrieb
setstate Notstrom_Status 2023-03-22 17:27:02 state 2

Ich stelle analog vom Status STATE vom Device den Betriebszustand vom Hauskraftwerk, mit unterschiedlichen Icons in FUIP dar, das klappt prima.
Bei Fragen einfach nochmals melden.

Du kannst natürlich auch ein notify oder doif erstellen welches die Werte von state direkt numerisch abfragt.
1 = Notstrombetrieb
2 = Netzbetrieb
Das ist für dich wahrscheinlich passender.

Gruß Reinhard
Hallo Reinhard,

vielen Dank für deinen Input.

Leider bin ich nicht so ein Profi in dieser Beziehung!

Daher kurze Verständnisfrage:
Wie komme ich an diesen Notstromstatus; eigener Modbus?
oder nur ein user reading?

Denke auch das ich danach einfach ein notify auf den "state" erstelle.

anbei mein device als Raw import
define S10 ModbusAttr 1 20 192.xxx.xxx.xxx:502 TCP
attr S10 userattr devStateIcon event-min-interval event-on-change-reading icon 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-h40083-len obj-h40083-poll obj-h40083-reading obj-h40083-unpack obj-h40084-poll obj-h40101-poll obj-h40102-poll 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 Strom
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", "")) ;; }
#   DEF        1 20 192.168.2.197:502 TCP
#   DeviceName 192.168.2.197:502
#   EXPECT     idle
#   FD         34
#   FUUID      6401dbfa-f33f-6528-586b-491ab7edc17d02dc
#   IODev      S10
#   Interval   20
#   LASTOPEN   1679483391.30982
#   MODBUSID   1
#   MODE       master
#   MODULEVERSION Modbus 4.4.11 - 5.10.2022
#   NAME       S10
#   NOTIFYDEV  global
#   NR         168
#   NTFY_ORDER 50-S10
#   PARTIAL   
#   PROTOCOL   TCP
#   STATE      opened
#   TCPConn    1
#   TYPE       ModbusAttr
#   devioLoglevel 3
#   eventCount 58015
#   nextOpenDelay 60
#   QUEUE:
#   READ:
#     BUFFER    
#   READINGS:
#     2023-03-26 13:52:48   Leistung        2540
#     2023-03-26 13:52:48   battsoc         100
#     2023-03-26 13:52:48   battwatt        0
#     2023-03-26 13:52:48   battwatt0       0
#     2023-03-26 13:52:48   gridwatt        -92
#     2023-03-26 13:52:48   gridwatt0       65444
#     2023-03-26 13:52:48   homewatt        2489
#     2023-03-26 13:52:48   homewatt0       2489
#     2023-03-26 13:52:48   notstrom       
#     2023-03-26 13:52:48   seriennr        12383
#     2023-03-22 12:09:52   state           opened
#     2023-03-26 13:52:48   sun2wat         0
#     2023-03-26 13:52:48   sun2wat2        0
#     2023-03-26 13:52:48   sun2watt        0
#     2023-03-26 13:52:48   sun2watt2       0
#     2023-03-26 13:52:48   sunwatt         2540
#     2023-03-26 13:52:48   zusatzwatt      4294901760
#   REMEMBER:
#     lid        1
#     lname      S10
#     lrecv      1679831568.67426
#     lsend      1679831568.67314
#   defptr:
#     S10        1
#   gotReadings:
#     battsoc    100
#   lastRead:
#     h40052     1679831568.03653
#     h40066     1679831568.14187
#     h40068     1679831568.24896
#     h40070     1679831568.35523
#     h40072     1679831568.46334
#     h40074     1679831568.57148
#     h40082     1679831568.67597
#
setstate S10 opened
setstate S10 2023-03-26 13:52:48 Leistung 2540
setstate S10 2023-03-26 13:52:48 battsoc 100
setstate S10 2023-03-26 13:52:48 battwatt 0
setstate S10 2023-03-26 13:52:48 battwatt0 0
setstate S10 2023-03-26 13:52:48 gridwatt -92
setstate S10 2023-03-26 13:52:48 gridwatt0 65444
setstate S10 2023-03-26 13:52:48 homewatt 2489
setstate S10 2023-03-26 13:52:48 homewatt0 2489
setstate S10 2023-03-26 13:52:48 notstrom
setstate S10 2023-03-26 13:52:48 seriennr 12383
setstate S10 2023-03-22 12:09:52 state opened
setstate S10 2023-03-26 13:52:48 sun2wat 0
setstate S10 2023-03-26 13:52:48 sun2wat2 0
setstate S10 2023-03-26 13:52:48 sun2watt 0
setstate S10 2023-03-26 13:52:48 sun2watt2 0
setstate S10 2023-03-26 13:52:48 sunwatt 2540
setstate S10 2023-03-26 13:52:48 zusatzwatt 4294901760


Rewe2000

#26
Hallo mutschler,

eigeltlich erhälts du den Notstrom Status ja bereits in einem userreading "notstrom" in deinem Device "ModbusAttr".

attr S10 userReadings......
notstrom { (ReadingsVal("S10", "ems", "")) ;; },

Was mich nur wudert, ich sehe da keinen Wert beim Reading hinter notstrom:

setstate S10 2023-03-26 13:52:48 notstrom
Eventuell verwendest du den falschen Datentyp bei dem Modbus Register oder du musst dieses ev. anders auslesen.

attr S10 obj-h40084-len 1
attr S10 obj-h40084-reading ems
attr S10 obj-h40084-unpack n

In anderen Forenbeiträgen wird das Modbus Register mit "attr S10 obj-h40084-poll 1" gelesen, eventuell liegt ja hier das Problem (ist aber nur eine Vermutung).

Leider verwende ich nicht dieses Device für Modbus und ich kann dir hier nicht direkt weiterhelfen. Versuch doch mal das Register 40084 anders zu lesen, damit auch beim Reading ein Wert angezeigt wird. Eigentlich sollte hier eine Zahl (0 bis 4) stehen, welche du dann über ein notify auswerten kannst. Gemäß der E3DC Modbus Doku, sollte der gesuchte Wert als Uint16 mit Länge 1 geliefert werden.

Wenn es um das Thema Modbus geht, so solltest du deine konkrete Frage im passenden Forum Sonstiges, Maintainer: Stefan Strobel stellen, damit dir hier schneller geholfen werden kann.

Gruß Reinhard
Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky

Rewe2000

Hallo mutschler,

das hat mir jetzt keine Ruhe mehr gelassen und ich habe bei mir getestet. Folgendes Modul sollte funktionieren (natürlich mit deiner korrekten IP-Adresse):

defmod E3DC_S10E ModbusAttr 1 10 192.168.00.50:502 TCP
attr E3DC_S10E userattr devStateIcon event-min-interval event-on-change-reading icon
attr E3DC_S10E DbLogExclude .*
attr E3DC_S10E devStateIcon opened:rc_WEB@green  disconnected:rc_WEB@red
attr E3DC_S10E event-min-interval Firmware:3600,Hersteller:3600,Modell:3600,Seriennummer:3600
attr E3DC_S10E event-on-change-reading .*
attr E3DC_S10E group Kommunikation
attr E3DC_S10E icon measure_photovoltaic_inst@blue
attr E3DC_S10E obj-h40003-len 16
attr E3DC_S10E obj-h40003-poll 1
attr E3DC_S10E obj-h40003-reading Hersteller
attr E3DC_S10E obj-h40003-unpack a*
attr E3DC_S10E obj-h40018-len 16
attr E3DC_S10E obj-h40018-poll 1
attr E3DC_S10E obj-h40018-reading Modell
attr E3DC_S10E obj-h40018-unpack a*
attr E3DC_S10E obj-h40034-len 16
attr E3DC_S10E obj-h40034-poll 1
attr E3DC_S10E obj-h40034-reading Seriennummer
attr E3DC_S10E obj-h40034-unpack a*
attr E3DC_S10E obj-h40050-len 16
attr E3DC_S10E obj-h40050-poll 1
attr E3DC_S10E obj-h40050-reading Firmware
attr E3DC_S10E obj-h40050-unpack a*
attr E3DC_S10E obj-h40083-len 1
attr E3DC_S10E obj-h40083-map 0:nicht unterstüzt, 1:Notstrombetrieb, 2:Netzbetrieb, 3:Notstrom nicht vorhanden, 4:Notstromschalter keine Grundstellung
attr E3DC_S10E obj-h40083-poll 1
attr E3DC_S10E obj-h40083-reading Notstrom_Status
attr E3DC_S10E obj-h40083-unpack n
attr E3DC_S10E obj-h40084-len 1
attr E3DC_S10E obj-h40084-poll 1
attr E3DC_S10E obj-h40084-reading EMS_Status
attr E3DC_S10E obj-h40084-unpack B*
attr E3DC_S10E room Hauskraftwerk
attr E3DC_S10E userReadings Batterie_laden_gesperrt:EMS_Status.* {substr(ReadingsNum($name, "EMS_Status", "0"),15,1)},\
Batterie_entladen_gesperrt:EMS_Status.* {substr(ReadingsNum($name, "EMS_Status", "0"),14,1)},\
Notstrommodus_moeglich:EMS_Status.* {substr(ReadingsNum($name, "EMS_Status", "0"),13,1)},\
Batterieladung_Wetterbedingt_zuruckgestellt:EMS_Status.* {substr(ReadingsNum($name, "EMS_Status", "0"),12,1)},\
Abregelung_aktiv:EMS_Status.* {substr(ReadingsNum($name, "EMS_Status", "0"),11,1)},\
Ladesperrzeit_aktiv:EMS_Status.* {substr(ReadingsNum($name, "EMS_Status", "0"),10,1)},\
Entladesperrzeit_aktiv:EMS_Status.* {substr(ReadingsNum($name, "EMS_Status", "0"),9,1)}
attr E3DC_S10E verbose 2

setstate E3DC_S10E opened
setstate E3DC_S10E 2023-03-28 18:25:21 Abregelung_aktiv 0
setstate E3DC_S10E 2023-03-28 18:25:21 Batterie_entladen_gesperrt 0
setstate E3DC_S10E 2023-03-28 18:25:21 Batterie_laden_gesperrt 0
setstate E3DC_S10E 2023-03-28 18:25:21 Batterieladung_Wetterbedingt_zuruckgestellt 0
setstate E3DC_S10E 2023-03-28 18:31:31 EMS_Status 0000000000000100
setstate E3DC_S10E 2023-03-28 18:25:21 Entladesperrzeit_aktiv 0
setstate E3DC_S10E 2023-03-28 18:31:31 Firmware  S10_2022_04
setstate E3DC_S10E 2023-03-28 18:31:30 Hersteller HagerEnergy GmbH
setstate E3DC_S10E 2023-03-28 18:25:21 Ladesperrzeit_aktiv 0
setstate E3DC_S10E 2023-03-28 18:31:31 Modell  S10
setstate E3DC_S10E 2023-03-28 18:31:31 Notstrom_Status Netzbetrieb
setstate E3DC_S10E 2023-03-28 18:25:21 Notstrommodus_moeglich 1
setstate E3DC_S10E 2023-03-28 18:31:31 Seriennummer S10-xxxxxxxxxxxx
setstate E3DC_S10E 2023-03-28 18:19:12 state opened


Folgendes solltest du beachten:
  • Die E3DC Modbus Register müssen alle (gemäß E3DC Doku), mit ModbusAttr, mit -1 gelesen werden (Register 40084 mit obj-h40083).
  • Den Notstrom_Status wandle ich über -map direkt in ein sprechendes Wort um, ist für mich so übersichtlicher
    Du kannst natürlich auch das attr -map löschen und ein notify direkt auf die gelieferte Zahl ansetzen, 1 wäre hier der Notstrombetrieb
  • Der EMS-Status dagegen muss über die einzelnen Bits ausgelesen werden, da gleichzeitig mehrere Zustände zutreffen können und dann passt der Wert der Zahl nicht mehr. Ich erledige dies über einzelne Readings, welche ich über userReadings setze

Ich hoffe du kannst das so nachvollziehen und ich konnte dir damit weiterhelfen.

Gruß Reinhard
Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky

mutschler

Zitat von: Rewe2000 am 28 März 2023, 18:55:46Hallo mutschler,

das hat mir jetzt keine Ruhe mehr gelassen und ich habe bei mir getestet. Folgendes Modul sollte funktionieren (natürlich mit deiner korrekten IP-Adresse):

defmod E3DC_S10E ModbusAttr 1 10 192.168.00.50:502 TCP
attr E3DC_S10E userattr devStateIcon event-min-interval event-on-change-reading icon
attr E3DC_S10E DbLogExclude .*
attr E3DC_S10E devStateIcon opened:rc_WEB@green  disconnected:rc_WEB@red
attr E3DC_S10E event-min-interval Firmware:3600,Hersteller:3600,Modell:3600,Seriennummer:3600
attr E3DC_S10E event-on-change-reading .*
attr E3DC_S10E group Kommunikation
attr E3DC_S10E icon measure_photovoltaic_inst@blue
attr E3DC_S10E obj-h40003-len 16
attr E3DC_S10E obj-h40003-poll 1
attr E3DC_S10E obj-h40003-reading Hersteller
attr E3DC_S10E obj-h40003-unpack a*
attr E3DC_S10E obj-h40018-len 16
attr E3DC_S10E obj-h40018-poll 1
attr E3DC_S10E obj-h40018-reading Modell
attr E3DC_S10E obj-h40018-unpack a*
attr E3DC_S10E obj-h40034-len 16
attr E3DC_S10E obj-h40034-poll 1
attr E3DC_S10E obj-h40034-reading Seriennummer
attr E3DC_S10E obj-h40034-unpack a*
attr E3DC_S10E obj-h40050-len 16
attr E3DC_S10E obj-h40050-poll 1
attr E3DC_S10E obj-h40050-reading Firmware
attr E3DC_S10E obj-h40050-unpack a*
attr E3DC_S10E obj-h40083-len 1
attr E3DC_S10E obj-h40083-map 0:nicht unterstüzt, 1:Notstrombetrieb, 2:Netzbetrieb, 3:Notstrom nicht vorhanden, 4:Notstromschalter keine Grundstellung
attr E3DC_S10E obj-h40083-poll 1
attr E3DC_S10E obj-h40083-reading Notstrom_Status
attr E3DC_S10E obj-h40083-unpack n
attr E3DC_S10E obj-h40084-len 1
attr E3DC_S10E obj-h40084-poll 1
attr E3DC_S10E obj-h40084-reading EMS_Status
attr E3DC_S10E obj-h40084-unpack B*
attr E3DC_S10E room Hauskraftwerk
attr E3DC_S10E userReadings Batterie_laden_gesperrt:EMS_Status.* {substr(ReadingsNum($name, "EMS_Status", "0"),15,1)},\
Batterie_entladen_gesperrt:EMS_Status.* {substr(ReadingsNum($name, "EMS_Status", "0"),14,1)},\
Notstrommodus_moeglich:EMS_Status.* {substr(ReadingsNum($name, "EMS_Status", "0"),13,1)},\
Batterieladung_Wetterbedingt_zuruckgestellt:EMS_Status.* {substr(ReadingsNum($name, "EMS_Status", "0"),12,1)},\
Abregelung_aktiv:EMS_Status.* {substr(ReadingsNum($name, "EMS_Status", "0"),11,1)},\
Ladesperrzeit_aktiv:EMS_Status.* {substr(ReadingsNum($name, "EMS_Status", "0"),10,1)},\
Entladesperrzeit_aktiv:EMS_Status.* {substr(ReadingsNum($name, "EMS_Status", "0"),9,1)}
attr E3DC_S10E verbose 2

setstate E3DC_S10E opened
setstate E3DC_S10E 2023-03-28 18:25:21 Abregelung_aktiv 0
setstate E3DC_S10E 2023-03-28 18:25:21 Batterie_entladen_gesperrt 0
setstate E3DC_S10E 2023-03-28 18:25:21 Batterie_laden_gesperrt 0
setstate E3DC_S10E 2023-03-28 18:25:21 Batterieladung_Wetterbedingt_zuruckgestellt 0
setstate E3DC_S10E 2023-03-28 18:31:31 EMS_Status 0000000000000100
setstate E3DC_S10E 2023-03-28 18:25:21 Entladesperrzeit_aktiv 0
setstate E3DC_S10E 2023-03-28 18:31:31 Firmware  S10_2022_04
setstate E3DC_S10E 2023-03-28 18:31:30 Hersteller HagerEnergy GmbH
setstate E3DC_S10E 2023-03-28 18:25:21 Ladesperrzeit_aktiv 0
setstate E3DC_S10E 2023-03-28 18:31:31 Modell  S10
setstate E3DC_S10E 2023-03-28 18:31:31 Notstrom_Status Netzbetrieb
setstate E3DC_S10E 2023-03-28 18:25:21 Notstrommodus_moeglich 1
setstate E3DC_S10E 2023-03-28 18:31:31 Seriennummer S10-xxxxxxxxxxxx
setstate E3DC_S10E 2023-03-28 18:19:12 state opened


Folgendes solltest du beachten:
  • Die E3DC Modbus Register müssen alle (gemäß E3DC Doku), mit ModbusAttr, mit -1 gelesen werden (Register 40084 mit obj-h40083).
  • Den Notstrom_Status wandle ich über -map direkt in ein sprechendes Wort um, ist für mich so übersichtlicher
    Du kannst natürlich auch das attr -map löschen und ein notify direkt auf die gelieferte Zahl ansetzen, 1 wäre hier der Notstrombetrieb
  • Der EMS-Status dagegen muss über die einzelnen Bits ausgelesen werden, da gleichzeitig mehrere Zustände zutreffen können und dann passt der Wert der Zahl nicht mehr. Ich erledige dies über einzelne Readings, welche ich über userReadings setze

Ich hoffe du kannst das so nachvollziehen und ich konnte dir damit weiterhelfen.

Gruß Reinhard
Hallo Reinhard, wielen Dank für die Bemühungen! echt klasse

bekomme den Status vom Notstrom angezeigt; jetzt muss ich nur noch ein meiner Benachrichtigung via notify oder DOIF arbeiten, da es hier noch irgendein Problem gibt!

Nachmals Vielen Dank!

Gruß
Mutschler