ModbusAttr an Wechselrichter SolarEdge SE10k [gelöst]

Begonnen von BenMarloe, 09 Dezember 2017, 00:14:24

Vorheriges Thema - Nächstes Thema

kingmathers

Zitat von: Benni am 03 Oktober 2018, 20:56:00
Die DC-Werte sind die Gleichstromwerte, als alles was vor der Umwandlung ist, sprich das was von der Photovoltaikanlage geliefert wird (Die Solar-Panels liefern Gleichstrom).

Danke, da hatte ich meinem Post beide Werte verwechselt. Macht so natürlich mehr Sinn.

Zitat von: Benni am 03 Oktober 2018, 20:56:00
Leider nein!
Ich habe bei mir zusätzlich noch eine Sonnenbatterie im Einsatz. Von der bekomme ich aber die Werte zu Einspeisung und Verbrauch.

Auch diese Werte kommen nicht über Modbus. Evtl. lassen sich die aber über das SolarEdge-Portal auslesen. Damit habe ich mich aber noch nicht beschäftigt.
Ansonsten ja: Selbst loggen und berechnen.

gb#

Ok die kumulierten Werte werde ich mir dann selbst mitloggen. Dass die Einspeisung etc. nicht sichtbar ist finde ich sehr schade, davon war ich eigentlich ausgegangen. Den Weg übers SolarEdge Portal wollte ich vermeiden, um die Werte schneller und zuverlässiger direkt vom Wechselrichter auslesen zu können.

Eine Batterie habe ich aktuell nicht, ich werde mal schauen ob ich aus dem Stromzähler diese Werte auslesen kann und sonst doch übers SolarEdge Webportal gehen.

Vielen Dank Für die Hinweise sowie die ausführliche Beschreibung!
Raspberry Pi B+, FS20, 1-Wire, HM
FHEM Home Control (App für Windows 10): https://forum.fhem.de/index.php/topic,49891.0.html
FHEM Arduino Library: https://forum.fhem.de/index.php/topic,94093.0.html

maci

Zitat von: kingmathers am 03 Oktober 2018, 21:14:11
Dass die Einspeisung etc. nicht sichtbar ist finde ich sehr schade, davon war ich eigentlich ausgegangen.

Die Einspeisung kannst du am Wechselrichter nicht sehen, denn nach dem Wechselrichter ist ja noch dein Hausnetz.
Wieviel du einspeist kannst am Stromzähler ablesen. Nur da bekommst du den richtigen Wert.
Fhem auf Dell Thinclient, Fhem auf Raspebrry Pi4,
UniPi Vers. 1.1 mit Raspberry Pi3, 1wire USB Adapter mit OWX
Netatmo Wetterstation + Regenmesser + Netatmo Thermostat
Homematic mit HMLan

kingmathers

Wenn ich das richtig gesehen habe (bin aktuell nicht vor Ort) ist der Stromzähler mit dem Wechselrichter verbunden und auf dem Display wird angezeigt, wie viel Strom vom Haus verbraucht wird sowie die Einspeisung.

Ich werde demnächst versuchen, diese Werte aus dem Stromzähler direkt auszulesen, da bin ich ja direkt an der Quelle.
Raspberry Pi B+, FS20, 1-Wire, HM
FHEM Home Control (App für Windows 10): https://forum.fhem.de/index.php/topic,49891.0.html
FHEM Arduino Library: https://forum.fhem.de/index.php/topic,94093.0.html

Benni

Zitat von: kingmathers am 04 Oktober 2018, 06:22:43
Wenn ich das richtig gesehen habe (bin aktuell nicht vor Ort) ist der Stromzähler mit dem Wechselrichter verbunden und auf dem Display wird angezeigt, wie viel Strom vom Haus verbraucht wird sowie die Einspeisung.

Normalerweise müsste der Wechselrichter seine Informationen über ein Leistungsmessgerät bekommen, das ebenfalls im Schaltschrank verbaut ist, nicht vom Stromzähler direkt.
Allerdings stellt der WR die Werte nicht per Modbus zur Verfügung.
Bei mir erhalte ich die Werte vom LMG über das API der Sonnenbatterie zur Auswertung. Die wiederum sind aber leider nicht hundertprozentig mit den Ist-Daten des Stromzählers synchron, deshalb bin ich bei mir gerade auch daran, den Zweirichtungszähler direkt auswerten zu wollen. Dafür kannst du dir ja mal das Volkszähler-Projekt anschauen.
Oder falls dein Stromzähler kompatibel ist, die Homematic-Lösung. Die HM-Variante  war bei meinem Zähler leider nicht kompatibel, daher hätte ich sogar sowohl den ES-IEC, als auch die zugehörigen HM-Zählersensor Sendeeinheit abzugeben.

gb#

kingmathers

Zitat von: BenMarloe am 05 September 2018, 20:25:56
Hallo Benni,
freut mich, wenn meine Vorarbeit nützlich war. Danke dass Du Deine Erkenntnisse veröffentlichst.Wie hast Du das Problem gelöst, dass Wert und Skalierung auf zwei verschienden Registern kommen und gelegentlich nicht gleichzeitig geändert werden, obwohl das nötig wäre?
GrußBenMarloe

Ich hatte das gleiche Problem (mit Bennis Definition), dass der Scaling Factor erst 1-2s nach dem eigentlichen Wert aktualisiert wurde. Bis zum nächsten Update war der Wert also um den Faktor 10 zu hoch oder zu niedrig, was vor allem in den Fraphen auffällt.

Ich habe es nun so gelöst, dass ich die Berechnung von I_AC_Power ausschließlich durch ein Update des Readings I_AC_Power_SF triggere. Dann ist der eigentliche Wert bereits aktualisiert worden.

So ähnlich hattest du es auch gemacht oder?

Kann man die Reihenfolge, in welcher die Readings per Modbus gelesen warden, selbst festlegen? Dann könnte man ja einfach vorgeben, dass die Scaling Factors zuerst gelesen werden sollen.
Raspberry Pi B+, FS20, 1-Wire, HM
FHEM Home Control (App für Windows 10): https://forum.fhem.de/index.php/topic,49891.0.html
FHEM Arduino Library: https://forum.fhem.de/index.php/topic,94093.0.html

StefanStrobel

Hallo,

mit dem Attribut sortUpdate kann man erreichen, dass die Register in aufsteigender Reihenfolge abgefragt werden.
In Eurem Fall müsste aber der Scale-Wert zuerst gelesen werden und der kommt ja so wie ich es verstanden habe nach dem eigentlichen Wert.
Wenn man es genau nimmt, müsste man sogar beide Register zusammen auslesen, sonst könnte sich die Skalierung genau zwischen dem Lesen der Skalierung und des Wertes ändern...

Ein ganz anderer Lösungsansatz wäre dass man nicht mehr ein Reading für h40083 (Power) und eines für h40084(Scale) verwendet, sondern h40083 mit len 2 ausliest und in der h40083-expr selbst die beiden Werte auseinanderpflückt (mit unpack) und dann daraus den korrekten Wert berechnet.
Dann wird beides immer korrekt zusammen gelesen und die Umrechnung findet über die Perl-Expression direkt beim Lesen statt.

Gruss
   Stefan



StefanStrobel

Hallo,

um Euch das mit dem Scale/Wert zu erleichtern, habe ich in der neuen Version des Modbus-Moduls eine Kleinigkeit geändert:
in den expr-Attributen steht künftig der Wert nach dem unpack nicht nur als $val sondern auch als @val zu Verfügung.
In diesem Array stehen mehrere Werte, wenn der unpack mehrere Werte erzeugt.

Beispiel:

attr MBETest obj-h801-reading test1
attr MBETest obj-h801-len 2
attr MBETest obj-h801-unpack s>s>
attr MBETest obj-h801-expr "$val[0] $val[1]"


Durch len 2 werden zwei Register gleichzeitig (im Beispiel 801 und 802) gelesen.
Der unpack-Code s>s> erzeugt zwei Werte im Array @val. 801 steht dann in $val[0] und 802 in $val[1].
In der Expr werden die Werte dann zusammengebaut (hier nur mit einem Space verkettet, in Eurem Fall vermutlich irgendwie mit Zehnerpotenzen multimpliziert).

Die neue Version ist in diesem Thread:
https://forum.fhem.de/index.php/topic,75638.135.html

Gruss
  Stefan

Benni

Hallo Stefan,

das klingt ja gut!
Mal sehen, ob ich heute noch dazu komme ...

Vielen Dank!

gb#

pejonp

#53
Hallo,

ich habe mal die Modbus-Register vom SolarEdge in ein Modul gepackt. Hatte ich schon lange vor. Ich habe einen SolarEdge SE5K .
Die Ports sind etwas anders, weil die RS485 Schnittstelle über einen USR-TCP232-T24 (https://www.usriot.com/download/T24/USR-TCP232-T24-EN%20V3.2.5.pdf) angebunden ist. Mein SE5K hat noch nicht ModBus TCP.

2 Sachen passen beim neuen Modul noch nicht.


I_AC_Energie_WH 67633426.000000 Wh  ist falsch, finde den Fehler nicht. richtig ist 17957.90 kWh



C_SunSpec_ID nSSu  ist falsch herrum  -> SunS ist richtig


Hier mal 2 Logs zum vergleichen ist ein SolarEdge WS nur über 2 weg ausgelsen.

1. hier der Log vom über "defmod PWP ModbusAttr 3 60 192.168.2.7:20108 RTU" angelegten SolarEdge (I_AC_Energie_WH = 17957.90 kWh):

2018.10.15 23:31:59.094 4: PWP: ParseObj for I_AC_Strom_SF assigns 65534
2018.10.15 23:31:59.095 5: PWP: ParseObj moves to next object, skip 1 to h76
2018.10.15 23:31:59.095 5: PWP: ParseObj has no information about parsing h76
2018.10.15 23:31:59.095 5: PWP: ParseObj moves to next object, skip 1 to h77
2018.10.15 23:31:59.095 5: PWP: ParseObj has no information about parsing h77
2018.10.15 23:31:59.096 5: PWP: ParseObj moves to next object, skip 1 to h78
2018.10.15 23:31:59.096 5: PWP: ParseObj has no information about parsing h78
2018.10.15 23:31:59.096 5: PWP: ParseObj moves to next object, skip 1 to h79
2018.10.15 23:31:59.096 5: PWP: ParseObj has no information about parsing h79
2018.10.15 23:31:59.097 5: PWP: ParseObj moves to next object, skip 1 to h80
2018.10.15 23:31:59.097 5: PWP: ParseObj has no information about parsing h80
2018.10.15 23:31:59.097 5: PWP: ParseObj moves to next object, skip 1 to h81
2018.10.15 23:31:59.097 5: PWP: ParseObj has no information about parsing h81
2018.10.15 23:31:59.098 5: PWP: ParseObj moves to next object, skip 1 to h82
2018.10.15 23:31:59.098 5: PWP: ParseObj has no information about parsing h82
2018.10.15 23:31:59.098 5: PWP: ParseObj moves to next object, skip 1 to h83
2018.10.15 23:31:59.100 5: PWP: ParseObj ObjInfo for h83: reading=I_AC_Leistung_W, unpack=n, expr=, format=, map=
2018.10.15 23:31:59.100 5: PWP: ParseObj unpacked 00000000138bfffe000000000000000000000000011204080000ffff800000000000000000008000000080008000fffe0002 with n to hex 30 (0)
2018.10.15 23:31:59.101 4: PWP: ParseObj for I_AC_Leistung_W assigns 0
2018.10.15 23:31:59.101 5: PWP: ParseObj moves to next object, skip 1 to h84
2018.10.15 23:31:59.103 5: PWP: ParseObj ObjInfo for h84: reading=I_AC_Leistung_SF, unpack=n, expr=$val, format=, map=
2018.10.15 23:31:59.103 5: PWP: ParseObj unpacked 0000138bfffe000000000000000000000000011204080000ffff800000000000000000008000000080008000fffe0002 with n to hex 30 (0)
2018.10.15 23:31:59.103 5: PWP: ParseObj evaluates expr for I_AC_Leistung_SF, val=0, expr $val
2018.10.15 23:31:59.104 5: PWP: ParseObj eval result is 0
2018.10.15 23:31:59.104 4: PWP: ParseObj for I_AC_Leistung_SF assigns 0
2018.10.15 23:31:59.105 5: PWP: ParseObj moves to next object, skip 1 to h85
2018.10.15 23:31:59.106 5: PWP: ParseObj ObjInfo for h85: reading=I_AC_Frequenz_Hz, unpack=n, expr=$val, format=, map=
2018.10.15 23:31:59.107 5: PWP: ParseObj unpacked 138bfffe000000000000000000000000011204080000ffff800000000000000000008000000080008000fffe0002 with n to hex 35303033 (5003)
2018.10.15 23:31:59.107 5: PWP: ParseObj evaluates expr for I_AC_Frequenz_Hz, val=5003, expr $val
2018.10.15 23:31:59.107 5: PWP: ParseObj eval result is 5003
2018.10.15 23:31:59.108 4: PWP: ParseObj for I_AC_Frequenz_Hz assigns 5003
2018.10.15 23:31:59.108 5: PWP: ParseObj moves to next object, skip 1 to h86
2018.10.15 23:31:59.110 5: PWP: ParseObj ObjInfo for h86: reading=I_AC_Frequenz_SF, unpack=n, expr=$val, format=, map=
2018.10.15 23:31:59.110 5: PWP: ParseObj unpacked fffe000000000000000000000000011204080000ffff800000000000000000008000000080008000fffe0002 with n to hex 3635353334 (65534)
2018.10.15 23:31:59.110 5: PWP: ParseObj evaluates expr for I_AC_Frequenz_SF, val=65534, expr $val
2018.10.15 23:31:59.111 5: PWP: ParseObj eval result is 65534
2018.10.15 23:31:59.111 4: PWP: ParseObj for I_AC_Frequenz_SF assigns 65534
2018.10.15 23:31:59.111 5: PWP: ParseObj moves to next object, skip 1 to h87
2018.10.15 23:31:59.113 5: PWP: ParseObj ObjInfo for h87: reading=I_AC_VA, unpack=n, expr=$val, format=, map=
2018.10.15 23:31:59.113 5: PWP: ParseObj unpacked 000000000000000000000000011204080000ffff800000000000000000008000000080008000fffe0002 with n to hex 30 (0)
2018.10.15 23:31:59.114 5: PWP: ParseObj evaluates expr for I_AC_VA, val=0, expr $val
2018.10.15 23:31:59.114 5: PWP: ParseObj eval result is 0
2018.10.15 23:31:59.114 4: PWP: ParseObj for I_AC_VA assigns 0
2018.10.15 23:31:59.115 5: PWP: ParseObj moves to next object, skip 1 to h88
2018.10.15 23:31:59.116 5: PWP: ParseObj ObjInfo for h88: reading=I_AC_VA_SF, unpack=n, expr=$val, format=, map=
2018.10.15 23:31:59.117 5: PWP: ParseObj unpacked 00000000000000000000011204080000ffff800000000000000000008000000080008000fffe0002 with n to hex 30 (0)
2018.10.15 23:31:59.117 5: PWP: ParseObj evaluates expr for I_AC_VA_SF, val=0, expr $val
2018.10.15 23:31:59.117 5: PWP: ParseObj eval result is 0
2018.10.15 23:31:59.118 4: PWP: ParseObj for I_AC_VA_SF assigns 0
2018.10.15 23:31:59.118 5: PWP: ParseObj moves to next object, skip 1 to h89
2018.10.15 23:31:59.120 5: PWP: ParseObj ObjInfo for h89: reading=I_AC_VAR, unpack=n, expr=$val, format=, map=
2018.10.15 23:31:59.120 5: PWP: ParseObj unpacked 0000000000000000011204080000ffff800000000000000000008000000080008000fffe0002 with n to hex 30 (0)
2018.10.15 23:31:59.120 5: PWP: ParseObj evaluates expr for I_AC_VAR, val=0, expr $val
2018.10.15 23:31:59.121 5: PWP: ParseObj eval result is 0
2018.10.15 23:31:59.121 4: PWP: ParseObj for I_AC_VAR assigns 0
2018.10.15 23:31:59.121 5: PWP: ParseObj moves to next object, skip 1 to h90
2018.10.15 23:31:59.123 5: PWP: ParseObj ObjInfo for h90: reading=I_AC_VAR_SF, unpack=n, expr=$val, format=, map=
2018.10.15 23:31:59.124 5: PWP: ParseObj unpacked 000000000000011204080000ffff800000000000000000008000000080008000fffe0002 with n to hex 30 (0)
2018.10.15 23:31:59.124 5: PWP: ParseObj evaluates expr for I_AC_VAR_SF, val=0, expr $val
2018.10.15 23:31:59.124 5: PWP: ParseObj eval result is 0
2018.10.15 23:31:59.124 4: PWP: ParseObj for I_AC_VAR_SF assigns 0
2018.10.15 23:31:59.125 5: PWP: ParseObj moves to next object, skip 1 to h91
2018.10.15 23:31:59.127 5: PWP: ParseObj ObjInfo for h91: reading=I_AC_PF_Prozent, unpack=n, expr=$val, format=, map=
2018.10.15 23:31:59.127 5: PWP: ParseObj unpacked 00000000011204080000ffff800000000000000000008000000080008000fffe0002 with n to hex 30 (0)
2018.10.15 23:31:59.127 5: PWP: ParseObj evaluates expr for I_AC_PF_Prozent, val=0, expr $val
2018.10.15 23:31:59.128 5: PWP: ParseObj eval result is 0
2018.10.15 23:31:59.128 4: PWP: ParseObj for I_AC_PF_Prozent assigns 0
2018.10.15 23:31:59.128 5: PWP: ParseObj moves to next object, skip 1 to h92
2018.10.15 23:31:59.130 5: PWP: ParseObj ObjInfo for h92: reading=I_AC_PF_SF, unpack=n, expr=$val, format=, map=
2018.10.15 23:31:59.130 5: PWP: ParseObj unpacked 0000011204080000ffff800000000000000000008000000080008000fffe0002 with n to hex 30 (0)
2018.10.15 23:31:59.131 5: PWP: ParseObj evaluates expr for I_AC_PF_SF, val=0, expr $val
2018.10.15 23:31:59.131 5: PWP: ParseObj eval result is 0
2018.10.15 23:31:59.131 4: PWP: ParseObj for I_AC_PF_SF assigns 0
2018.10.15 23:31:59.132 5: PWP: ParseObj moves to next object, skip 1 to h93
2018.10.15 23:31:59.133 5: PWP: ParseObj ObjInfo for h93: reading=I_AC_Energie_WH_kWh, unpack=l>, expr=$val / 1000, format=%.2f, map=
2018.10.15 23:31:59.134 5: PWP: ParseObj unpacked 011204080000ffff800000000000000000008000000080008000fffe0002 with l> to hex 3137393537383936 (17957896)
2018.10.15 23:31:59.134 5: PWP: ParseObj evaluates expr for I_AC_Energie_WH_kWh, val=17957896, expr $val / 1000
2018.10.15 23:31:59.134 5: PWP: ParseObj eval result is 17957.896
2018.10.15 23:31:59.135 5: PWP: ParseObj for I_AC_Energie_WH_kWh does sprintf with format %.2f value is 17957.896
2018.10.15 23:31:59.135 5: PWP: ParseObj for I_AC_Energie_WH_kWh sprintf result is 17957.90
2018.10.15 23:31:59.135 4: PWP: ParseObj for I_AC_Energie_WH_kWh assigns 17957.90
2018.10.15 23:31:59.136 5: PWP: ParseObj moves to next object, skip 2 to h95
2018.10.15 23:31:59.137 5: PWP: ParseObj ObjInfo for h95: reading=I_AC_Energie_WH_SF, unpack=n, expr=$val, format=, map=
2018.10.15 23:31:59.138 5: PWP: ParseObj unpacked 0000ffff800000000000000000008000000080008000fffe0002 with n to hex 30 (0)
2018.10.15 23:31:59.138 5: PWP: ParseObj evaluates expr for I_AC_Energie_WH_SF, val=0, expr $val
2018.10.15 23:31:59.138 5: PWP: ParseObj eval result is 0
2018.10.15 23:31:59.138 4: PWP: ParseObj for I_AC_Energie_WH_SF assigns 0
2018.10.15 23:31:59.139 5: PWP: ParseObj moves to next object, skip 1 to h96
2018.10.15 23:31:59.141 5: PWP: ParseObj ObjInfo for h96: reading=I_DC_Strom_A, unpack=n, expr=$val, format=, map=
2018.10.15 23:31:59.141 5: PWP: ParseObj unpacked ffff800000000000000000008000000080008000fffe0002 with n to hex 3635353335 (65535)
2018.10.15 23:31:59.141 5: PWP: ParseObj evaluates expr for I_DC_Strom_A, val=65535, expr $val
2018.10.15 23:31:59.142 5: PWP: ParseObj eval result is 65535
2018.10.15 23:31:59.142 4: PWP: ParseObj for I_DC_Strom_A assigns 65535
2018.10.15 23:31:59.142 5: PWP: ParseObj moves to next object, skip 1 to h97
2018.10.15 23:31:59.144 5: PWP: ParseObj ObjInfo for h97: reading=I_DC_Strom_SF, unpack=n, expr=$val, format=, map=
2018.10.15 23:31:59.144 5: PWP: ParseObj unpacked 800000000000000000008000000080008000fffe0002 with n to hex 3332373638 (32768)
2018.10.15 23:31:59.145 5: PWP: ParseObj evaluates expr for I_DC_Strom_SF, val=32768, expr $val
2018.10.15 23:31:59.145 5: PWP: ParseObj eval result is 32768
2018.10.15 23:31:59.145 4: PWP: ParseObj for I_DC_Strom_SF assigns 32768
2018.10.15 23:31:59.146 5: PWP: ParseObj moves to next object, skip 1 to h98
2018.10.15 23:31:59.147 5: PWP: ParseObj ObjInfo for h98: reading=I_DC_Spannung_V, unpack=n, expr=$val, format=, map=
2018.10.15 23:31:59.148 5: PWP: ParseObj unpacked 00000000000000008000000080008000fffe0002 with n to hex 30 (0)
2018.10.15 23:31:59.148 5: PWP: ParseObj evaluates expr for I_DC_Spannung_V, val=0, expr $val
2018.10.15 23:31:59.148 5: PWP: ParseObj eval result is 0
2018.10.15 23:31:59.149 4: PWP: ParseObj for I_DC_Spannung_V assigns 0
2018.10.15 23:31:59.149 5: PWP: ParseObj moves to next object, skip 1 to h99
2018.10.15 23:31:59.151 5: PWP: ParseObj ObjInfo for h99: reading=I_DC_Spannung_SF, unpack=n, expr=$val, format=, map=
2018.10.15 23:31:59.151 5: PWP: ParseObj unpacked 0000000000008000000080008000fffe0002 with n to hex 30 (0)
2018.10.15 23:31:59.151 5: PWP: ParseObj evaluates expr for I_DC_Spannung_SF, val=0, expr $val
2018.10.15 23:31:59.152 5: PWP: ParseObj eval result is 0
2018.10.15 23:31:59.152 4: PWP: ParseObj for I_DC_Spannung_SF assigns 0
2018.10.15 23:31:59.152 5: PWP: ParseObj moves to next object, skip 1 to h100
2018.10.15 23:31:59.154 5: PWP: ParseObj ObjInfo for h100: reading=I_DC_Leistung_W, unpack=n, expr=, format=, map=
2018.10.15 23:31:59.155 5: PWP: ParseObj unpacked 000000008000000080008000fffe0002 with n to hex 30 (0)
2018.10.15 23:31:59.155 4: PWP: ParseObj for I_DC_Leistung_W assigns 0
2018.10.15 23:31:59.155 5: PWP: ParseObj moves to next object, skip 1 to h101
2018.10.15 23:31:59.157 5: PWP: ParseObj ObjInfo for h101: reading=I_DC_Leistung_SF, unpack=n, expr=, format=, map=
2018.10.15 23:31:59.157 5: PWP: ParseObj unpacked 00008000000080008000fffe0002 with n to hex 30 (0)
2018.10.15 23:31:59.158 4: PWP: ParseObj for I_DC_Leistung_SF assigns 0
2018.10.15 23:31:59.158 5: PWP: ParseObj moves to next object, skip 1 to h102
2018.10.15 23:31:59.158 5: PWP: ParseObj has no information about parsing h102
2018.10.15 23:31:59.159 5: PWP: ParseObj moves to next object, skip 1 to h103
2018.10.15 23:31:59.160 5: PWP: ParseObj ObjInfo for h103: reading=Temp_Kuehler_C, unpack=n, expr=$val / 100, format=%.f, map=
2018.10.15 23:31:59.161 5: PWP: ParseObj unpacked 000080008000fffe0002 with n to hex 30 (0)
2018.10.15 23:31:59.161 5: PWP: ParseObj evaluates expr for Temp_Kuehler_C, val=0, expr $val / 100
2018.10.15 23:31:59.161 5: PWP: ParseObj eval result is 0
2018.10.15 23:31:59.162 5: PWP: ParseObj for Temp_Kuehler_C does sprintf with format %.f value is 0
2018.10.15 23:31:59.162 5: PWP: ParseObj for Temp_Kuehler_C sprintf result is 0
2018.10.15 23:31:59.162 4: PWP: ParseObj for Temp_Kuehler_C assigns 0
2018.10.15 23:31:59.162 5: PWP: ParseObj moves to next object, skip 1 to h104
2018.10.15 23:31:59.163 5: PWP: ParseObj has no information about parsing h104
2018.10.15 23:31:59.163 5: PWP: ParseObj moves to next object, skip 1 to h105
2018.10.15 23:31:59.163 5: PWP: ParseObj has no information about parsing h105
2018.10.15 23:31:59.164 5: PWP: ParseObj moves to next object, skip 1 to h106
2018.10.15 23:31:59.164 5: PWP: ParseObj has no information about parsing h106
2018.10.15 23:31:59.164 5: PWP: ParseObj moves to next object, skip 1 to h107
2018.10.15 23:31:59.166 5: PWP: ParseObj ObjInfo for h107: reading=C_Status, unpack=n, expr=, format=, map=1:Aus, 2:Nachtmodus, 4:WR_An
2018.10.15 23:31:59.166 5: PWP: ParseObj unpacked 0002 with n to hex 32 (2)
2018.10.15 23:31:59.166 5: PWP: ParseObj for C_Status maps value to 2 with 1:Aus, 2:Nachtmodus, 4:WR_An
2018.10.15 23:31:59.167 4: PWP: ParseObj for C_Status assigns Nachtmodus
2018.10.15 23:31:59.326 5: PWP: ParseFrames got 28 readings from ParseObj
2018.10.15 23:32:08.278 5: CUL/RAW: /V 1.20.04 a-culfw Build: 180 (2016-01-28_21-57-20) CUBe (F-Band: 868MHz)

2018.10.15 23:32:08.278 4: CUL_Parse: CUL_NET V 1.20.04 a-culfw Build: 180 (2016-01-28_21-57-20) CUBe (F-Band: 868MHz)
2018.10.15 23:32:17.482 2: LuftdatenInfo2 (NPLuft) - error while request: 192.168.2.118: Keine Route zum Zielrechner
2018.10.15 23:32:38.455 5: CUL/RAW: /V 1.20.04 a-culfw Build: 180 (2016-01-28_21-57-20) CUBe (F-Band: 868MHz)

2018.10.15 23:32:38.456 4: CUL_Parse: CUL_NET V 1.20.04 a-culfw Build: 180 (2016-01-28_21-57-20) CUBe (F-Band: 868MHz)
2018.10.15 23:32:40.225 5: PWP: raw read: 03034853756e5300010041536f6c61724564676520000000000000000000000000000000000000000000005345354b00000000000000000000000000000000000000000000000000000000c5f8
2018.10.15 23:32:40.225 5: PWP: ParseFrames returned error: got data but did not send a request - ignoring
2018.10.15 23:32:40.388 5: PWP: raw read: 030356303030322e313035330000000000000037453138323045410000000000000000000000000000000000000000000000000003006700320000000000000000fffe00000000000000eb00ed00ed000000000000138bfffed146
2018.10.15 23:32:40.389 5: PWP: ParseFrames returned error: got data but did not send a request - ignoring
2018.10.15 23:32:40.572 5: PWP: raw read: 03031e011204080000ffff800000000000000000008000000080008000fffe00024286
2018.10.15 23:32:40.572 5: PWP: ParseFrames returned error: got data but did not send a request - ignoring
2018.10.15 23:32:47.482 2: LuftdatenInfo2 (NPLuft) - error while request: 192.168.2.118: Keine Route zum Zielrechner


2. hier der Log vom Modul 98_SolarEdge.pm:

2018.10.15 23:29:40 4: SEdge: ProcessRequestQueue (V4.0.12 - 13.10.2018) sending, request: id 3, fCode 3, type h, adr 40093, len 15 for device SEdge reading I_AC_Energie_WH, read buffer empty
2018.10.15 23:29:40 5: SW: 03039c9d000fbb92
2018.10.15 23:29:40 5: SEdge: read buffer: 03031e011204080000ffff800000000000000000008000000080008000fffe00024286
2018.10.15 23:29:40 5: SEdge: ParseFrameStart (RTU) extracted id 3, fCode 3 and data 1e011204080000ffff800000000000000000008000000080008000fffe0002
2018.10.15 23:29:40 5: SEdge: HandleResponse called from Read
2018.10.15 23:29:40 5: SEdge: ParseResponse called from HandleResponse
2018.10.15 23:29:40 5: SEdge: CheckChecksum (called from HandleResponse): 4286 is valid
2018.10.15 23:29:40 5: SEdge: HandleResponse now passing to logical device SEdge for parsing data
2018.10.15 23:29:40 5: SEdge: ParseObj called with data 011204080000ffff800000000000000000008000000080008000fffe0002, type h, adr 40093, valuesLen 15, op read
2018.10.15 23:29:40 5: SEdge: RevRegs is reversing order of up to 2 registers
2018.10.15 23:29:40 5: SEdge: RevRegs string before is 011204080000ffff800000000000000000008000000080008000fffe0002
2018.10.15 23:29:40 5: SEdge: RevRegs string after  is 040801120000ffff800000000000000000008000000080008000fffe0002
2018.10.15 23:29:40 5: SEdge: ParseObj ObjInfo for h40093: reading=I_AC_Energie_WH, unpack=I>, expr=$val, format=%f Wh, map=
2018.10.15 23:29:40 5: SEdge: ParseObj unpacked 040801120000ffff800000000000000000008000000080008000fffe0002 with I> to 67633426 hex 3637363333343236
2018.10.15 23:29:40 5: SEdge: CheckEval for ModbusLD_ParseObj evaluates expr for I_AC_Energie_WH, val=67633426, expr=$val
2018.10.15 23:29:40 5: SEdge: CheckEval for ModbusLD_ParseObj result is 67633426
2018.10.15 23:29:40 5: SEdge: ParseObj for I_AC_Energie_WH does sprintf with format %f Wh, value is 67633426
2018.10.15 23:29:40 5: SEdge: ParseObj for I_AC_Energie_WH sprintf result is 67633426.000000 Wh
2018.10.15 23:29:40 4: SEdge: ParseObj assigns value 67633426.000000 Wh to I_AC_Energie_WH
2018.10.15 23:29:40 5: SEdge: ParseObj moves to next object, skip 2 to h40095
2018.10.15 23:29:40 5: SEdge: ParseObj ObjInfo for h40095: reading=I_AC_Energie_WH_SF, unpack=s>, expr=$val, format=, map=
2018.10.15 23:29:40 5: SEdge: ParseObj unpacked 0000ffff800000000000000000008000000080008000fffe0002 with s> to 0 hex 30
2018.10.15 23:29:40 5: SEdge: CheckEval for ModbusLD_ParseObj evaluates expr for I_AC_Energie_WH_SF, val=0, expr=$val
2018.10.15 23:29:40 5: SEdge: CheckEval for ModbusLD_ParseObj result is 0
2018.10.15 23:29:40 4: SEdge: ParseObj assigns value 0 to I_AC_Energie_WH_SF
2018.10.15 23:29:40 5: SEdge: ParseObj moves to next object, skip 1 to h40096
2018.10.15 23:29:40 5: SEdge: ParseObj ObjInfo for h40096: reading=I_DC_Current, unpack=s>, expr=$val, format=%.2f A, map=
2018.10.15 23:29:40 5: SEdge: ParseObj unpacked ffff800000000000000000008000000080008000fffe0002 with s> to -1 hex 2d31
2018.10.15 23:29:40 5: SEdge: CheckEval for ModbusLD_ParseObj evaluates expr for I_DC_Current, val=-1, expr=$val
2018.10.15 23:29:40 5: SEdge: CheckEval for ModbusLD_ParseObj result is -1
2018.10.15 23:29:40 5: SEdge: ParseObj for I_DC_Current does sprintf with format %.2f A, value is -1
2018.10.15 23:29:40 5: SEdge: ParseObj for I_DC_Current sprintf result is -1.00 A
2018.10.15 23:29:40 4: SEdge: ParseObj assigns value -1.00 A to I_DC_Current
2018.10.15 23:29:40 5: SEdge: ParseObj moves to next object, skip 1 to h40097
2018.10.15 23:29:40 5: SEdge: ParseObj ObjInfo for h40097: reading=I_DC_Current_SF, unpack=s>, expr=$val, format=, map=
2018.10.15 23:29:40 5: SEdge: ParseObj unpacked 800000000000000000008000000080008000fffe0002 with s> to -32768 hex 2d3332373638
2018.10.15 23:29:40 5: SEdge: CheckEval for ModbusLD_ParseObj evaluates expr for I_DC_Current_SF, val=-32768, expr=$val
2018.10.15 23:29:40 5: SEdge: CheckEval for ModbusLD_ParseObj result is -32768
2018.10.15 23:29:40 4: SEdge: ParseObj assigns value -32768 to I_DC_Current_SF
2018.10.15 23:29:40 5: SEdge: ParseObj moves to next object, skip 1 to h40098
2018.10.15 23:29:40 5: SEdge: ParseObj ObjInfo for h40098: reading=I_DC_Voltage, unpack=s>, expr=$val, format=%.2f V, map=
2018.10.15 23:29:40 5: SEdge: ParseObj unpacked 00000000000000008000000080008000fffe0002 with s> to 0 hex 30
2018.10.15 23:29:40 5: SEdge: CheckEval for ModbusLD_ParseObj evaluates expr for I_DC_Voltage, val=0, expr=$val
2018.10.15 23:29:40 5: SEdge: CheckEval for ModbusLD_ParseObj result is 0
2018.10.15 23:29:40 5: SEdge: ParseObj for I_DC_Voltage does sprintf with format %.2f V, value is 0
2018.10.15 23:29:40 5: SEdge: ParseObj for I_DC_Voltage sprintf result is 0.00 V
2018.10.15 23:29:40 4: SEdge: ParseObj assigns value 0.00 V to I_DC_Voltage
2018.10.15 23:29:40 5: SEdge: ParseObj moves to next object, skip 1 to h40099
2018.10.15 23:29:40 5: SEdge: ParseObj ObjInfo for h40099: reading=I_DC_Voltage_SF, unpack=s>, expr=$val, format=, map=
2018.10.15 23:29:40 5: SEdge: ParseObj unpacked 0000000000008000000080008000fffe0002 with s> to 0 hex 30
2018.10.15 23:29:40 5: SEdge: CheckEval for ModbusLD_ParseObj evaluates expr for I_DC_Voltage_SF, val=0, expr=$val
2018.10.15 23:29:40 5: SEdge: CheckEval for ModbusLD_ParseObj result is 0
2018.10.15 23:29:40 4: SEdge: ParseObj assigns value 0 to I_DC_Voltage_SF
2018.10.15 23:29:40 5: SEdge: ParseObj moves to next object, skip 1 to h40100
2018.10.15 23:29:40 5: SEdge: ParseObj ObjInfo for h40100: reading=I_DC_Power, unpack=s>, expr=$val, format=%.2f V, map=
2018.10.15 23:29:40 5: SEdge: ParseObj unpacked 000000008000000080008000fffe0002 with s> to 0 hex 30
2018.10.15 23:29:40 5: SEdge: CheckEval for ModbusLD_ParseObj evaluates expr for I_DC_Power, val=0, expr=$val
2018.10.15 23:29:40 5: SEdge: CheckEval for ModbusLD_ParseObj result is 0
2018.10.15 23:29:40 5: SEdge: ParseObj for I_DC_Power does sprintf with format %.2f V, value is 0
2018.10.15 23:29:40 5: SEdge: ParseObj for I_DC_Power sprintf result is 0.00 V
2018.10.15 23:29:40 4: SEdge: ParseObj assigns value 0.00 V to I_DC_Power
2018.10.15 23:29:40 5: SEdge: ParseObj moves to next object, skip 1 to h40101
2018.10.15 23:29:40 5: SEdge: ParseObj ObjInfo for h40101: reading=I_DC_Power_SF, unpack=s>, expr=$val, format=, map=
2018.10.15 23:29:40 5: SEdge: ParseObj unpacked 00008000000080008000fffe0002 with s> to 0 hex 30
2018.10.15 23:29:40 5: SEdge: CheckEval for ModbusLD_ParseObj evaluates expr for I_DC_Power_SF, val=0, expr=$val
2018.10.15 23:29:40 5: SEdge: CheckEval for ModbusLD_ParseObj result is 0
2018.10.15 23:29:40 4: SEdge: ParseObj assigns value 0 to I_DC_Power_SF
2018.10.15 23:29:40 5: SEdge: ParseObj moves to next object, skip 1 to h40102
2018.10.15 23:29:40 5: SEdge: ParseObj has no information about parsing h40102
2018.10.15 23:29:40 5: SEdge: ParseObj moves to next object, skip 1 to h40103
2018.10.15 23:29:40 5: SEdge: ParseObj ObjInfo for h40103: reading=I_Temp_Kuehler, unpack=s>, expr=$val/100, format=%.f, map=
2018.10.15 23:29:40 5: SEdge: ParseObj unpacked 000080008000fffe0002 with s> to 0 hex 30
2018.10.15 23:29:40 5: SEdge: CheckEval for ModbusLD_ParseObj evaluates expr for I_Temp_Kuehler, val=0, expr=$val/100
2018.10.15 23:29:40 5: SEdge: CheckEval for ModbusLD_ParseObj result is 0
2018.10.15 23:29:40 5: SEdge: ParseObj for I_Temp_Kuehler does sprintf with format %.f, value is 0
2018.10.15 23:29:40 5: SEdge: ParseObj for I_Temp_Kuehler sprintf result is 0
2018.10.15 23:29:40 4: SEdge: ParseObj assigns value 0 to I_Temp_Kuehler
2018.10.15 23:29:40 5: SEdge: ParseObj moves to next object, skip 1 to h40104
2018.10.15 23:29:40 5: SEdge: ParseObj has no information about parsing h40104
2018.10.15 23:29:40 5: SEdge: ParseObj moves to next object, skip 1 to h40105
2018.10.15 23:29:40 5: SEdge: ParseObj has no information about parsing h40105
2018.10.15 23:29:40 5: SEdge: ParseObj moves to next object, skip 1 to h40106
2018.10.15 23:29:40 5: SEdge: ParseObj has no information about parsing h40106
2018.10.15 23:29:40 5: SEdge: ParseObj moves to next object, skip 1 to h40107
2018.10.15 23:29:40 5: SEdge: ParseObj ObjInfo for h40107: reading=I_Status, unpack=s>, expr=$val, format=, map=1:Aus, 2:Nachtmodus, 4:WR_An
2018.10.15 23:29:40 5: SEdge: ParseObj unpacked 0002 with s> to 2 hex 32
2018.10.15 23:29:40 5: SEdge: CheckEval for ModbusLD_ParseObj evaluates expr for I_Status, val=2, expr=$val
2018.10.15 23:29:40 5: SEdge: CheckEval for ModbusLD_ParseObj result is 2
2018.10.15 23:29:40 5: SEdge: MapConvert called from ModbusLD_ParseObj converted 2 to Nachtmodus with map 1:Aus, 2:Nachtmodus, 4:WR_An
2018.10.15 23:29:40 5: SEdge: ParseObj for I_Status maps value 2 to Nachtmodus with 1:Aus, 2:Nachtmodus, 4:WR_An
2018.10.15 23:29:40 4: SEdge: ParseObj assigns value Nachtmodus to I_Status
2018.10.15 23:29:40 5: SEdge: HandleResponse got 10 readings from ParseObj for SEdge
2018.10.15 23:29:40 4: SEdge: ResponseDone, request: id 3, fCode 3, type h, adr 40093, len 15 for device SEdge reading I_AC_Energie_WH, Current read buffer: 03031e011204080000ffff800000000000000000008000000080008000fffe00024286, Id 3, fCode 3, response: id 3, fCode 3, type h, adr 40093, len 15, value 011204080000ffff800000000000000000008000000080008000fffe0002
2018.10.15 23:29:40 5: SEdge: DropFrame - drop 03031e011204080000ffff800000000000000000008000000080008000fffe00024286
2018.10.15 23:29:59 5: SEdge: read buffer: 0303500003006700320000000000000000fffe00000000000000ec00ec00ed000000000000138cfffe000000000000000000000000011204080000ffff800000000000000000008000000080008000fffe00020169
2018.10.15 23:29:59 5: SEdge: ParseFrameStart (RTU) extracted id 3, fCode 3 and data 500003006700320000000000000000fffe00000000000000ec00ec00ed000000000000138cfffe000000000000000000000000011204080000ffff800000000000000000008000000080008000fffe0002
2018.10.15 23:29:59 3: SEdge: read got new data while idle, drop buffer 0303500003006700320000000000000000fffe00000000000000ec00ec00ed000000000000138cfffe000000000000000000000000011204080000ffff800000000000000000008000000080008000fffe00020169


Vieleicht findet ihr ja den Fehler.

pejonp
LaCrossGW 868MHz:WT470+TFA+TX37-IT+EMT7110+W136+WH25A HP1003+WH2621
SignalD(CC1101):Bresser+WS-0101(868MHz WH1080)+Velux KLF200+MAX!+HM-MOD-UART:Smoke HM-SEC-SD+VITOSOLIC 200 RESOL VBUS-LAN+SolarEdge SE5K(Modbus)+Sonnen!eco8(10kWh)+TD3511+DRT710M(Modbus)+ZigBee+Z-Wave+MQTT+vitoconnect

StefanStrobel

Hallo pejonp,

du verwendest z.B. unterschiedliche Unpack-Codes. l> vs. I>.
Sieht ähnlich aus, ist aber ein anderer Buchstabe...
Wenn Du bei ModbusAttr einfach set saveAsModule verwendest, kann so was nicht passieren ;-)

Gruß
    Stefan

StefanStrobel

Hallo Benni,

noch ein Hinweis:
bei den Registern 40071 bis 40075 hast Du ja 5 Register, die gemeinsam gelesen werden müssen und 4 Readings, die daraus erzeugt werden müssen.

Aus Eurem Wiki-Eintrag:

attr <DEVICE-NAME> obj-h40071-expr $val * (10 ** ReadingsNum ('<DEVICE-NAME>' ,'I_AC_Current_SF',0))
attr <DEVICE-NAME> obj-h40071-reading I_AC_Current
attr <DEVICE-NAME> obj-h40072-expr $val * (10 ** ReadingsNum ('<DEVICE-NAME>' ,'I_AC_Current_SF',0))
attr <DEVICE-NAME> obj-h40072-reading I_AC_CurrentA
attr <DEVICE-NAME> obj-h40073-expr $val * (10 ** ReadingsNum ('<DEVICE-NAME>' ,'I_AC_Current_SF',0))
attr <DEVICE-NAME> obj-h40073-reading I_AC_CurrentB
attr <DEVICE-NAME> obj-h40074-expr $val * (10 ** ReadingsNum ('<DEVICE-NAME>' ,'I_AC_Current_SF',0))
attr <DEVICE-NAME> obj-h40074-reading I_AC_CurrentC
attr <DEVICE-NAME> obj-h40075-reading I_AC_Current_SF
attr <DEVICE-NAME> obj-h40075-unpack s>


um das mit einem Request zu machen würde ich folgendes definieren:


attr <DEVICE-NAME> obj-h40071-reading CurrentBlock
attr <DEVICE-NAME> obj-h40071-len 5
attr <DEVICE-NAME> obj-h40071-unpack nnnns>
attr <DEVICE-NAME> obj-h40071-expr readingsBulkUpdate($hash, 'Current', $val[0] * 10 ** $val[4]); readingsBulkUpdate($hash, 'CurrentA', $val[1] * 10 ** $val[4]); readingsBulkUpdate($hash, 'CurrentB', $val[2] * 10 ** $val[4]); readingsBulkUpdate($hash, 'CurrentC', $val[3] * 10 ** $val[4]); "$val[0] $val[1] $val[2] $val[3] $val[4]"


ich kann leider nicht selbst testen, da ich keine SolarEdge-Anlage habe, aber das Feintuning bekommt Ihr bestimmt hin ;-)

Die Grundidee ist dass man ein Block-Reading definiert, das die 5 Register in einem gemeinsamen Request abfragt, über den Unpack-Code in 5 Werte zerlegt und dann in der expr die Readings berechnet / setzt.

Gruss
   Stefan

Benni

Hallo Stefan,

danke für deine Bemühungen und deine Unterstützung! Top!
Werde heute Abend mal updaten und dann umstellen.

Melde mich dann wieder...

gb#

kingmathers

Hallo Stefan,

Vielen Dank für dein Update. Werde es vermutlich heute Abend testen können.

Ist die neue Version schon regulär über die fhem Update Funktion verfügbar oder muss ich manuell die verlinkte Datei draufspielen?

Sent from my Pure 2 using Tapatalk

Raspberry Pi B+, FS20, 1-Wire, HM
FHEM Home Control (App für Windows 10): https://forum.fhem.de/index.php/topic,49891.0.html
FHEM Arduino Library: https://forum.fhem.de/index.php/topic,94093.0.html

StefanStrobel

Ist noch nicht eingecheckt.
Bisher muss man sie manuell einspielen.

Gruss
   Stefan

kingmathers

Zitat von: StefanStrobel am 13 Oktober 2018, 21:13:10
Hallo,

um Euch das mit dem Scale/Wert zu erleichtern, habe ich in der neuen Version des Modbus-Moduls eine Kleinigkeit geändert:
in den expr-Attributen steht künftig der Wert nach dem unpack nicht nur als $val sondern auch als @val zu Verfügung.
In diesem Array stehen mehrere Werte, wenn der unpack mehrere Werte erzeugt.

Beispiel:

attr MBETest obj-h801-reading test1
attr MBETest obj-h801-len 2
attr MBETest obj-h801-unpack s>s>
attr MBETest obj-h801-expr "$val[0] $val[1]"


Durch len 2 werden zwei Register gleichzeitig (im Beispiel 801 und 802) gelesen.
Der unpack-Code s>s> erzeugt zwei Werte im Array @val. 801 steht dann in $val[0] und 802 in $val[1].
In der Expr werden die Werte dann zusammengebaut (hier nur mit einem Space verkettet, in Eurem Fall vermutlich irgendwie mit Zehnerpotenzen multimpliziert).

Die neue Version ist in diesem Thread:
https://forum.fhem.de/index.php/topic,75638.135.html

Gruss
  Stefan

Hallo Stefan,

in deinem Beispiel liest du mit den 4 Zeilen ja 801 und 802 aus. Wird dann bei den weiteren attributen 802 einfach übersprungen und ich mache mit 803 weiter oder muss/kann ich auch noch reading, unpack, expr etc. in weiteren attributen für 802 angeben?

Gruß,
Philipp
Raspberry Pi B+, FS20, 1-Wire, HM
FHEM Home Control (App für Windows 10): https://forum.fhem.de/index.php/topic,49891.0.html
FHEM Arduino Library: https://forum.fhem.de/index.php/topic,94093.0.html