Modbus > Register bei E3DC S10 Energy Storage - Readings scrambled?

Begonnen von juanmax, 26 Juli 2017, 21:10:36

Vorheriges Thema - Nächstes Thema

juanmax

Hallo Community, erstmal entschuldige ich mich für mein Deutsch, aber ich vermute ihr wollt lieber in gebrochenes Deutsch als auf Englisch.

Hier mein Problem, ich hoffe ein Modbus Guru kann mich hier helfen.

Für ein Freund (bei mir läuft ein Fronius Umrichter über FHEM - Modbus perfekt) versuche ich seit ein Paar Woche die Kommunikation mit sein "Hauskraftwerk" über FHEM Modbus herzustellen. Ich habe die FroniusModbus modul angepasst und die kommunikation mit dem E3DC (so heißt die Kombo von Umrichter, Akku und alles...) funktioniert halbswegs. Manche readings sind OK, manche bleiben Konstant und noch dazu falsch. Ich habe in FHEM Forum nichts über die E3DC gefunden, und google hat mir auf loxone forum fündig gemacht. Da haben mir schon bestätigt dass die Register die ich nehme, eigentlich die richtige sind. In Loxone funtkioniert es wie erwartet (allerdings mit irgendwelche Umrechnungen)

Meine Vermutung ist das der Fehler in die Formatierung liegt, aber das kann eigentlich nicht erklären warum man bei manche (fast alle) Readings konstante Werte bekommt.

Kann eine von euch kurz drüber schauen? Vielen Dank!

Mein Fhem Readings
(OK/KO) / Register / Description / Value:

KO 40082 BattSOC   1536
KO 40070 Batt_Power_Watt constant   369107203
OK 40020 Device_model   S10 E AIO
OK 40052 Inverter SN   S10-4616430007XX
KO 40072 HomeLoad_Watt constant   5907440
KO 40001 MagicByte   21358
OK 40004 Manufacturer   E3/DC GmbH
KO 40068 PV_Power_Watt constant   256
OK 40036 SW_Version   OPTIONS10_2017_02

Beispiel Code für SOC in der 09_E3DC_Modbus_S10.pm (kann/soll ich die Datei anhängen?)

"h40082" => { # uint16; SOC
name => "BattSOC",         # internal name of this register in the hardware doc
reading => "BattSOC",         # name of the reading for this value
len => 1, # number of Registers this value spans
unpack => "s<", # defines the translation between data in the module and in the communication frame
polldelay => "x2",         # only poll this Value if last read is older than 2*Iteration, otherwiese



Danke in voraus!

Juanma

juanmax


##############################################
##############################################
# $Id: 98_E3DC_Modbus_S10.pm
#
# fhem Modul für E3DC S10 Energy Storage:
# verwendet Modbus.pm als Basismodul für die eigentliche Implementation des Protokolls.
#
# Fhem is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# Fhem is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with fhem.  If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
# Changelog:
# 2017-06-24 initial draft - debugging


package main;

use strict;
use warnings;
use Time::HiRes qw( time );

sub E3DC_Modbus_S10_Initialize($);
sub MinMaxChk($$$;$$); # prüft, ob ein Wert außerhalb Min/Max ist

# deviceInfo defines properties of the device.
# some values can be overwritten in parseInfo, some defaults can even be overwritten by the user with attributes if a corresponding attribute is added to AttrList in _Initialize.
#
my %E3DC_deviceInfo = (
"timing" => {
timeout => 2, # 2 seconds timeout when waiting for a response
commDelay => 0.7, # 0.7 seconds minimal delay between two communications e.g. a read a the next write,
# can be overwritten with attribute commDelay if added to AttrList in _Initialize below
sendDelay => 0.7, # 0.7 seconds minimal delay between two sends, can be overwritten with the attribute
# sendDelay if added to AttrList in _Initialize function below
},
"h" => { # details for "holding registers" if the device offers them
read => 3, # use function code 3 to read registers
write => 6, # use function code 6 to write registers
defPoll => 1, # All defined Input Registers should be polled by default unless specified otherwise in parseInfo or by attributes
defShowGet => 1, # default für showget Key in parseInfo
},
);

# %parseInfo:
# r/c/i+adress => objHashRef (h = holding register, c = coil, i = input register, d = discrete input)
# the address is a decimal number without leading 0
#
# Explanation of the parseInfo hash sub-keys:
# name internal name of the value in the modbus documentation of the physical device
# reading name of the reading to be used in Fhem
# set can be set to 1 to allow writing this value with a Fhem set-command
# setmin min value for input validation in a set command
# setmax max value for input validation in a set command
# hint string for fhemweb to create a selection or slider
# expr perl expression to convert a string after it has bee read
# map a map string to convert an value from the device to a more readable output string
# or to convert a user input to the machine representation
# e.g. "0:mittig, 1:oberhalb, 2:unterhalb"
# setexpr per expression to convert an input string to the machine format before writing
# this is typically the reverse of the above expr
# format a format string for sprintf to format a value read
# len number of Registers this value spans
# poll defines if this value is included in the read that the module does every defined interval
# this can be changed by a user with an attribute
# unpack defines the translation between data in the module and in the communication frame
# see the documentation of the perl pack function for details.
# example: "n" for an unsigned 16 bit value or "f>" for a float that is stored in two registers, "s" int16
# "l" int32, "L" uint32
# http://perldoc.perl.org/functions/pack.html#unpack-TEMPLATE%2cEXPR
# showget can be set to 1 to allow a Fhem get command to read this value from the device
# polldelay if a value should not be read in each iteration after interval has passed,
# this value can be set to a multiple of interval

#E3DC S10 Register info from Official E3DC S10 Doc. https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUKEwjigrqEodfUAhVEVhQKHUaXDh8QFggsMAE&url=http%3A%2F%2Fwww.loxwiki.eu%2Fdownload%2Fattachments%2F9339566%2FModuBus-Dokumentation_2016-08-05.pdf%3Fversion%3D1%26modificationDate%3D1471507657000%26api%3Dv2&usg=AFQjCNFq3mH3ZWkpJI9VCyvK2W_NDRH2eA

my %E3DC_parseInfo = (

"h40001" => { # Uint16; Manufacturer
name => "Mg", # internal name of this register in the hardware doc
reading => "MagicByte", # name of the reading for this value
len => 1, # number of Registers this value spans
unpack => "s<", # defines the translation between data in the module and in the communication frame
poll => "once", # only poll once after define (or after a set)
},

"h40004" => { # String32; Manufacturer
name => "Mn", # internal name of this register in the hardware doc
reading => "Manufacturer", # name of the reading for this value
len => 16, # number of Registers this value spans
unpack => "A*", # defines the translation between data in the module and in the communication frame
poll => "once", # only poll once after define (or after a set)
},

"h40020" => { # String32; Device model
name => "Md", # internal name of this register in the hardware doc
reading => "Device_model", # name of the reading for this value
len => 16, # number of Registers this value spans
unpack => "A*", # defines the translation between data in the module and in the communication frame
poll => "once", # only poll once after define (or after a set)
},

"h40036" => { # String16; SW version of datamanager
name => "SN", # internal name of this register in the hardware doc
reading => "SerialNumber",                              # name of the reading for this value
len => 16, # number of Registers this value spans
unpack => "a*", # defines the translation between data in the module and in the communication frame
poll => "once", # only poll once after define (or after a set)
},

"h40052" => { # String32; Serialnumber of the inverter
name => "Firm", # internal name of this register in the hardware doc
reading => "Firmware_Rel", # name of the reading for this value
len => 16, # number of Registers this value spans
unpack => "A*", # defines the translation between data in the module and in the communication frame
poll => "once", # only poll once after define (or after a set)
},

"h40068" => { # int32; Photovoltaik Power
name => "PV", # internal name of this register in the hardware doc
reading => "PV_Power_Watt", # name of the reading for this value
len => 2, # number of Registers this value spans
unpack => "l", # defines the translation between data in the module and in the communication frame
polldelay => "x2", # only poll this Value if last read is older than 2*Iteration, otherwiese

},
"h40070" => { # int32; Batterie Leistung in Watt
name => "Batt", # internal name of this register in the hardware doc
reading => "Batt_Power_Watt", # name of the reading for this value
len => 2, # number of Registers this value spans
unpack => "l", # defines the translation between data in the module and in the communication frame
polldelay => "x2", # only poll this Value if last read is older than 2*Iteration, otherwiese

},
"h40072" => { # int32; Haus Verbrauch in Watt
name => "Home", # internal name of this register in the hardware doc
reading => "HomeLoad_Watt", # name of the reading for this value
len => 2, # number of Registers this value spans
unpack => "l", # defines the translation between data in the module and in the communication frame
polldelay => "x2", # only poll this Value if last read is older than 2*Iteration, otherwiese

},
"h40082" => { # uint16; SOC
name => "BattSOC", # internal name of this register in the hardware doc
reading => "BattSOC", # name of the reading for this value
len => 1, # number of Registers this value spans
unpack => "s<", # defines the translation between data in the module and in the communication frame
polldelay => "x2", # only poll this Value if last read is older than 2*Iteration, otherwiese

}

# Ende parseInfo
);

#####################################
sub E3DC_Modbus_S10_Initialize($) {
    my ($modHash) = @_;

require "$attr{global}{modpath}/FHEM/98_Modbus.pm";

$modHash->{parseInfo}  = \%E3DC_parseInfo; # defines registers, inputs, coils etc. for this Modbus Defive

$modHash->{deviceInfo} = \%E3DC_deviceInfo; # defines properties of the device like
# defaults and supported function codes

ModbusLD_Initialize($modHash); # Generic function of the Modbus module does the rest

$modHash->{AttrList} = $modHash->{AttrList} . " " . # Standard Attributes like IODEv etc
$modHash->{ObjAttrList} . " " . # Attributes to add or overwrite parseInfo definitions
$modHash->{DevAttrList} . " " . # Attributes to add or overwrite devInfo definitions
"poll-.* " . # overwrite poll with poll-ReadingName
"polldelay-.* "; # overwrite polldelay with polldelay-ReadingName
}

sub MinMaxChk($$$;$$) { # prüft, ob ein Wert außerhalb Min/Max ist
my $Zahl = $_[0]; # Übergabe des zu prüfenden Wertes
my $Min = $_[1]; # Übergabe Minimum
my $Max = $_[2]; # Übergabe Maximum
;
my $name = $_[3]; # optional: Übergabe Name vom Device
my $Reading = $_[4]; # optional: Übergabe Name Reading (für Auslesen letzten Wert)

if (defined $Reading) { # wenn Name Reading  übergeben wurde
if ($Zahl < $Min) { # Zahl ist kleiner als Minimum
$Zahl = ReadingsNum($name,$Reading,$Min); # Zahl auf letzten Wert setzen
}
if ($Zahl > $Max) { # Zahl ist größer als Maximum
$Zahl = ReadingsNum($name,$Reading,$Max); # Zahl auf letzten Wert setzen
}
} else { # wenn Name Reading  nicht übergeben wurde
if ($Zahl < $Min) { # Zahl ist kleiner als Minimum
$Zahl = $Min; # Zahl auf Minimum setzen
}
if ($Zahl > $Max) { # Zahl ist größer als Maximum
$Zahl = $Max; # Zahl auf Maximum setzen
}
}
return $Zahl;
}
1;


JimKnopf

#3
Hi Juanma!
Ich komme mit Deinem Deutsch zuper zurecht  ;).

Bei mir läuft auch ein S10 und ich nutze FHEM um die Register zu lesen.
Um die Batterieleistung zu lesen definiere ich das MODBUS_Register und setzte ein UserReading:
Leistung { if (Value("BatterieLeistung")<32768 ) {Value("BatterieLeistung")} else {Value("BatterieLeistung")-65536};; }

Genau so mache ich es mit allen anderen Registern.
Für Notstrom lautet das UserReading:
STATE {
if (ReadingsVal($name,"state",0)  == 0) {return "nicht_unterstüzt"}
elsif (ReadingsVal($name,"state",0)  == 1) {return "Notstrom_aktiv"}
elsif (ReadingsVal($name,"state",0)  == 2) {return "Notstrom_inaktiv"}
elsif (ReadingsVal($name,"state",0)  == 3) {return "Notstrom_nv"}
elsif (ReadingsVal($name,"state",0)  == 4) {return "Notstrom_keine_Grundstellung"}
else {return "unbekannt"}
}

Vielleicht konnte ich Dir helfen.
Gruß, Burkhard
PS: ich habe von Pearl null Ahnung
FHEM,LaCrosse,PCA301,Revolt,MAX!,HM,FS20, MQTT2, ebusd 3.4.v3.4-96-g96d5623, ebus Adapter 3.0 mit 20201219-offset , Wolf  CGB (-K)-20, Wolf ISM7, Wolf Solar SM, Speicher/WR E3DC S10, eGolf, Keba P30, Phoenix Contact EV, OpenWB

NMozer

Hallo Jim Knopf,

hast du mir einen Tipp wo ich an Infos zur Umsetzung der Modbus TCP Verbindung mit dem S10 komme?
Ich habe bisher mit dem FHEM noch keine solche Datenverbindungen aufgebaut.
Welches ist eine gute Lecktüre um in der Thematik einen durchblick zu bekommen?


Danke mal, habe mich wieder etwas weiter bewegt in der Welt von Perl und FHEM.
Konnte das Modul integrieren.
Angezeigt bekomme ich nun die gleichen falschen Werte wie zuvor bei den Einzelabrufen mit dem Modbus Modul attrModbus.
Wie genau Formatierst du denn die Werte deines E3DCs?

Gruß Nico

blofield

Hallo juanmax,


ich versuche das auch gerade zu lösen, bin aber noch nicht 100%ig erfolgreich.
Das Register 40072 kann ich aber OK auslesen, wenn ich bei unpack "N" verwende.
Die Register 40068, 40070 und 40074 bekomme ich auch nicht zum laufen :-/

@JimKnopf
Wie sehen denn Deine attr obj-h400* in Deinem device aus, bei Dir scheint es ja korrekt zu laufen, wenn ich Dich richtig verstanden habe.

Gruß
blofield

juanmax

Zitat von: blofield am 30 August 2017, 19:02:44
Hallo juanmax,


ich versuche das auch gerade zu lösen, bin aber noch nicht 100%ig erfolgreich.
Das Register 40072 kann ich aber OK auslesen, wenn ich bei unpack "N" verwende.

Gruß
blofield

Hi blofield, schön das jemand andere auch dieselbe Probleme hat. Ich bin momentan in Urlaub und kann ich es nicht ausprobiert, ich tue  (unpack N)aber wenn ich wieder da bin. Danke!

Gruß aus dem Bodensee

blofield

Hallo Juanmax,

ich habe es jetzt raus ;)
Ich habe es mit ModbusAttr umgesetzt und meinen S10 so definiert:


define S10 ModbusAttr 1 20 192.168.1.1:502 TCP
attr S10 userattr event-min-interval event-on-change-reading 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-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 userReadings
attr S10 event-min-interval .*:3600
attr S10 event-on-change-reading .*
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-h40082-len 1
attr S10 obj-h40082-poll 1
attr S10 obj-h40082-reading battsoc
attr S10 obj-h40082-unpack n
attr S10 room ServerRaum
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 };; }


Das interessante ist, dass alle Readings im Register jeweils -2 zur E3DC Dokumentation sind. Willst Du also das Register h40070 auslesen, dann musst Du h40068 angeben! Unpacking für Int32 ist dabei "N".
Beim Battsoc mit Uint16 ist das Register h40082 auszulesen und folgerichtig unpacking "n" zu verwenden.
Die userReadings verwende ich dann gem. dem Hinweis von Jim Knopf für Werte, die positive und negative Werte liefern können (Netzbezug-/einspeisung, Batterie(ent)ladung).

So stimmt jetzt bei mir alles mit dem Display am S10 überein.
Im Webportal werden die Werte noch irgendwie geglättet, daher erscheinen dort manchmal andere Werte, insbesondere bei schnellem Wechsel zw. Netzbezug-/einspeisung.

Damit solltest Du Dein Modul schnell einsetzen können. ;)

blofield

Mirko_2013

Hallo blofield,

Kannst Du mir sagen welche Einstellungen Du in der S10 noch vorgenommen hast?

Ich habe versucht analog deiner Variante die Verbindung zur S10 aufzubauen.
Allerdings habe ich ständige Verbindungsabrüche:
Im Eventlog habe ich folgende Meldung:
2017-09-04 22:12:30 ModbusAttr S10 DISCONNECTED
2017-09-04 22:12:30 ModbusAttr S10 CONNECTED
2017-09-04 22:12:30 ModbusAttr S10 DISCONNECTED
2017-09-04 22:12:30 ModbusAttr S10 CONNECTED

Im Logfile:
2017.09.04 22:15:27 3: x.x.x.x:502 reappeared (S10)
2017.09.04 22:15:27 3: x.x.x.x:502 disconnected, waiting to reappear (S10)
2017.09.04 22:15:27 4: HttpUtils url=http://x.x.x.x:502/
2017.09.04 22:15:27 3: x.x.x.x:502 reappeared (S10)
2017.09.04 22:15:27 3: x.x.x.x:502 disconnected, waiting to reappear (S10)

Danke
Mirko
HP Microserver Gen8; fhem-5.8; CUL868 - V1.66; CUL868 - V1.61; CUL433 - V1.61; CUNX - V2.67; eBus Koppler USB

blofield

Hallo Mirko,

Am S10 muss Modbus zunächst aktiviert werden. Über das Hauptmenü kannst Du in das Menü "Funktionen" ( ich glaube so heißt es, bin leider gerade nicht zu Hause ) und dort gibt es ein Menü "Modbus". Da habe ich alle Buttons angeschaltet ( sind dann grün hinterlegt ) und die Modbus ID festgelegt ( Default: 1 ), das ist im define die 1 direkt nach ModbusAttr.
Wenn man will kann man da auch den Port ändern.

Wenn Du das hast sollte es sofort gehen, denn eine Authentifizierung braucht es nicht.

Viel Erfolg
blofield

Gesendet von meinem ONEPLUS A5000 mit Tapatalk


Mirko_2013

Hallo blofield,

Ja das habe ich bereits aktiviert, auch versucht  mit den 2 verschiedenen Modbus Protokollen die Verbindung aufzubauen. Leider kein Erfolg.
Auch in den Logfile finde ich keine weiteren Meldungen.

Gruß Mirko
HP Microserver Gen8; fhem-5.8; CUL868 - V1.66; CUL868 - V1.61; CUL433 - V1.61; CUNX - V2.67; eBus Koppler USB

Mirko_2013

Hallo zusammen,

Ich habe jetzt soweit rausgefunden, das der ständige Verbindungsaufbau damit zusammen hängt, das die S10 und der Shem Server in verschiedenen Netzen steht.
Könnt Ihr mir hier einen Tip geben, ohne das ich alles die 2 Geräte in ein Netz stellen muss.

Danke
Mirko
HP Microserver Gen8; fhem-5.8; CUL868 - V1.66; CUL868 - V1.61; CUL433 - V1.61; CUNX - V2.67; eBus Koppler USB

blofield

Zitat von: Mirko_2013 am 05 September 2017, 22:25:39
Hallo zusammen,

Ich habe jetzt soweit rausgefunden, das der ständige Verbindungsaufbau damit zusammen hängt, das die S10 und der Shem Server in verschiedenen Netzen steht.
Könnt Ihr mir hier einen Tip geben, ohne das ich alles die 2 Geräte in ein Netz stellen muss.

Danke
Mirko
Hallo Mirko,

Das sollte aber kein Problem sein, sonst würde das Internet ja auch nicht funktionieren ;)
Da scheint bei Dir das Routing nicht einwandfrei zu klappen oder Du hast bei einer Firewall vergessen Regeln zu definieren. Es ist also offenbar ein Netzwerk Problem.
Ohne zu wissen, wir das bei Dir aufgebaut ist, kann man da pauschal aber keine Hilfestellung leisten. Mach doch mal einen anderen Thread auf und beschreibe dein Netz.

blofield

Gesendet von meinem ONEPLUS A5000 mit Tapatalk


Mirko_2013

Hallo zusammen,

Problem ist gelöst, der fhem server und die e3dc Anlage muss im selben Netz stehen.
Ist scheinbar ein sicherheitsfeature das sie nur auf Anfragen am Modus nur aus dem gleichen Netz antworten.

Gruß
Mirko
HP Microserver Gen8; fhem-5.8; CUL868 - V1.66; CUL868 - V1.61; CUL433 - V1.61; CUNX - V2.67; eBus Koppler USB

Baeda

Hallo Blofield,

ich bin zufällig auf den Beitrag gestossen, da ich bei den Readings auch keine (oder falsche) Werte bekam - allerdings habe ich den Wert in der E3DC Doku genommen, bzw. diesen um -1 angepasst - somit war Dein Tipp, den Wert der Doku um "-2" zu korregieren die Lösung. Vielen Dank dafür!

Ich kann nun schöne Graphen generieren, jedoch fällt mir dabei auf, dass ich hin und wieder beim "Hausverbrauch" (homewatt) negative Werte bekomme - was ja nicht sein kann.
Wie kommst Du auf die Zahl 4294900000? (es ist ja nicht ganz 2 hoch 32...)


...
homewatt { if (ReadingsVal("S10", "homewatt0", "") < 4294900000 ) {(ReadingsVal("S10", "homewatt0", ""))} else {((ReadingsVal("S10", "battwatt", "")) * -1 ) + (ReadingsVal("S10", "sunwatt", "")) + (ReadingsVal("S10", "gridwatt", ""))};; }


Es kommt selten vor, dass ich negative Werte erhalte und ich könnte mir vorstellen, dass hier ein Peak im Stromverlauf stattfindet, der zu einem kurzfristigen Zahlenüberlauf führt.

Vielen Dank vorab,
VG,
Baeda

blofield

Hallo Baeda,

schön das der Beitrag Dir weiterhelfen konnte.

Zu den negativen Werten: Ich frage bei mir jetzt etwas häufiger ab und habe festgestellt, dass ich hin und wieder negative oder aber auch hohe positive Werte auslese, welche den Graph zerlegen. Ich vermute, dass diese Werte bei Umkehr oder größeren Schwankungen entstehen oder aber durch die Latenz der Auslesung der einzelnen Werte in Kombination mit der Berechnung der Userreadings "entstehen". Das ist noch nicht 100%ig und daran arbeite ich noch ;)
Bei mir läuft FHEM auf einem Raspi3 und ich nutze DBLog, die recht groß ist. Das auslesen der S10 Parameter dauert daher schon etwas über eine Sekunde, da kann sich dann schon wieder viel geändert haben ...

Und bei der 4294900000 habe ich mir tatsächlich experimentell angenähert und dann willkürlich etwas festgelegt, denn mit dem richtigen uint32 Wert wollte es nicht funktionieren. Auch hier kann ich leider nicht sagen, warum das so ist, dazu finde ich auch die Doku über Modbus TCP und vor allem die Implementierung im S10 etwas sehr spärlich.
Funktioniert es denn bei Dir wenn Du richtigerweise 4294967295 setzt?

Grüße
blofield

Baeda

Hallo blofield,

ich habe den Wert jetzt einfach mal auf 4294967295 angepasst, was auch funktioniert, da ja nur in den seltenen Fällen (vermutlich) bei Erreichen des Schwellwertes die Option zum Tragen kommt, den Wert aus den anderen Werten zu errechnen.

Ich habe auch einen Raspi3, das log liegt (zum Teil noch) lokal.
Seit knapp 2 Monaten habe ich nun die E3DC angebunden und schon nach kurzer Zeit gemerkt, dass man mit dem lokalen Log nicht weit kommt. Daher habe ich diese Werte dann gleich in den DB Server umgeleitet.

Im Großen und Ganzen eine schöne Lösung, nur eine Sache wurmt mich persönlich noch:
Ich habe beim Kauf der Anlage die KfW Finanzierung in Anspruch genommen (es rechnet sich halt...), ergo wird bei 50% Einspeisung abgeregelt.
Man sieht das auch schön an den Graphen: Der Akku ist voll, und die Netzeinspeisung ist immer bei etwa 5kW.

Interessieren würde mich, wieviel Energie ich ab dem Zeitpunkt über die Zeit verschenke.
Es gibt ja (vermutlich) keine Möglichkeit, einen Wert zu ermitteln, etwa "mögliche Leistung - "aktuelle Leistung" = "verschenkte Leistung"?

Viele Grüße,
Baeda


blofield

Hallo Baeda,

schön das es klappt.
Poste doch mal einen Graphen, denn eigentlich müsste ja bei dem von Dir beschriebenen Fall "sunwatt" trotzdem mehr als 5kw anzeigen und dann könnte man sicher mit einer Funktion in myUtils arbeiten, wenn battsoc == 100 ist.
So könntest Du Dir den ungenutzten Überschuss errechnen und loggen.

Bei mir wird ab 70% abgeregelt, das kommt bisher bei mir aber nicht zum tragen, weil ich genug Grundlast habe. Was ich ungünstig finde ist, das zu keiner Zeit mehr in/aus den/dem Speicher geht/kommt als 3kw. Das schont die Batterien, aber das hat man vorher nicht erfahren und somit habe ich das unter anderen Annahmen berechnet. Für meine Grundlast sind dann selbst die großen Batterien zu klein, man sieht auf dem Graphen, das sie nur bis 1h nachts halten. Da ich tagsüber aber noch viel einspeise mache ich mir gerade Gedanken, wie ich mit FHEM die Netzeinspeisung reduziere und mehr (sinnvoll) selbst verbrauche. Ein elektrischer Heizstab für die Warmwasserbereitung, eine Brauch-Trinkwasser-Wärmepumpe oder ein selbstgebastelter Pumpspeicher sind da die ersten Ideen. :)

blofield

Baeda

Hallo blofield,

ich muss mich leider korrigieren.... :-\
Habe heute festgestellt, dass heute die Graphen nicht mehr passen, Ursache weiß ich noch nicht, die Werte haben zumindest realistisch ausgesehen...
(siehe Bild: Heute fehlen die Graphen zu Hausverbrauch und PV Leistung, waren gestern noch da / 2. Bild)

Ich habe das kurzfristig wieder auf den alten Wert geändert und verfolge einen anderen Ansatz:

In der Datenbank habe ich mal eine Abfrage auf Zeilen mit negativen "Homewatt" Werten gemacht.
Zu einem Eintrag habe ich dann jeweils die Werte zu dem Timestamp abgefragt - quasi "was für Werte liefern die anderen Readings zum Zeitpunkt, wo der Hausverbrauch negativ ist".

U.a. folgende Ergebnisse:

TIMESTAMP           | DEVICE | TYPE       | EVENT            | READING   | VALUE | UNIT |
+---------------------+--------+------------+------------------+-----------+-------+------+
| 2017-09-30 20:12:12 | E3DC   | MODBUSATTR | Gridwatt0: 63840 | Gridwatt0 | 63840 |      |
| 2017-09-30 20:12:12 | E3DC   | MODBUSATTR | Gridwatt: -1696  | Gridwatt  | -1696 |      |
| 2017-09-30 20:12:12 | E3DC   | MODBUSATTR | Homewatt: -1131  | Homewatt  | -1131 |      |
| 2017-09-30 20:12:12 | E3DC   | MODBUSATTR | Battwatt0: 63224 | Battwatt0 | 63224 |      |
| 2017-09-30 20:12:12 | E3DC   | MODBUSATTR | Battwatt: -2312  | Battwatt  | -2312 |      |
| 2017-09-30 20:12:12 | E3DC   | MODBUSATTR | Homewatt: 616    | Homewatt  | 616   |      |

oder:
TIMESTAMP           | DEVICE | TYPE       | EVENT                 | READING   | VALUE      | UNIT |
+---------------------+--------+------------+-----------------------+-----------+------------+------+
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Sunwatt: 325          | Sunwatt   | 325        |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Homewatt0: 4294902248 | Homewatt0 | 4294902248 |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Homewatt: 302         | Homewatt  | 302        |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Gridwatt0: 65016      | Gridwatt0 | 65016      |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Gridwatt: -520        | Gridwatt  | -520       |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Homewatt: -195        | Homewatt  | -195       |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Battwatt0: 64813      | Battwatt0 | 64813      |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Battwatt: -723        | Battwatt  | -723       |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Homewatt: 528         | Homewatt  | 528        |      |

oder:
TIMESTAMP           | DEVICE | TYPE       | EVENT                 | READING   | VALUE      | UNIT |
+---------------------+--------+------------+-----------------------+-----------+------------+------+
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Sunwatt: 325          | Sunwatt   | 325        |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Homewatt0: 4294902248 | Homewatt0 | 4294902248 |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Homewatt: 302         | Homewatt  | 302        |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Gridwatt0: 65016      | Gridwatt0 | 65016      |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Gridwatt: -520        | Gridwatt  | -520       |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Homewatt: -195        | Homewatt  | -195       |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Battwatt0: 64813      | Battwatt0 | 64813      |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Battwatt: -723        | Battwatt  | -723       |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Homewatt: 528         | Homewatt  | 528        |      |

Hier mal ein "positiver Hausverbrauch" :
TIMESTAMP           | DEVICE | TYPE       | EVENT                 | READING   | VALUE      | UNIT |
+---------------------+--------+------------+-----------------------+-----------+------------+------+
| 2017-09-15 20:33:07 | E3DC   | MODBUSATTR | Homewatt0: 4294904224 | Homewatt0 | 4294904224 |      |
| 2017-09-15 20:33:07 | E3DC   | MODBUSATTR | Gridwatt0: 1          | Gridwatt0 | 1          |      |
| 2017-09-15 20:33:07 | E3DC   | MODBUSATTR | Gridwatt: 1           | Gridwatt  | 1          |      |
| 2017-09-15 20:33:07 | E3DC   | MODBUSATTR | Homewatt: 2600        | Homewatt  | 2600       |      |
| 2017-09-15 20:33:07 | E3DC   | MODBUSATTR | Battwatt0: 62943      | Battwatt0 | 62943      |      |
| 2017-09-15 20:33:07 | E3DC   | MODBUSATTR | Battwatt: -2593       | Battwatt  | -2593      |      |
| 2017-09-15 20:33:07 | E3DC   | MODBUSATTR | Homewatt: 2594        | Homewatt  | 2594       |      |

Was ich nicht verstehe: Alle Daten werden in schöner Regelmäßigkeit alle 30 Sekunden in die DB geschrieben -  warum werden für Homewatt 2 Einträge angelegt?

Bezgl. Der E3DC:
Ich habe knapp 10kWp auf dem Dach (allerdings nicht optimal ausgerichtet...) und gut 9kW Batterien. Ich bin auch schon zu dem SChluß gekommen, dass es mehr Batteriekapazität sein könnte.
Aber das wird sich vermutlich nicht rechnen.
Allerdings komme ich aktuell gut über die Nacht, wenn der Akku Abends noch etwa 40%-50% voll ist. (Nachdem! Kochen o.ä. abgeschlossen ist  ;) )

Beim E3DC Support bin ich vermutlich most unwanted person, da ich verstehen wollte, warum das Teil so lädt.
So wurden dann auch Fehler eingestanden und korrigiert - mittlerweile muss ich sagen, ist es eine runde Sache.

In der Vergangenheit war eben im Sommer der Akku um 11-12 Uhr wieder voll, eine Stunde später über 5kw -> Abregeln.
(Ich wollte jetzt erst mal keine zus. Verbraucher wie Heizstab installieren)
Aber mit der prognosebasierenden Ladesperre klappt es nun: Der Zeitpunkt wird nach hinten gelegt, z.B. Laden erst ab 14 Uhr.

Intersanterweise wird diese Ladesperre aufgehoben, wenn die 5kW schon vor dem Termin überschritten werden (auch ein feature, wie ich erfahren konnte).

Der Wetterbericht liegt leider bei uns oftmals falsch (wo tut er das nicht...  ;) ), da wir direkt an den Alpen wohnen un der Föhn starken Einfluß auf das Wetter haben kann.

Um die Netzeinspeisung zu reduzieren, suche ich auch noch nahc Lösungen. Wir sind beide berufstätig, da gibts halt nicht viel, wo man tagsüber Strom "verbraten" könnte - Spülmaschine, ok. Waschmaschine gibt Frau schon das Veto, dass die Wäsche nicht zu lange rumliegen dürfe. Zudem muss ich noch prüfen, ob das gute Stück überhaupt über eine Funktsteckdose startet...


So long,
VG,
Baeda








blofield

Hallo Baeda,

erstmal vielen Dank für das Feeback, das hilft schonmal sehr gut.
Ich habe auch mehrere homewatt Einträge in der DB und das kommt offenbar vom rechnen im userreading. Das war mir bisher nicht so bewusst:

Userreading ist:
homewatt { if (ReadingsVal("S10", "homewatt0", "") < 4294900000 ) {(ReadingsVal("S10", "homewatt0", ""))} else {(((ReadingsVal("S10", "battwatt", "")) * -1 ) + (ReadingsVal("S10", "sunwatt", "")) + (ReadingsVal("S10", "gridwatt", "")))}; }

aus deinem Beispiel:
TIMESTAMP           | DEVICE | TYPE       | EVENT                 | READING   | VALUE      | UNIT |
+---------------------+--------+------------+-----------------------+-----------+------------+------+
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Sunwatt: 325          | Sunwatt   | 325        |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Homewatt0: 4294902248 | Homewatt0 | 4294902248 |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Homewatt: 302         | Homewatt  | 302        |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Gridwatt0: 65016      | Gridwatt0 | 65016      |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Gridwatt: -520        | Gridwatt  | -520       |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Homewatt: -195        | Homewatt  | -195       |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Battwatt0: 64813      | Battwatt0 | 64813      |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Battwatt: -723        | Battwatt  | -723       |      |
| 2017-09-14 14:35:17 | E3DC   | MODBUSATTR | Homewatt: 528         | Homewatt  | 528        |      |

folgt > wir arbeiten die else Bedingung ab:
->
-723 * -1 + 325 + (-520) = 528

Dies ist der korrekte Wert. Allerdings wird die Berechnung wohl jedes mal angestoßen, wenn ein anderes Userreading aktualisiert wird und dann wird mit den "aktuellen" Readings gerechnet, was dann die zus. Einträge und zudem Rechenfehler produziert. Das ist in der Tat sehr unschön und von mir nicht bedacht. Ich versuche mal einen anderen Ansatz und poste den Fortschritt wieder hier.

blofield

blofield

So,

bitte mal das Userreading korrigieren:

homewatt { if (ReadingsVal("S10", "homewatt0", "") <= 4294901759 ) {(ReadingsVal("S10", "homewatt0", ""))} else {(ReadingsVal("S10", "homewatt0", "")) - 4294967295 + 65536 }; }

und dann sollte es passen und auch keine doppelten Werte mehr geben.

Freue mich auf Feedback.

blofield

Baeda

Hallo blofield,

sehr fein - so sollte es passen, besten Dank dafür.

Habe jetzt die fhem.cfg entsprechend angepasst.
Und nach dem Löschen aller Zeilen Homewatt >10.000 in der DB waren die Graphen auch wieder da.

Vergleich mit dem E3DC Portal lieferte eine Abweichung von 1W (bei 520W Verbrauch, aber da kommt ja noch die Zeitverschiebung dazu, etc.) . Also perfekt.
Jetzt werde ich die Sache mal beobachten, vor allem auch die anderen Werte. Aber jetzt ist es erstmal finster, daher gehts morgen weiter, wenn neue Daten eintreffen...  :)


Beste Grüße,
Bäda

Inputsammler

Hallo zusammen,

Bei mir ist jetzt der Speicher installiert worden.
Leider muss ich noch warten bis ich ihn aktivieren darf wegen Zählertausch.... und das dauert wegen den Feiertagen bestimmt zu lange.

Aber wollte mich hier mal vorab informieren.

-->brauch keinen eigenen Adapter sondern nur den  Mobus im System einschalten, oder?
--> Protokoll E3DC oder Sun_SPEC
--> muß es so definieren wie du es gemacht hast?

Zitat von: blofield am 02 September 2017, 16:04:19
Hallo Juanmax,

ich habe es jetzt raus ;)
Ich habe es mit ModbusAttr umgesetzt und meinen S10 so definiert:

Anbei noch die aktuellste Daten für den MoBus für den Speicher .

Gruß Gerd
Rpi's und Bpi's und Hw von Dirk und locutus
CCU2,F20,Ks300,1-Wire,Homematic usw ...
vitodens 300 & IstrkrM372 auslesen über USB und FHEM
RUHE IN FRIEDEN AHA1805 RIP Mallorca +29.08.16
I miss you and your Family H.H.L.L.

blofield

Hallo Gerd,

ich hoffe Du konntest Dein Gerät inzwischen in Betrieb nehmen. Allerdings macht es gerade nicht so viel Spaß, wegen des Januar Wetters ;)

Du brauchst keinen Adapter, sondern schaltest im E3DC einfach Modbus an, nimmst das E3DC Protokoll und definierst dann in FHEM wie in diesem Beitrag beschrieben. Dann sollte es sofort klappen :)
Dein FHEM Host und der E3DC sollten IP-technisch im gleichen Subnetzwerk liegen.

Viel Erfolg.
blofield

rellla

Hallo,

hier kurz als Ergänzung die Register für Eigenverbrauch und Autarkie in %.


attr S10 obj-h40081-len 1
attr S10 obj-h40081-reading ae
attr S10 obj-h40081-unpack n

attr S10 userReadings \
autarkie { ((ReadingsVal("S10", "ae", "")) & 0xFF00) >> 8;; },\
eigenverbrauch { (ReadingsVal("S10", "ae", "")) & 0xFF;; }


Hinweis:
Der Eigenverbrauch [%] aus dem Registerwert ist nicht das gleiche wie der Eigenstrom [%] im Webfrontend bei "Aktuelle Werte".
Die Formeln für beide Werte sollten sein:


Eigenverbrauch [%] = 100 / Wechselrichter [W] * Hausverbrauch [W]
Eigenstrom [%] = 100 / Wechselrichter [W] * (Hausverbrauch [W] + Batterieladung [W])


Gruß
Andreas

JueFi

Danke für die Vorarbeit, ich werde mir das bestimmt mal ansehen.

Falls ihr noch eine sinnvolle Alternative für euren Stromüberschuss sucht, wie wäre es mit einem Elektroauto -:)
https://www.goingelectric.de/forum/
https://www.goingelectric.de/stromtankstellen/

Bussi

Hallo,

seit neusten besitze ich auch eine Speicherlösung von E3DC. Könnten Sie mir kurz erklären wie ich diese nun in die SMART-Home Zentrale (FHEM) einbinden kann?

Edit:
Fehler gefunden. Modbus war nicht komplett aktiviert.

Mit freundlichen Grüßen,
Manuel

rellla

Hallo Manuel,

im Prinzip kommst du schon ziemlich weit, wenn du dir den Thread ganz durchliest. blofield hat eine Beispielkonfiguration angegeben.
Ich z.B. habe meine E3DC so konfiguriert: https://github.com/rellla/fhemcfg/blob/master/fhem.cfg#L338

Bin mir nicht mehr sicher, aber ich meine, mehr hats gar nicht gebraucht, als das device zu definieren.

Gruß
Andreas

PS: Offtopic und passt nur als Ergänzung: E3DC lassen sich auch über das RSCP-Protokoll ansprechen. Darüber kann auch man auch Werte schreiben. Allerdings weiß ich nicht, ob es dazu schon was in FHEM gibt. Beispielcode zum Testen würde hier liegen: https://github.com/rellla/E3DC-Rscp ...

Bussi

Zitat von: rellla am 20 Dezember 2018, 10:59:46
Hallo Manuel,

im Prinzip kommst du schon ziemlich weit, wenn du dir den Thread ganz durchliest. blofield hat eine Beispielkonfiguration angegeben.
Ich z.B. habe meine E3DC so konfiguriert: https://github.com/rellla/fhemcfg/blob/master/fhem.cfg#L338

Bin mir nicht mehr sicher, aber ich meine, mehr hats gar nicht gebraucht, als das device zu definieren.

Gruß
Andreas

PS: Offtopic und passt nur als Ergänzung: E3DC lassen sich auch über das RSCP-Protokoll ansprechen. Darüber kann auch man auch Werte schreiben. Allerdings weiß ich nicht, ob es dazu schon was in FHEM gibt. Beispielcode zum Testen würde hier liegen: https://github.com/rellla/E3DC-Rscp ...

Hallo Andreas,

da hattest du recht. Das Menü im E3DC Speicher hat sich verändert und man muss eine Seite umblättern um den Modbus zu aktivieren. Funktioniert nun einwandfrei ;)

Vielen Dank.

Gruß,
Manuel

Faber38

#29
Zuerst mal "DANKE"  an alle die hier geschrieben haben.

durch diesen Thread konnte ich meine E3DC in FHEM einbinden...
Anmerkend noch einen kleinen Zusatz
Ich habe eine ext.Quelle und konnte diese wie folgt einbinden

Zitatattr 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 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", "")) & 0x4) >> 2;; },\
sun2watt { if (ReadingsVal("S10", "zusatzwatt", "") <= 4294901759 ) {(ReadingsVal("S10", "zusatzwatt", "")) - 65536 } else {(ReadingsVal("S10", "zusatzwatt", "")) - 4294967295 + 65536 };; },\
sun2watt2 { (ReadingsVal("S10", "sun2watt", "")) *-1 ;; },\

Leistung { (ReadingsVal("S10", "sun2watt2", "")) + (ReadingsVal("S10", "sunwatt", "")) ;; }

wichtig war ...  das der Modbus die Quelle als negative Zahl ausgibt...
daher die biegerei mit dem "*-1"


Faber38

Nun nach einigen Wochen kann ich dieses Ergebnis vorweisen...
ohne jeglichen Ausreisser...

Zitatdefine S10 ModbusAttr 1 20 192.168.38.44: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 pumpe
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 Keller
Zitatattr 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", "")) ;; }
Zitat###################################
#  E3DC Anzeigen
###################################
define E3DC readingsGroup S10:<Batterie>,battwatt S10:<Batterie_Status>,battsoc S10:<Süd/West>,sunwatt S10:<Ost>,sun2watt2 S10:<Gesamleistung>,Leistung S10:<Verbrauch>,homewatt S10:<Netz>,gridwatt S10:<NotStrom>,notstrom
attr E3DC group E3DC
attr E3DC room Allgemein
attr E3DC valueFormat {battsoc => "%.1f %" , homewatt => "%2f Watt" , sunwatt => "%3f Watt" , gridwatt => "%4f Watt" , battwatt => "%5f Watt" , notstrom => "%6f" , sun2watt2 => "%7f Watt" , Leistung => "%8f Watt" ,}
attr E3DC valueStyle { if($READING eq "battsoc" && $VALUE > 85) { 'style="color:green"'}elsif($READING eq "battsoc" && $VALUE > 60) { 'style="color:cyan"'}\
elsif($READING eq "battsoc" && $VALUE  > 35) { 'style="color:yellow"'}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:yellow"'}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:yellow"'}elsif($READING eq "homewatt" && $VALUE > 3000){ 'style="color:red"'}\
elsif($READING eq "sunwatt" && $VALUE > 0){ 'style="color:yellow"'}elsif($READING eq "sunwatt" && $VALUE < 1){ 'style="color:white"'}\
elsif($READING eq "sun2watt2" && $VALUE > 0){ 'style="color:yellow"'}elsif($READING eq "sun2watt2" && $VALUE < 1){ 'style="color:white"'}\
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:yellow"'}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"'} }
###################################
##---- Ende
###################################

JueFi

Erstmal herzlichen Dank für die vielen Infos zur Anbindung des E3DC.

Per Modbus kann man aber ja wohl nur lesend darauf zugreifen.
Ich würde gerne "per Knopfdruck" aus FHEM das Entladen der Batterien des E3DC sperren, wenn ich mein eAuto an der Steckdose lade (ich habe keine Wallbox, sondern lade per NRGkick an einer CEE Steckdose).
Per RSCP soll das ja gehen.
Gibt es da schon etwas in FHEM, das ich nutzen kann (gerne kann dazu auch ein eigener Thread gemacht werden) ?

Ich habe zu RSCP und E3DC das gefunden, damit komme ich aber leider nicht weiter, es fehlt vermutlich an KnowHow.
,Winter is coming' oder Sauregurkenzeit für PV-Anlagen Betreiber
https://elektromobilitaet-duelmen.de/2019/11/22/winter-is-coming/

E3DC Überschusssteuerung per RSCP und Raspberry PI
https://www.photovoltaikforum.com/thread/125497-e3dc-überschusssteuerung-per-rscp-und-raspberry-pi/?pageNo=1

marcus42

#32
Hallo Jürgen,

ich habe gerade Deine eMail erhalten und antworte mal direkt hier:

Du könntest zunächst mal einen Blick in diesen Thread werfen: https://forum.fhem.de/index.php?topic=98991.0 (ab Beitrag #6)

Dort habe ich ich ein paar fhem-spezifische technische Details zum Einbinden in fhem beschrieben.

Schau einfach mal dort nach und melde Dich dann einfach nochmal ggf. mit Detailfragen.

Grundsätzlich:
0. Das Tool e3dcset ist ein Kommandozeilenprogramm, dass Du auf einer Linux Büchse selber kompilieren kannst.
1. Runterladen mit 'git clone https://github.com/mschlappa/e3dcset.git'
2. Da die Zugangsdaten (im Moment noch) nicht separat in einer Datei liegen, sind sie vor dem Kompilieren im Quellcode zu hinterlegen
(Datei e3dcset.cpp)
3. im Verzeichnis e3dcset das Kommando 'make' aufrufen (je nach Power des Rechner dauert das ein paar Minuten)
4. Das kompilierte Tool liegt dann in diesem Verzeichnis

Aufruf von e3dcset ohne Parameter liefert dann:

Usage: e3dcset [-c maxLadeLeistung] [-d maxEntladeLeistung] [-e manuelleLadeEnergie] [-a]

Aufrufbeispiele:

'e3dcset -c 2400 -d 1'
=>Speicher wird mit maximal 2400 Watt geladen, Entladen nur 1 Watt ist quasi deaktiviert

'e3dcset -a'
=>Zurücksetzen auf Automatik (Laden, Entladen aktiviert)

JueFi

@marcus42
Ganz herzlichen Dank auch noch für die Unterstützung per Mail.

Ich schreibe nochmal ein paar Ergänzungen, die vielleicht auch anderen helfen.
Das RSCP Passwort muss gesetzt werden im Menü am E3DC unter
- Hauptmenü | Personalisieren | Benutzerprofil | RSCP-Passwort setzen

Ich musste das Tool mit ./e3dcset aufrufen

Usage: e3dcset [-c maxLadeLeistung] [-d maxEntladeLeistung] [-e manuelleLadeEnergie] [-a]

  • maxLadeLeistung in Watt und
    maxEntladeLeistung in Watt müssen zusammen gesetzt werden und schalten unter "SmartPower" auch direkt die Funktion der "Manuellen Speicher-Ladeleistung und Speicher-Entladeleistung" ein.
  • manuelleLadeEnergie in WattStunden schaltet auch direkt die Funktion der "Manuellen Speicherladung" ein und der Akku wird mit der Energiemenge aufgeladen.
  • -a schaltet die "SmartPower"-Funktion der "Manuellen Speicher-Ladeleistung und Speicher-Entladeleistung" wieder aus. D.h. die Batterie wird wieder mit der größtmöglichen Leistung geladen / entladen.

EDIT:
Und die Einbindung in FHEM, um die Entladungssperre einzuschalten (genauer die Entladungsleistung auf 250 Watt zu begrenzen)
if ($EVENT eq "Ein"){\
   system '/opt/fhem/e3dcset/e3dcset -c 3000 -d 250&';;\
  }else {\
   system '/opt/fhem/e3dcset/e3dcset -a&';;\
}

pcbastler

Da ich nun auch eine S10E im Keller habe kann ich mich auch etwas beteiligen.
Ich habe mal angefangen, die Register alle ins FHEM zu laden. Die Konvertierung der nicht numerischen Werte bereitet mir aber noch etwas Kopfzerbrechen. So liefert:

attr S10 obj-h40002-len 16
attr S10 obj-h40002-poll 1
attr S10 obj-h40002-reading Hersteller
attr S10 obj-h40002-unpack a16

fast korrekt  �E3/DC GmbH
Mit dem Client von http://www.simplymodbus.ca klappt das Auslesen.
Hat jemand eine Idee?


zettos


marcus42

Zitat von: JueFi am 01 Februar 2020, 19:29:12
@marcus42

Ich schreibe nochmal ein paar Ergänzungen, die vielleicht auch anderen helfen.

Ich habe das Tool e3dcset mal etwas überarbeitet UND die überfällige Doku spendiert ;-)
Die Konfiguration liegt jetzt in einer externen Textdatei unabhängig vom Programm.

https://github.com/mschlappa/e3dcset

Marcus

pcbastler

Zitat von: zettos am 21 Februar 2020, 08:17:17
Versuchs mal mit obj-h40003  ;)
Komisch, das geht. Die offizielle Doku sagt:
Register: Beschreibung
40003 : Anzahl unterstützter Register
40004: Hersteller: ,,E3/DC GmbH"

In einem anderen Beitrag war mal von Differenz 2 zu lesen. Hat hier die Modbus-Schnittstelle von FHEM Anpassungsbedarf oder ist das einfach nur herstellerspezifisch?

pcbastler

Ich hab den Ansatz von faber38 mal weitergebaut:

attr S10E obj-h40003-len 16
attr S10E obj-h40003-poll 1
attr S10E obj-h40003-reading Hersteller
attr S10E obj-h40003-unpack a16
attr S10E obj-h40019-len 16
attr S10E obj-h40019-poll 1
attr S10E obj-h40019-reading model
attr S10E obj-h40019-unpack a16
attr S10E obj-h40035-len 16
attr S10E obj-h40035-poll 1
attr S10E obj-h40035-reading serial
attr S10E obj-h40035-unpack a16
attr S10E obj-h40051-len 16
attr S10E obj-h40051-poll 1
attr S10E obj-h40051-reading firmware
attr S10E obj-h40051-unpack a16
attr S10E obj-h40081-len 1
attr S10E obj-h40081-poll 1
attr S10E obj-h40081-reading netstatus
attr S10E obj-h40081-unpack n

Das Register netstatus liefert die beiden Werte für Eigenstrom und Autarkie. Hier die entsprechenden Userreadings:

eigenstrom {{(ReadingsVal("S10E", "netstatus", "")) % 256 };;},\
autarkie {{((ReadingsVal("S10E", "netstatus", "")) - (ReadingsVal("S10E", "netstatus", "")) % 256) / 256 };;}

mkrauss

Hallo !

Erstmal vielen Dank für die prima Informationen zum Abfragen der E3DC Parameter.
Die Werte aus meiner E3DC S10E kommen sauber per Modbus an, werden im Logfile abgelegt und ich kann mir Graphen damit malen.

Was nicht klappt ist das Senden der Werte auf meinen KNX-Bus, um sie dort weiter zu verwenden.
Als Vorbereitung habe ich dazu erst mal die passenden Gruppenadressen in der ETS angelegt und im FHEM die Devices konfiguriert:

define S10.sunwatt KNX 7/2/1:dpt14.056:SunWatt
attr S10.sunwatt IODev KNX
attr S10.sunwatt group KNX-send
attr S10.sunwatt room E3DC

define S10.gridwatt KNX 7/2/2:dpt14.056:GridWatt
attr S10.gridwatt IODev KNX
attr S10.gridwatt group KNX-send
attr S10.gridwatt room E3DC

define S10.battwatt KNX 7/2/4:dpt14.056:BattWatt
attr S10.battwatt IODev KNX
attr S10.battwatt group KNX-send
attr S10.battwatt room E3DC

define S10.homewatt KNX 7/2/5:dpt14.056:HomeWatt
attr S10.homewatt IODev KNX
attr S10.homewatt group KNX-send
attr S10.homewatt room E3DC

define S10.battsoc KNX 7/2/6:dpt5.001:BattSoC
attr S10.battsoc IODev KNX
attr S10.battsoc group KNX-send
attr S10.battsoc room E3DC


Nach viel lesen und noch mehr Probieren komme ich aber beim Senden nicht weiter. Irgendwie habe ich da ein Verständnisproblem, wie ich die Werte aus dem S10 Modbus Device (sie Beispiel ein paar Postings weiter vorne) auf die KNX-Devices schreiben kann.

Meine Versuche mit notify oder DOIF haben bisher leider nicht gefruchtet:


define S10.gridwatt.out notify S10 (set S10.gridwatt value ReadingsVal("S10", "gridwatt", ""))
#define S10.gridwatt.out DOIF (["gridwatt"]) (set S10.gridwatt value $gridwatt)
#define S10.gridwatt.out DOIF (["gridwatt"]) (set S10.gridwatt value ReadingsVal("S10", "gridwatt", ""))
attr S10.gridwatt.out group KNX-send
attr S10.gridwatt.out room E3DC


Hat vielleicht jemand einen Tipp für mich, wo ich nochmal nachdenken sollte ? Oder ein Beispiel ?

Danke !

Gruß,
Michael



blofield

Zitat von: marcus42 am 01 Februar 2020, 11:29:40

Usage: e3dcset [-c maxLadeLeistung] [-d maxEntladeLeistung] [-e manuelleLadeEnergie] [-a]

Aufrufbeispiele:

'e3dcset -c 2400 -d 1'
=>Speicher wird mit maximal 2400 Watt geladen, Entladen nur 1 Watt ist quasi deaktiviert

'e3dcset -a'
=>Zurücksetzen auf Automatik (Laden, Entladen aktiviert)

Moin @marcus42,

ich möchte gerne dein e3dcset in Verbindung mit S10 und go-eCharger verwenden. Ich habe am S10 das RSCP-Passwort gesetzt und das Programm compiliert. Die Parameter in e3dcset.config mehrfach kontrolliert, aber leider bekomme ich immer nur "Connection closed by peer" zurück, was offenbar auf ein Netzwerk-Problem deutet.
Mit NMAP sehe ich aber vom FHEM Host aus, dass der Port 5033 offen ist, das Passwort ist auch richtig :-/

Ich habe am S10 auch das local.user RSCP-Passwort gesetzt und es mal mit dem User "local.user" versucht. Gelingt aber alles nicht. Immer die gleiche Fehlermeldung :(

Hast Du noch einen Tipp?

Danke,
blofield

daelch

Hallo,

homewatt0 liefert vereinzelt merkwürdig hohe Werte, das würde hier auch schon mal thematisiert.

Auszug aus FileLog:

2020-03-13_10:16:37 1488
2020-03-13_10:16:58 1444
2020-03-13_10:17:18 1422
2020-03-13_10:17:37 1484
2020-03-13_10:17:58 4294903193
2020-03-13_10:18:17 1333
2020-03-13_10:18:38 4294903245
2020-03-13_10:18:58 4294903251
2020-03-13_10:19:17 4294903217
2020-03-13_10:19:37 1487


Diese Werte zerhauen dann natürlich den Graphen.

Wie kann ich diese Werte aus dem Log ausschließen?

Vielen Dank und viele Grüße

ch.eick

Mir einem userreading, dass mit If > Dein Limit wegschmeißt oder einen Maxwert reinschreibt.
Mit LogDB könntest Du mit sql alle ungewollten Werte aus der DB löschen.

Gesendet von meinem SM-G930F mit Tapatalk

RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

hasenhirn

Hallo,

seit ein paar Tagen habe ich auch meine E3/DC und jetzt in FHEM eingebunden.
Erst mal danke an alle für die Vorarbeit und die Beispiele hier :-)
Ich habe alles so weit hinbekommen bis auf 2 Kleinigkeiten.
1.) bei der Autarkie kommen maximal 99% obwohl im Portal 100% angezeigt werde, Sicherlich ein Formatierungsfehler den ich nicht finde.
2.) bei Notstrom ( habe ich aus Register 40084 ) würde ich gerne die Zahlen z.Bb 2 für Normalbetrieb, 1 für Notstrom usw mappen. Meine bisherigen Versuche sind gescheitert da das Mapping auf alle Readings geht. im Forum habe ich schon ein paar Beiträge darüber gefunden das übersteigt aber meinen Horizont  ???

Würde mich freuen wenn jemand eine gute Idee hat ;D

Hier mal meine derzeitige Konfiguration: ( alles zusammengeklaut  ::) )

defmod S10 ModbusAttr 1 20 192.168.1.20:502 TCP
attr S10 userattr dev-h-defPoll obj-h40003-len obj-h40003-poll obj-h40003-reading obj-h40003-unpack obj-h40019-len obj-h40019-poll obj-h40019-reading obj-h40019-unpack obj-h40035-len obj-h40035-poll obj-h40035-reading obj-h40035-unpack obj-h40050-len obj-h40050-poll obj-h40050-reading obj-h40050-unpack obj-h40051-len obj-h40051-poll obj-h40051-reading obj-h40051-unpack obj-h40052-len obj-h40052-poll obj-h40052-reading obj-h40052-unpack obj-h40066-len obj-h40066-reading obj-h40066-unpack obj-h40068-len obj-h40068-reading obj-h40068-unpack obj-h40070-len obj-h40070-reading obj-h40070-unpack obj-h40072-len obj-h40072-max obj-h40072-min obj-h40072-reading obj-h40072-unpack obj-h40081-len obj-h40081-poll obj-h40081-reading obj-h40081-unpack obj-h40082-len obj-h40082-reading obj-h40082-unpack obj-h40083-len obj-h40083-poll obj-h40083-reading obj-h40083-unpack obj-h40095-len obj-h40095-reading obj-h40095-unpack obj-h40096-len obj-h40096-reading obj-h40096-unpack obj-h40101-len obj-h40101-reading obj-h40101-unpack obj-h40102-len obj-h40102-reading obj-h40102-unpack
attr S10 dev-h-defPoll 1
attr S10 event-on-change-reading .*
attr S10 obj-h40003-len 16
attr S10 obj-h40003-poll 1
attr S10 obj-h40003-reading Hersteller
attr S10 obj-h40003-unpack a16
attr S10 obj-h40019-len 16
attr S10 obj-h40019-poll 1
attr S10 obj-h40019-reading Model
attr S10 obj-h40019-unpack a16
attr S10 obj-h40035-len 16
attr S10 obj-h40035-poll 1
attr S10 obj-h40035-reading Seriennummer
attr S10 obj-h40035-unpack a16
attr S10 obj-h40066-len 2
attr S10 obj-h40066-reading PV-Leistung
attr S10 obj-h40066-unpack N
attr S10 obj-h40068-len 2
attr S10 obj-h40068-reading batterieladung
attr S10 obj-h40068-unpack N
attr S10 obj-h40070-len 2
attr S10 obj-h40070-reading hausverbrauch
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-reading netzbezug
attr S10 obj-h40072-unpack N
attr S10 obj-h40081-len 1
attr S10 obj-h40081-poll 1
attr S10 obj-h40081-reading autarkie
attr S10 obj-h40081-unpack n
attr S10 obj-h40082-len 1
attr S10 obj-h40082-reading Batterie-SOC
attr S10 obj-h40082-unpack n
attr S10 obj-h40083-len 1
attr S10 obj-h40083-poll 1
attr S10 obj-h40083-reading Notstrom
attr S10 obj-h40083-unpack n
attr S10 obj-h40095-len 1
attr S10 obj-h40095-reading String1_Volt
attr S10 obj-h40095-unpack n
attr S10 obj-h40096-len 1
attr S10 obj-h40096-reading String2_Volt
attr S10 obj-h40096-unpack n
attr S10 obj-h40101-len 1
attr S10 obj-h40101-reading String1_Power
attr S10 obj-h40101-unpack n
attr S10 obj-h40102-len 1
attr S10 obj-h40102-reading String2_Power
attr S10 obj-h40102-unpack n
attr S10 room E3/DC
attr S10 userReadings Netzbezug { if (ReadingsVal("S10", "netzbezug", "") <= 32768 ) {(ReadingsVal("S10", "netzbezug", ""))} else {(ReadingsVal("S10", "netzbezug", "")) - 65536 };; },\
Batterieladung { if (ReadingsVal("S10", "batterieladung", "") <= 32768 ) {(ReadingsVal("S10", "batterieladung", ""))} else {(ReadingsVal("S10", "batterieladung", "")) - 65536 };; },\
Hausverbrauch { if (ReadingsVal("S10", "hausverbrauch", "") <= 4294901759 ) {(ReadingsVal("S10", "hausverbrauch", ""))} else {(ReadingsVal("S10", "hausverbrauch", "")) - 4294967295 + 65536 };; },\
Autarkie { ((ReadingsVal("S10", "autarkie", "")) & 0xFF00) >> 8;; },\
Eigenverbrauch { (ReadingsVal("S10", "autarkie", "")) & 0xFF;; },


defmod Stromverbrauch readingsGroup S10:<Autarkie>,Autarkie S10:<Hausverbrauch>,Hausverbrauch S10:<Netzbezug>,Netzbezug S10:<PV-Leistung>,PV-Leistung S10:<Batterie-Ladung>,Batterieladung S10:<Batterie-Status>,Batterie-SOC S10:<Notstrom>,Notstrom
attr Stromverbrauch room E3/DC
attr Stromverbrauch valueFormat {'Autarkie' => " %.0f %" , Hausverbrauch => "%.0f Watt" ,Netzbezug => "%.0f Watt" ,'PV-Leistung' => "%.0f Watt" , 'Batterieladung' => "%.0f Watt" ,'Batterie-SOC' => " %.0f %" ,  }
attr Stromverbrauch valueStyle {if($READING eq "Netzbezug" && $VALUE > 1){ 'style="color:orange"'}elsif($READING eq "Netzbezug" && $VALUE < 1){ 'style="color:green"'}elsif($READING eq 'Batterieladung' && $VALUE > 1){ 'style="color:green"'}elsif($READING eq 'Batterieladung' && $VALUE < 0){ 'style="color:orange"'}elsif($READING eq "Batterie-SOC" && $VALUE > 80) { 'style="color:green"'}elsif($READING eq "Batterie-SOC" && $VALUE > 60) { 'style="color:cyan"'}elsif($READING eq "Batterie-SOC" && $VALUE  > 20) { 'style="color:orange"'}elsif($READING eq "Batterie-SOC" && $VALUE  < 21 ) { 'style="color:red"'} }






daelch

Hallo,

im e3dc Portal bekomme die bisher produzierte Gesamtmenge des Tages angezeigt. Kann ich diesen Wert aus einem Register auslesen?

Viele Grüße

hasenhirn

Hallo daelch,

dazu kann ich in der Modbusdoku keine Register finde.
Eventuell werden die Werte einfach aufgerechnet

Gruß

Thomas

daelch

Vielen Dank für deine  schnelle Antwort! Dann werde ich es Mal mit FHEM versuchen.

hasenhirn

Hallo daelch,

ich habe noch mal in der Dokumentation der S10 nachgeschaut und Du kannst es über das RSCP-TAG TAG_DB_DC_POWER mit RSCP auslesen. Das ist natürlich eine andere Hausnummer als Modbus ;-)

Gruß

Thomas

daelch

Danke, Hasenhirn. Das schaue ich mir mal an.

An alle gerichtet: springt Eure Anlage auch öfter mal auf disconnect? Ich muss dann entweder die Anlage neustarten oder  DHCP an und ausschalten, damit aus e3dc Portal oder auch FHEM wieder eine Verbindung bekommt. Im Netzwerk (Fritzbox 7590 und unifi 48 Port PoE Switch ist nichts Auffälliges zu sehen.

hasenhirn

das Problem mit disconnect konnte ich bei mir noch nicht beobachten.
Hast Du die IP fest vergeben / von Hand oder Mischbetrieb?

Yeeha

Hallo zusammen,

ihr seid offenbar ein paar Schritte weiter als ich. Wäre jemand von euch so nett, mir mit den ersten Schritten zu helfen von der S10 via Modbus zu Fhem?
Um diesen Thread nicht zu stören, habe ich einen neuen aufgemacht:
https://forum.fhem.de/index.php/topic,109735.msg1037180.html#msg1037180
Danke!

Yeeha

daelch

Zitat von: hasenhirn am 24 März 2020, 13:08:41
das Problem mit disconnect konnte ich bei mir noch nicht beobachten.
Hast Du die IP fest vergeben / von Hand oder Mischbetrieb?

Danke für den Hinweis. Ich habe die IP nun fest im Menü der S10 eingetragen. Die via DHCP zugeteilte IP 192.168.178.92 ist in der Anlage immer auf 192.168.192.168 umgesprungen.
Nach Ausschalten von DHCP im Menü und Router gibt seitdem keine Disconnects mehr.

Yeeha

So, dank daelch bin ich jetzt auch fast soweit. Allerdings muss irgendwo ein Fehler stecken, und ich weiß nicht wie ich den einkreisen kann.

Grundsätzlich ist eine Verbindung von meiner S10 zu FHEM da. Wenn ich die Modbus auf der S10 mal weg- und wieder zuschalte, dann sehe ich den Log-Eintrag.
2020.04.03 18:23:23 3: 192.168.178.27:502 disconnected, waiting to reappear (S10)
2020.04.03 18:24:29 3: 192.168.178.27:502 reappeared (S10)

Ich sehe beim Objekt S10 außerdem u.a.
LASTOPEN 1585931069.10524 (das ist 04/03/2020 @ 4:24pm (UTC))
lastUpdate 1585931288.36823 (das ist 04/03/2020 @ 4:28pm (UTC))

Und außerdem
Readings:
state opened 2020-04-03 18:24:29

Ich habe ein Device EnergieLog, da steht u.a.
Regexp parts
S10:Leistung:.*   
S10:battsoc:.*   
S10:battwatt:.*   
S10:gridwatt:.*   
S10:homewatt:.*   

Außerdem steht da
STATE active
TYPE FileLog

Allerdings ist e3dc-2020-04.log leer. Zeitstempel der Datei übrigens von gestern Abend, als ich das erstemals aufgesetzt habe.

Wo muss ich den Fehler suchen?

daelch

Was steht bei Dir im Modbus Menü am Display der Anlage, wenn Du den Pfeil nach rechts klickst? Protokoll E3DC, Gerät 1, Port 502?
Ist dort Modbus TCP auch aktiviert?

Yeeha

Jep. Dort habe ich testhalber mal TCP aus- und wieder angeschaltet. Daraufhin kam das "disconnected" und "reappeared" im Log von FHEM. Tut also soweit.
Der Lastopen und der Lastupdate sind wohl auch davon ausgelöst - war jedenfalls alles heute am späten Nachmittag.

Yeeha

Hat denn tatsächlich keiner eine Idee, wie ich den Fehler einkreisen kann?

Wenn ich scanModbusObjects setze, dann bekomme ich übrigens aktualisierte ,,Readings", also generell können da schon Daten fließen.

Beispiel:
scan-h00019
hex=5331, string=S1, s=12627, s>=21297, S=12627, S>=21297
2020-04-10 09:43:23

Aber warum ist der Intervall (bei mir: 60) unwirksam, und warum kommt nichts ins Logfile?

Yeeha

Ok, anscheinend rede ich hier mit mir selber.  :(
Sonst keiner mehr da?

Ich habe mal alle devices, die mit der S10 zu tun haben, gelöscht. Dann FHEM neu gestartet. Neu das Device S10 angelegt. Logfile genau gelesen. Da steht:

2020.04.12 23:17:59 3: S10: defined with id 1, interval 20, protocol TCP, mode master, connection to 192.168.178.27:502
2020.04.12 23:17:59 3: Opening S10 device 192.168.178.27:502
2020.04.12 23:17:59 3: S10 device opened
2020.04.12 23:18:01 1: PERL WARNING: Argument "" isn't numeric in numeric le (<=) at (eval 79) line 1.
2020.04.12 23:18:01 3: eval: { if (ReadingsVal("S10", "gridwatt0", "") <= 32768 ) {(ReadingsVal("S10", "gridwatt0", ""))} else {(ReadingsVal("S10", "gridwatt0", "")) - 65536 }; }
2020.04.12 23:18:01 1: PERL WARNING: Argument "" isn't numeric in numeric le (<=) at (eval 80) line 1.
(...)

Ok, es sind nur Warnungen, keine Fehlermeldungen. Tapfer weiter gemacht. Was zeigt die S10?

S10   Batterie    -276 Watt
S10 Batterie_Status 75.0 %
S10 Gesamleistung 0 Watt
S10 Verbrauch 276 Watt
S10 Netz -2 Watt
S10 NotStrom 0

Oh, da kommen ja aktuelle Werte!? Ich meine, ich hätte alles genauso gemacht wie beim ersten Mal, aber manchmal hilft wohl der alte Trick mit dem Löschen und nochmal Neuaufsetzen...  :D Das Diagramm scheint sich auch allmählich zu füllen.

Also, wo auch immer das Problem lag: Es läuft anscheinend jetzt. Danke für eure Vorarbeiten, das hätte ich alleine nie hin bekommen!

daelch


hdgucken

Hallo Leute,

erst mal vielen, vielen Dank für Eure super Arbeit ! Das hat mir viel Zeit erspart  :)
Habe dann hier angesetzt:

Zitat von: blofield am 02 September 2017, 16:04:19
Hallo Juanmax, ...

Das interessante ist, dass alle Readings im Register jeweils -2 zur E3DC Dokumentation sind...

Das hat mir auch keine Ruhe gelassen, weshalb ich das Ganze genauer betrachtet habe.
Dabei ist mir aufgefallen, dass man alle Register ab 40067 mit -1 auslesen kann, wenn man sie abweichend zur E3DC Doku als 16 Bit Werte betrachtet !
Dann noch das passende unpack s> für die signed Werte gewählt und es passt alles  8)
Damit spart man sich die komplizierten Konstrukte in den User Readings  ;)
Bei den String Strömen muss man noch die Kommastelle mit "expr $val / 100" korrigieren.

Hier meine Konfig:
(die hier fehlenden "userattrib" erstellt das Modul selbstständig)

Update vom 03.05.2020:
obj-h-40083-map 0:nicht unterstützt, ... (erspart uns das User Reading Notstrom)
obj-h-40083-reading Notstrom (das Reading EPS-Status umbenannt in Notstrom)
;)



define S10E ModbusAttr 1 20 192.168.123.456:502 TCP
attr S10E alias E3/DC S10E
attr S10E devStateIcon opened:rc_WEB@32CD32  disconnected:rc_WEB@red
attr S10E event-min-interval .*:3600
attr S10E event-on-change-reading .*
attr S10E icon measure_photovoltaic_inst@yellow
attr S10E obj-h40003-len 16
attr S10E obj-h40003-poll 1
attr S10E obj-h40003-reading Hersteller
attr S10E obj-h40003-unpack a16
attr S10E obj-h40019-len 16
attr S10E obj-h40019-poll once
attr S10E obj-h40019-reading Modell
attr S10E obj-h40019-unpack a16
attr S10E obj-h40035-len 16
attr S10E obj-h40035-poll once
attr S10E obj-h40035-reading Seriennummer
attr S10E obj-h40035-unpack a16
attr S10E obj-h40051-len 16
attr S10E obj-h40051-poll once
attr S10E obj-h40051-reading Firmware
attr S10E obj-h40051-unpack a16
attr S10E obj-h40067-poll 1
attr S10E obj-h40067-reading Solarleistung
attr S10E obj-h40069-poll 1
attr S10E obj-h40069-reading Batterieleistung
attr S10E obj-h40069-unpack s>
attr S10E obj-h40071-poll 1
attr S10E obj-h40071-reading Hausleistung
attr S10E obj-h40073-poll 1
attr S10E obj-h40073-reading Netzleistung
attr S10E obj-h40073-unpack s>
attr S10E obj-h40077-poll 1
attr S10E obj-h40077-reading Wallboxleistung
attr S10E obj-h40079-poll 1
attr S10E obj-h40079-reading WallboxSolarleistung
attr S10E obj-h40081-poll 1
attr S10E obj-h40081-reading Netzstatus
attr S10E obj-h40082-poll 1
attr S10E obj-h40082-reading Batterieladezustand
attr S10E obj-h40083-map 0:nicht unterstützt, 1:aktiv, 2:inaktiv, 3:nicht verfügbar, 4:MSS aus oder falsche Pos.
attr S10E obj-h40083-poll 1
attr S10E obj-h40083-reading Notstrom
attr S10E obj-h40084-poll 1
attr S10E obj-h40084-reading EMS-Status
attr S10E obj-h40087-poll 1
attr S10E obj-h40087-reading Wallboxstatus
attr S10E obj-h40095-poll 1
attr S10E obj-h40095-reading String1-Spannung
attr S10E obj-h40096-poll 1
attr S10E obj-h40096-reading String2-Spannung
attr S10E obj-h40098-expr $val / 100
attr S10E obj-h40098-poll 1
attr S10E obj-h40098-reading String1-Strom
attr S10E obj-h40099-expr $val / 100
attr S10E obj-h40099-poll 1
attr S10E obj-h40099-reading String2-Strom
attr S10E obj-h40101-poll 1
attr S10E obj-h40101-reading String1-Leistung
attr S10E obj-h40102-poll 1
attr S10E obj-h40102-reading String2-Leistung
attr S10E userReadings Eigenverbrauch { ReadingsVal("S10E","Netzstatus",0) & 0xFF;; },
Autarkie { (ReadingsVal("S10E","Netzstatus",0) & 0xFF00) >> 8;; },
Abregelung { ( ReadingsVal("S10E","EMS-Status","") & 0x10 ) == 16 ? return "aktiv" : return "inaktiv";; }



Gruß Thomas

hdgucken

#59
Hier noch meine "Anzeige" für Euch ...  ;)

Auf neuesten Stand aktualisiert (30.04.2020) :)



define E3DC readingsGroup S10E:<Batteriestatus>,Batterieladezustand S10E:<Solarleistung>,Solarleistung
S10E:<Hausverbrauch>,Hausleistung S10E:<Netzbezug>,Netzleistung S10E:<Batterieleistung>,Batterieleistung
S10E:<Wallboxverbrauch>,Wallboxleistung S10E:<Wallbox-Sonnenstrom>,WallboxSolarleistung
S10E:<Autarkie>,Autarkie S10E:<Eigenverbrauch>,Eigenverbrauch S10E:<Abregelung-70%>,Abregelung S10E:<NotStrom>,Notstrom
attr E3DC valueFormat {
  Batterieladezustand => "%d %%", Hausleistung => "%d Watt", Solarleistung => "%d Watt",
  Netzleistung => "%d Watt", Batterieleistung => "%d Watt", Wallboxleistung => "%d Watt",
  WallboxSolarleistung => "%d Watt", Autarkie => "%d %%", Eigenverbrauch => "%d %%"
}
attr E3DC valueStyle {    if($READING eq "Batterieladezustand" && $VALUE > 85) { 'style="color:limegreen;;text-align:right"' }
  elsif($READING eq "Batterieladezustand" && $VALUE > 60) { 'style="color:forestgreen;;text-align:right"' }
  elsif($READING eq "Batterieladezustand" && $VALUE  > 35) { 'style="color:yellow;;text-align:right"' }
  elsif($READING eq "Batterieladezustand" && $VALUE  > 19) { 'style="color:orange;;text-align:right"' }
  elsif($READING eq "Batterieladezustand" && $VALUE  < 20 ) { 'style="color:red;;text-align:right"' }
  elsif($READING eq "Hausleistung" && $VALUE > 3000){ 'style="color:red;;text-align:right"' }
  elsif($READING eq "Hausleistung" && $VALUE > 1500){ 'style="color:tomato;;text-align:right"' }
  elsif($READING eq "Hausleistung" && $VALUE > 500) { 'style="color:orange;;text-align:right"' }
  elsif($READING eq "Hausleistung" && $VALUE >= 0) { 'style="color:limegreen;;text-align:right"' }
  elsif($READING eq "Solarleistung" && $VALUE > 0){ 'style="color:yellow;;text-align:right"' }
  elsif($READING eq "Solarleistung" && $VALUE == 0){ 'style="color:gray;;text-align:right"' }
  elsif($READING eq "Netzleistung" && $VALUE < 0){ 'style="color:limegreen;;text-align:right"' }
  elsif($READING eq "Netzleistung" && $VALUE > 0){ 'style="color:red;;text-align:right"' }
  elsif($READING eq "Netzleistung" && $VALUE == 0){ 'style="color:gray;;text-align:right"' }
  elsif($READING eq "Batterieleistung" && $VALUE > 0){ 'style="color:yellow;;text-align:right"' }
  elsif($READING eq "Batterieleistung" && $VALUE == 0){ 'style="color:gray;;text-align:right"' }
  elsif($READING eq "Batterieleistung" && $VALUE < 0){ 'style="color:limegreen;;text-align:right"' }
  elsif($READING eq "Notstrom" && $VALUE eq "inaktiv") { 'style="color:gray;;text-align:right"' }
  elsif($READING eq "Notstrom" && $VALUE eq "aktiv") { 'style="color:lime;;text-align:right"' }
  elsif($READING eq "Notstrom" && $VALUE eq "nicht verfügbar") { 'style="color:orange;;text-align:right"' }
  elsif($READING eq "Notstrom" && $VALUE eq "unbekannt") { 'style="color:red;;text-align:right"' }
  elsif($READING eq "Wallboxleistung" && $VALUE == 0) { 'style="color:gray;;text-align:right"' }
  elsif($READING eq "Wallboxleistung" && $VALUE > 0) { 'style="color:limegreen;;text-align:right"' }
  elsif($READING eq "WallboxSolarleistung" && $VALUE == 0) { 'style="color:gray;;text-align:right"' }
  elsif($READING eq "WallboxSolarleistung" && $VALUE > 0) { 'style="color:yellow;;text-align:right"' }
  elsif($READING eq "Abregelung" && $VALUE eq "inaktiv") { 'style="color:gray;;text-align:right"' }
  elsif($READING eq "Abregelung" && $VALUE eq "aktiv") { 'style="color:red;;text-align:right"' }
  elsif($READING eq "Autarkie" && $VALUE == 0) { 'style="color:gray;;text-align:right"' }
  elsif($READING eq "Autarkie" && $VALUE > 0)  { 'style="color:limegreen;;text-align:right"' }
  elsif($READING eq "Eigenverbrauch" && $VALUE == 0) { 'style="color:gray;;text-align:right"' }
  elsif($READING eq "Eigenverbrauch" && $VALUE > 0)  { 'style="color:limegreen;;text-align:right"' }
}


Tsturm

Hi hdgucken,

funktioniert prima.

Bin gerade dran, die Ladeenergie zu berechnen - eine Batterie war bei mir defekt, und de e3DC hat ziemlich lange nur mit 30% Kapa gearbeitet (soviel zur Fernüberwachung). Ziel ist eine Warnung, wenn eine volle Ladung (oder Entladung) deutlich weniger als die Nennkapazität braucht. Falls jemand schon so was gebastelt hat - immer her damit ;-)


Zwei kleine Hinweise für alle:
Die Verschiebung der Register ist in der neuen Doku auch beschrieben:
Zitat4.1 Modbus-Abfragen
Die Startadresse kann je nach Modbus Abfrage-Software einen unterschiedlichen Offset haben. In
der Modbus-Spezifikation ist dies nicht einheitlich geregelt.
• Der Offset muss mit dem Magicbyte ausgetestet werden:
– Mit 400001 anfangen: Die Antwort sollte 0xE3DC (HEX) oder 58332 (DEC) sein
– Passt dies nicht, den Offset oder das Register um +/- 1-2 Stufen verändern (39999-40003).
• Der so ermittelte Offset muss für alle Register verwendet werden.
Es ist also möglich, dass alle Register um zwei Punkte verschoben sind.

Weiter gibt es eine neue Doku zum Modbus - anbei.

VG Timmo

Mirko_2013

Hallo zusammen,

Ich habe seit einigen Tagen das Problem das der Batterieschalter an der S10 auslöst.
Daher würde ich gern den Zustand per FHEM auslesen.

Habt Ihr eine Idee dazu, wie es gelöst werden kann?
Ein speziellen Register dafür scheint es ja nicht zu geben.

Danke und Gruß
Mirko
HP Microserver Gen8; fhem-5.8; CUL868 - V1.66; CUL868 - V1.61; CUL433 - V1.61; CUNX - V2.67; eBus Koppler USB

h002

Viele Dank für deine tolle Umsetzung. Ich habe die gleich so übernommen und wollte nur noch mal was wegen dem Register fragen. Nach der 1:1 Übernahme deiner Angaben funktioniert bei mir die Anzeige des Hausverbrauchs nicht. Mit 40070 funktioniert es, aber nicht wie bei dir mit:

attr S10E obj-h40071-poll 1
attr S10E obj-h40071-reading Hausleistung


Wie ist da der Zusammenhang mit der 16-Bit-Betrachtung?

Zitat von: hdgucken am 24 April 2020, 12:04:58
Das hat mir auch keine Ruhe gelassen, weshalb ich das Ganze genauer betrachtet habe.
Dabei ist mir aufgefallen, dass man alle Register ab 40067 mit -1 auslesen kann, wenn man sie abweichend zur E3DC Doku als 16 Bit Werte betrachtet !
Dann noch das passende unpack s> für die signed Werte gewählt und es passt alles  8)
Damit spart man sich die komplizierten Konstrukte in den User Readings  ;)
Bei den String Strömen muss man noch die Kommastelle mit "expr $val / 100" korrigieren.



attr S10E obj-h40071-poll 1
attr S10E obj-h40071-reading Hausleistung


h002

Zitat von: Mirko_2013 am 11 August 2020, 21:07:27
Ich habe seit einigen Tagen das Problem das der Batterieschalter an der S10 auslöst.
Daher würde ich gern den Zustand per FHEM auslesen.

Habt Ihr eine Idee dazu, wie es gelöst werden kann?
Ein speziellen Register dafür scheint es ja nicht zu geben.

In diesem Fall sollte ja weder die Batterie geladen noch entladen werden. Ich würde mit einem DOIF prüfen, ob der Wert für dieses Register über einen Zeitraum x auf 0 steht und dann eine Benachrichtigung senden.

hdgucken

Zitat von: h002
Viele Dank für deine tolle Umsetzung. Ich habe die gleich so übernommen und wollte nur noch mal was wegen dem Register fragen. Nach der 1:1 Übernahme deiner Angaben funktioniert bei mir die Anzeige des Hausverbrauchs nicht. Mit 40070 funktioniert es, aber nicht wie bei dir mit:

attr S10E obj-h40071-poll 1
attr S10E obj-h40071-reading Hausleistung


Das ist eigenartig, sind denn alle anderen Register dann auch "-1" oder nur das h40071 ?

Gruß Thomas

h002

Es klappt alles Ich hatte generell ein Problem mit der Modbus-Anbindung, die ich erst jetzt lösen konnte. Ich bin von deiner readingsGroup begeistert. :-)

Basti-K

Heute wurde mein S10 Installiert.
Sogleich mache ich mich ans Werk das on mit FHEM zu assimilieren.
Der Code von hdgucken
Funktioniert grundsätzlich, ich habe auch Werte bekommen aber warum disconnectet fhem nach wenigen Minuten?
Muss man ein anderes Modbus Protokoll an dem Ding wählen?


Faber38

Ich habe bei meiner E3DC auch eine ext.Quelle (3te Pannel auf der Ost Seite)
versuche ich jetzt mit
attr S10E obj-h40075-poll 1
attr S10E obj-h40075-reading extQuelle
attr S10E obj-h40075-unpack s>


dies einzubinden bekomme ich einen negativen Wert..hat mal einer einen Denkanstoss wie ich da *-1 reinbekomme so das er positiv wird ?

Faber38

Hab schon...
extQuelles { (ReadingsVal("S10", "extQuelle", "")) *-1 ;; },


Faber38

#69
an der Stelle nochmal einen Dank an die erfolgreiche Umsetzung aller beteiligten...

für interessenten hier mal meine Einstellungen...nur 1 bis 2 Änderungen zu "hdgucken"

####################################
# E3DC Anlage über Modbus auslesen
####################################
define S10E ModbusAttr 1 20 192.168.38.44:502 TCP
attr S10E alias E3/DC S10E
attr S10E devStateIcon opened:rc_WEB@32CD32  disconnected:rc_WEB@red
attr S10E event-min-interval .*:3600
attr S10E event-on-change-reading .*
attr S10E icon measure_photovoltaic_inst@yellow
attr S10E obj-h40003-len 16
attr S10E obj-h40003-poll 1
attr S10E obj-h40003-reading Hersteller
attr S10E obj-h40003-unpack a16
attr S10E obj-h40019-len 16
attr S10E obj-h40019-poll once
attr S10E obj-h40019-reading Modell
attr S10E obj-h40019-unpack a16
attr S10E obj-h40035-len 16
attr S10E obj-h40035-poll once
attr S10E obj-h40035-reading Seriennummer
attr S10E obj-h40035-unpack a16
attr S10E obj-h40051-len 16
attr S10E obj-h40051-poll once
attr S10E obj-h40051-reading Firmware
attr S10E obj-h40051-unpack a16
attr S10E obj-h40067-poll 1
attr S10E obj-h40067-reading Solarleistung
attr S10E obj-h40069-poll 1
attr S10E obj-h40069-reading Batterieleistung
attr S10E obj-h40069-unpack s>
attr S10E obj-h40071-poll 1
attr S10E obj-h40071-reading Hausleistung
attr S10E obj-h40073-poll 1
attr S10E obj-h40073-reading Netzleistung
attr S10E obj-h40073-unpack s>
attr S10E obj-h40075-poll 1
attr S10E obj-h40075-reading extQuelle
attr S10E obj-h40075-unpack s>
attr S10E obj-h40077-poll 1
attr S10E obj-h40077-reading Wallboxleistung
attr S10E obj-h40079-poll 1
attr S10E obj-h40079-reading WallboxSolarleistung
attr S10E obj-h40081-poll 1
attr S10E obj-h40081-reading Netzstatus
attr S10E obj-h40082-poll 1
attr S10E obj-h40082-reading Batterieladezustand
attr S10E obj-h40083-map 0:nicht unterstützt, 1:aktiv, 2:inaktiv, 3:nicht verfügbar, 4:MSS aus oder falsche Pos.
attr S10E obj-h40083-poll 1
attr S10E obj-h40083-reading Notstrom
attr S10E obj-h40084-poll 1
attr S10E obj-h40084-reading EMS-Status
attr S10E obj-h40087-poll 1
attr S10E obj-h40087-reading Wallboxstatus
attr S10E obj-h40095-poll 1
attr S10E obj-h40095-reading String1-Spannung
attr S10E obj-h40096-poll 1
attr S10E obj-h40096-reading String2-Spannung
attr S10E obj-h40098-expr $val / 100
attr S10E obj-h40098-poll 1
attr S10E obj-h40098-reading String1-Strom
attr S10E obj-h40099-expr $val / 100
attr S10E obj-h40099-poll 1
attr S10E obj-h40099-reading String2-Strom
attr S10E obj-h40101-poll 1
attr S10E obj-h40101-reading String1-Leistung
attr S10E obj-h40102-poll 1
attr S10E obj-h40102-reading String2-Leistung
attr S10E room Keller
attr S10E userReadings Eigenverbrauch { ReadingsVal("S10E","Netzstatus",0) & 0xFF;; },\
Autarkie { (ReadingsVal("S10E","Netzstatus",0) & 0xFF00) >> 8;; },\
Abregelung { ( ReadingsVal("S10E","EMS-Status","") & 0x10 ) == 16 ? return "aktiv" : return "inaktiv";; },\
extQuelles { (ReadingsVal("S10E", "extQuelle", "")) *-1 ;;;; },\
Solarges { (ReadingsVal("S10E", "Solarleistung", "")) + (ReadingsVal("S10E", "extQuelles", "")) ;;;; }

define E3DC readingsGroup S10E:<Batteriestatus>,Batterieladezustand \
S10E:<Solar-S/W>,Solarleistung\
S10E:<Solar-Ost>,extQuelles\
S10E:<Solar-gesammt>,Solarges\
S10E:<Hausverbrauch>,Hausleistung \
S10E:<Netzbezug>,Netzleistung \
S10E:<Batterieleistung>,Batterieleistung\
S10E:<Wallboxverbrauch>,Wallboxleistung \
S10E:<Wallbox-Sonnenstrom>,WallboxSolarleistung\
S10E:<Autarkie>,Autarkie \
S10E:<Eigenverbrauch>,Eigenverbrauch \
S10E:<Abregelung-70%>,Abregelung \
S10E:<NotStrom>,Notstrom
attr E3DC group E3DC
attr E3DC room Keller
attr E3DC valueFormat { Batterieladezustand => "%d %%", \
Hausleistung => "%d Watt", \
Solarleistung => "%d Watt",\
extQuelles => "%d Watt",  \
Solarges => "%d Watt", \
Netzleistung => "%d Watt", \
Batterieleistung => "%d Watt", \
Wallboxleistung => "%d Watt", \
WallboxSolarleistung => "%d Watt", \
Autarkie => "%d %%", \
Eigenverbrauch => "%d %%" }
attr E3DC valueStyle { if($READING eq "Batterieladezustand" && $VALUE > 85) { 'style="color:limegreen;;text-align:right"'}\
  elsif($READING eq "Batterieladezustand" && $VALUE > 60) { 'style="color:forestgreen;;text-align:right"'}\
  elsif($READING eq "Batterieladezustand" && $VALUE  > 35) { 'style="color:yellow;;text-align:right"'}\
  elsif($READING eq "Batterieladezustand" && $VALUE  > 19) { 'style="color:orange;;text-align:right"'}\
  elsif($READING eq "Batterieladezustand" && $VALUE  < 20 ) { 'style="color:red;;text-align:right"'}\
  elsif($READING eq "Hausleistung" && $VALUE > 3000){ 'style="color:red;;text-align:right"'}\
  elsif($READING eq "Hausleistung" && $VALUE > 1500){ 'style="color:tomato;;text-align:right"'}\
  elsif($READING eq "Hausleistung" && $VALUE > 500) { 'style="color:orange;;text-align:right"'}\
  elsif($READING eq "Hausleistung" && $VALUE >= 0) { 'style="color:limegreen;;text-align:right"'}\
  elsif($READING eq "Solarleistung" && $VALUE > 0){ 'style="color:yellow;;text-align:right"'}\
  elsif($READING eq "Solarleistung" && $VALUE == 0){ 'style="color:gray;;text-align:right"'}\
  elsif($READING eq "extQuelles" && $VALUE > 0){ 'style="color:yellow;;text-align:right"'}\
  elsif($READING eq "extQuelles" && $VALUE == 0){ 'style="color:gray;;text-align:right"'}\
  elsif($READING eq "Solarges" && $VALUE > 0){ 'style="color:yellow;;text-align:right"'}\
  elsif($READING eq "Solarges" && $VALUE == 0){ 'style="color:gray;;text-align:right"'}\
  elsif($READING eq "Netzleistung" && $VALUE < 0){ 'style="color:limegreen;;text-align:right"'}\
  elsif($READING eq "Netzleistung" && $VALUE > 0){ 'style="color:red;;text-align:right"'}\
  elsif($READING eq "Netzleistung" && $VALUE == 0){ 'style="color:gray;;text-align:right"'}\
  elsif($READING eq "Batterieleistung" && $VALUE > 0){ 'style="color:yellow;;text-align:right"'}\
  elsif($READING eq "Batterieleistung" && $VALUE == 0){ 'style="color:gray;;text-align:right"'}\
  elsif($READING eq "Batterieleistung" && $VALUE < 0){ 'style="color:limegreen;;text-align:right"'}\
  elsif($READING eq "Notstrom" && $VALUE eq "inaktiv") { 'style="color:gray;;text-align:right"'}\
  elsif($READING eq "Notstrom" && $VALUE eq "aktiv") { 'style="color:lime;;text-align:right"'}\
  elsif($READING eq "Notstrom" && $VALUE eq "nicht verfügbar") { 'style="color:orange;;text-align:right"'}\
  elsif($READING eq "Notstrom" && $VALUE eq "unbekannt") { 'style="color:red;;text-align:right"'}\
  elsif($READING eq "Wallboxleistung" && $VALUE == 0) { 'style="color:gray;;text-align:right"'}\
  elsif($READING eq "Wallboxleistung" && $VALUE > 0) { 'style="color:limegreen;;text-align:right"'}\
  elsif($READING eq "WallboxSolarleistung" && $VALUE == 0) { 'style="color:gray;;text-align:right"'}\
  elsif($READING eq "WallboxSolarleistung" && $VALUE > 0) { 'style="color:yellow;;text-align:right"'}\
  elsif($READING eq "Abregelung" && $VALUE eq "inaktiv") { 'style="color:gray;;text-align:right"'}\
  elsif($READING eq "Abregelung" && $VALUE eq "aktiv") { 'style="color:red;;text-align:right"'}\
  elsif($READING eq "Autarkie" && $VALUE == 0) { 'style="color:gray;;text-align:right"'}\
  elsif($READING eq "Autarkie" && $VALUE > 0)  { 'style="color:limegreen;;text-align:right"'}\
  elsif($READING eq "Eigenverbrauch" && $VALUE == 0) { 'style="color:gray;;text-align:right"'}\
  elsif($READING eq "Eigenverbrauch" && $VALUE > 0)  { 'style="color:limegreen;;text-align:right"'} }

############
# plot
############
define FileLog_S10E FileLog ./log/S10E-%Y.log S10E
attr FileLog_S10E logtype S10E_battwatt04battsoc6:Akku/Batterie,text
attr FileLog_S10E room Sensoren->Filelog
attr FileLog_S10E sortby 01
define SVG_S10Ea SVG FileLog_S10E:SVG_S10Ea:CURRENT
attr SVG_S10Ea room Plots
attr SVG_S10Ea sortby 02
attr SVG_S10Ea title "E3DC Batterie Status Min $data{min1}, Max $data{max1}, Last $data{currval1}"
define SVG_S10Eb SVG FileLog_S10E:SVG_S10Eb:CURRENT
attr SVG_S10Eb room Plots
attr SVG_S10Eb sortby 03
attr SVG_S10Eb title "E3DC Batterie Status Min $data{min1}, Max $data{max1}, Last $data{currval1}"


ich hab eine eigene Datei Erstellt und binde die mit 
include /opt/fhem/FHEM/e3dc.cfg
in der fhem.cfg ein

Basti-K

Das Modbus Problem ist gelöst. scheinbei mag das Ethernet kein Fullduplex.
Das erinnert mich an das Kako Interface was wir auf der Arbeit haben...

Eine Frage in die Runde.
Kann/sollte man die Entscheidung wann die Wallbox Laden soll um die beste Eigenstrom Ausbeute zu haben der S10 überlassen, oder besser über fhem realisieren?
Ich habe einen GoE-Charger.
Wie würdet ihr das Problem lösen:
Sollte kann man die Ladewere über FHEM > modbus an die S10 schicken und bekommt man das ,,laden" Kommando aus der S10?
Oder alles über Doif regeln?

Init

Zitat von: Faber38 am 31 Januar 2021, 10:16:29
an der Stelle nochmal einen Dank an die erfolgreiche Umsetzung aller beteiligten...

für interessenten hier mal meine Einstellungen...nur 1 bis 2 Änderungen zu "hdgucken"

####################################
# E3DC Anlage über Modbus auslesen
####################################
define S10E ModbusAttr 1 20 192.168.38.44:502 TCP
attr S10E alias E3/DC S10E
attr S10E devStateIcon opened:rc_WEB@32CD32  disconnected:rc_WEB@red
attr S10E event-min-interval .*:3600
attr S10E event-on-change-reading .*
attr S10E icon measure_photovoltaic_inst@yellow
attr S10E obj-h40003-len 16
attr S10E obj-h40003-poll 1
attr S10E obj-h40003-reading Hersteller
attr S10E obj-h40003-unpack a16
attr S10E obj-h40019-len 16
attr S10E obj-h40019-poll once
attr S10E obj-h40019-reading Modell
attr S10E obj-h40019-unpack a16
attr S10E obj-h40035-len 16
attr S10E obj-h40035-poll once
attr S10E obj-h40035-reading Seriennummer
attr S10E obj-h40035-unpack a16
attr S10E obj-h40051-len 16
attr S10E obj-h40051-poll once
attr S10E obj-h40051-reading Firmware
attr S10E obj-h40051-unpack a16
attr S10E obj-h40067-poll 1
attr S10E obj-h40067-reading Solarleistung
attr S10E obj-h40069-poll 1
attr S10E obj-h40069-reading Batterieleistung
attr S10E obj-h40069-unpack s>
attr S10E obj-h40071-poll 1
attr S10E obj-h40071-reading Hausleistung
attr S10E obj-h40073-poll 1
attr S10E obj-h40073-reading Netzleistung
attr S10E obj-h40073-unpack s>
attr S10E obj-h40075-poll 1
attr S10E obj-h40075-reading extQuelle
attr S10E obj-h40075-unpack s>
attr S10E obj-h40077-poll 1
attr S10E obj-h40077-reading Wallboxleistung
attr S10E obj-h40079-poll 1
attr S10E obj-h40079-reading WallboxSolarleistung
attr S10E obj-h40081-poll 1
attr S10E obj-h40081-reading Netzstatus
attr S10E obj-h40082-poll 1
attr S10E obj-h40082-reading Batterieladezustand
attr S10E obj-h40083-map 0:nicht unterstützt, 1:aktiv, 2:inaktiv, 3:nicht verfügbar, 4:MSS aus oder falsche Pos.
attr S10E obj-h40083-poll 1
attr S10E obj-h40083-reading Notstrom
attr S10E obj-h40084-poll 1
attr S10E obj-h40084-reading EMS-Status
attr S10E obj-h40087-poll 1
attr S10E obj-h40087-reading Wallboxstatus
attr S10E obj-h40095-poll 1
attr S10E obj-h40095-reading String1-Spannung
attr S10E obj-h40096-poll 1
attr S10E obj-h40096-reading String2-Spannung
attr S10E obj-h40098-expr $val / 100
attr S10E obj-h40098-poll 1
attr S10E obj-h40098-reading String1-Strom
attr S10E obj-h40099-expr $val / 100
attr S10E obj-h40099-poll 1
attr S10E obj-h40099-reading String2-Strom
attr S10E obj-h40101-poll 1
attr S10E obj-h40101-reading String1-Leistung
attr S10E obj-h40102-poll 1
attr S10E obj-h40102-reading String2-Leistung
attr S10E room Keller
attr S10E userReadings Eigenverbrauch { ReadingsVal("S10E","Netzstatus",0) & 0xFF;; },\
Autarkie { (ReadingsVal("S10E","Netzstatus",0) & 0xFF00) >> 8;; },\
Abregelung { ( ReadingsVal("S10E","EMS-Status","") & 0x10 ) == 16 ? return "aktiv" : return "inaktiv";; },\
extQuelles { (ReadingsVal("S10E", "extQuelle", "")) *-1 ;;;; },\
Solarges { (ReadingsVal("S10E", "Solarleistung", "")) + (ReadingsVal("S10E", "extQuelles", "")) ;;;; }

define E3DC readingsGroup S10E:<Batteriestatus>,Batterieladezustand \
S10E:<Solar-S/W>,Solarleistung\
S10E:<Solar-Ost>,extQuelles\
S10E:<Solar-gesammt>,Solarges\
S10E:<Hausverbrauch>,Hausleistung \
S10E:<Netzbezug>,Netzleistung \
S10E:<Batterieleistung>,Batterieleistung\
S10E:<Wallboxverbrauch>,Wallboxleistung \
S10E:<Wallbox-Sonnenstrom>,WallboxSolarleistung\
S10E:<Autarkie>,Autarkie \
S10E:<Eigenverbrauch>,Eigenverbrauch \
S10E:<Abregelung-70%>,Abregelung \
S10E:<NotStrom>,Notstrom
attr E3DC group E3DC
attr E3DC room Keller
attr E3DC valueFormat { Batterieladezustand => "%d %%", \
Hausleistung => "%d Watt", \
Solarleistung => "%d Watt",\
extQuelles => "%d Watt",  \
Solarges => "%d Watt", \
Netzleistung => "%d Watt", \
Batterieleistung => "%d Watt", \
Wallboxleistung => "%d Watt", \
WallboxSolarleistung => "%d Watt", \
Autarkie => "%d %%", \
Eigenverbrauch => "%d %%" }
attr E3DC valueStyle { if($READING eq "Batterieladezustand" && $VALUE > 85) { 'style="color:limegreen;;text-align:right"'}\
  elsif($READING eq "Batterieladezustand" && $VALUE > 60) { 'style="color:forestgreen;;text-align:right"'}\
  elsif($READING eq "Batterieladezustand" && $VALUE  > 35) { 'style="color:yellow;;text-align:right"'}\
  elsif($READING eq "Batterieladezustand" && $VALUE  > 19) { 'style="color:orange;;text-align:right"'}\
  elsif($READING eq "Batterieladezustand" && $VALUE  < 20 ) { 'style="color:red;;text-align:right"'}\
  elsif($READING eq "Hausleistung" && $VALUE > 3000){ 'style="color:red;;text-align:right"'}\
  elsif($READING eq "Hausleistung" && $VALUE > 1500){ 'style="color:tomato;;text-align:right"'}\
  elsif($READING eq "Hausleistung" && $VALUE > 500) { 'style="color:orange;;text-align:right"'}\
  elsif($READING eq "Hausleistung" && $VALUE >= 0) { 'style="color:limegreen;;text-align:right"'}\
  elsif($READING eq "Solarleistung" && $VALUE > 0){ 'style="color:yellow;;text-align:right"'}\
  elsif($READING eq "Solarleistung" && $VALUE == 0){ 'style="color:gray;;text-align:right"'}\
  elsif($READING eq "extQuelles" && $VALUE > 0){ 'style="color:yellow;;text-align:right"'}\
  elsif($READING eq "extQuelles" && $VALUE == 0){ 'style="color:gray;;text-align:right"'}\
  elsif($READING eq "Solarges" && $VALUE > 0){ 'style="color:yellow;;text-align:right"'}\
  elsif($READING eq "Solarges" && $VALUE == 0){ 'style="color:gray;;text-align:right"'}\
  elsif($READING eq "Netzleistung" && $VALUE < 0){ 'style="color:limegreen;;text-align:right"'}\
  elsif($READING eq "Netzleistung" && $VALUE > 0){ 'style="color:red;;text-align:right"'}\
  elsif($READING eq "Netzleistung" && $VALUE == 0){ 'style="color:gray;;text-align:right"'}\
  elsif($READING eq "Batterieleistung" && $VALUE > 0){ 'style="color:yellow;;text-align:right"'}\
  elsif($READING eq "Batterieleistung" && $VALUE == 0){ 'style="color:gray;;text-align:right"'}\
  elsif($READING eq "Batterieleistung" && $VALUE < 0){ 'style="color:limegreen;;text-align:right"'}\
  elsif($READING eq "Notstrom" && $VALUE eq "inaktiv") { 'style="color:gray;;text-align:right"'}\
  elsif($READING eq "Notstrom" && $VALUE eq "aktiv") { 'style="color:lime;;text-align:right"'}\
  elsif($READING eq "Notstrom" && $VALUE eq "nicht verfügbar") { 'style="color:orange;;text-align:right"'}\
  elsif($READING eq "Notstrom" && $VALUE eq "unbekannt") { 'style="color:red;;text-align:right"'}\
  elsif($READING eq "Wallboxleistung" && $VALUE == 0) { 'style="color:gray;;text-align:right"'}\
  elsif($READING eq "Wallboxleistung" && $VALUE > 0) { 'style="color:limegreen;;text-align:right"'}\
  elsif($READING eq "WallboxSolarleistung" && $VALUE == 0) { 'style="color:gray;;text-align:right"'}\
  elsif($READING eq "WallboxSolarleistung" && $VALUE > 0) { 'style="color:yellow;;text-align:right"'}\
  elsif($READING eq "Abregelung" && $VALUE eq "inaktiv") { 'style="color:gray;;text-align:right"'}\
  elsif($READING eq "Abregelung" && $VALUE eq "aktiv") { 'style="color:red;;text-align:right"'}\
  elsif($READING eq "Autarkie" && $VALUE == 0) { 'style="color:gray;;text-align:right"'}\
  elsif($READING eq "Autarkie" && $VALUE > 0)  { 'style="color:limegreen;;text-align:right"'}\
  elsif($READING eq "Eigenverbrauch" && $VALUE == 0) { 'style="color:gray;;text-align:right"'}\
  elsif($READING eq "Eigenverbrauch" && $VALUE > 0)  { 'style="color:limegreen;;text-align:right"'} }

############
# plot
############
define FileLog_S10E FileLog ./log/S10E-%Y.log S10E
attr FileLog_S10E logtype S10E_battwatt04battsoc6:Akku/Batterie,text
attr FileLog_S10E room Sensoren->Filelog
attr FileLog_S10E sortby 01
define SVG_S10Ea SVG FileLog_S10E:SVG_S10Ea:CURRENT
attr SVG_S10Ea room Plots
attr SVG_S10Ea sortby 02
attr SVG_S10Ea title "E3DC Batterie Status Min $data{min1}, Max $data{max1}, Last $data{currval1}"
define SVG_S10Eb SVG FileLog_S10E:SVG_S10Eb:CURRENT
attr SVG_S10Eb room Plots
attr SVG_S10Eb sortby 03
attr SVG_S10Eb title "E3DC Batterie Status Min $data{min1}, Max $data{max1}, Last $data{currval1}"


ich hab eine eigene Datei Erstellt und binde die mit 
include /opt/fhem/FHEM/e3dc.cfg
in der fhem.cfg ein

Hallo Faber,

vielen Dank für deine Definition! Ich habe auch seit dem 01.04.2021 eine PV-Anlage mit E3DC-Speicher. Die Wallbox kommt erst nächste Woche.

Wir haben 3 Strings im Einsatz und ich würde gerne alle 3 separat auslesen und die Leistung vergleichen.

Auf welcher Basis hast du die Register angegeben?

Ich habe hier die die Version "ModBus_E3DC_Speichersysteme_V1.70_2020-06-18.pdf" gefunden, aber da ist 40101 = "DC-Strom an String 3 in Ampere (Faktor 0.01) (wird nicht verwendet)" und du verwendest 40101 als "attr S10E obj-h40101-reading String1-Leistung"

Viele Grüße
Marc

Faber38

Wenn du mal schaust..sind die immer um 1 verschoben..

Daher ist 40088 Wallbox in der Definition 40087
oder 40102 = 40101 sowie 40102 = 40101

ich lese also nur 2 Strings aus ..habe aber 3 Tracker
Tracker 1+2 laufen bei mir String  1  WEST und SÜD seite
Tracker 3 läuft alleine auf String 2 OST seite

Init

Danke für die Aufklärung hätte ich ja auch selbst draufkommen können.

Laut Installateur haben wir 3 Strings belegt, aber angeblich kann ich die nicht separat auswerten. Auswerten lassen sich angeblich nur die 2 Tracker. Jetzt ist in der Doku nur die Rede von Strings und nicht von Trackern. Wie hängen denn die Tracker und die Strings zusammen? Vielleicht ein bisschen OT, aber ich wäre dankbar für jede Aufklärung.

Faber38

Ich vermute das 1 String ein Gleichrichter ist..
Ich hab 2 Gleichrichter...und 2 String aber 3 Tracker...

sig10680

Zitat von: daelch am 19 März 2020, 16:14:36
Hallo,

im e3dc Portal bekomme die bisher produzierte Gesamtmenge des Tages angezeigt. Kann ich diesen Wert aus einem Register auslesen?

Viele Grüße

Hallo,
hat einer von euch das schon hinbekommen die Gesamtmenge des Tages zu berechnen oder aus der Anlage auszulesen? Bei meinen Versuchen komme ich irgendwie nicht weiter!

Danke Sig10680

pcbastler

Lt. Doku gibt das Modbus nicht her, mit RSCP hab ich mich noch nicht beshäftigt.
Aber mit dblog sollte das klappen:
select value from history where DEVICE = 'S10E' AND READING='sunwatt'[code]
gefiltert über timestamp und aufsummiert entsprechend des Ausleseintervalls

sig10680

Zitat von: pcbastler am 04 Mai 2021, 19:34:07
Lt. Doku gibt das Modbus nicht her, mit RSCP hab ich mich noch nicht beshäftigt.
Aber mit dblog sollte das klappen:
select value from history where DEVICE = 'S10E' AND READING='sunwatt'[code]
gefiltert über timestamp und aufsummiert entsprechend des Ausleseintervalls


Hallo,

danke dir für die Antwort. Da ich mich mit dblog nicht richtig auskenne werde ich versuchen das anderweitig zu berechnen.

mfg Tobias

hellijo

Hallo Zusammen,

hat hier jemand schon einmal die Spannungen der einzelnen Stränge überwacht oder ein .plot dazu erstellt?

VG Jörg

baeda

Zitat von: blofield am 11 März 2020, 16:56:45
Moin @marcus42,

ich möchte gerne dein e3dcset in Verbindung mit S10 und go-eCharger verwenden. Ich habe am S10 das RSCP-Passwort gesetzt und das Programm compiliert. Die Parameter in e3dcset.config mehrfach kontrolliert, aber leider bekomme ich immer nur "Connection closed by peer" zurück, was offenbar auf ein Netzwerk-Problem deutet.
Mit NMAP sehe ich aber vom FHEM Host aus, dass der Port 5033 offen ist, das Passwort ist auch richtig :-/

Ich habe am S10 auch das local.user RSCP-Passwort gesetzt und es mal mit dem User "local.user" versucht. Gelingt aber alles nicht. Immer die gleiche Fehlermeldung :(

Hast Du noch einen Tipp?

Danke,
blofield

Ich möchte mich gerne begl. RSCP anschliessen, da ich auf das selbe Problem gestossen bin:

- An der E3DC habe ich das RSCP Passwort (und das für local.user) auf eine 6-stellige Zahl gesetzt (um Probleme mit Sonderzeichen etc. auszuschliessen).
- Ich habe die e3dcset.config editiert
- mit make kompiliert

Ausführen von  "./e3dcset -c 2400 -d 1" auf fhem:

----------------------------------------------------------
Gelesene Parameter aus Konfigurationsdatei e3dcset.config:
MIN_LEISTUNG=1
MAX_LEISTUNG=3000
MIN_LADUNGSMENGE=0
MAX_LADUNGSMENGE=8000
server_ip=1.2.3.4
server_port=5033
e3dc_user=email@irgendwo.com
e3dc_password=password
aes_password=987654
----------------------------------------------------------
Connecting to server 1.2.3.4:5033
Connected successfully
Request authentication
Connection closed by peer
Ende!


Ein Test vom meinem Notebook schlug ebenfalls fehl.
Diesmal mit dem Fehler:

Connecting to server 1.2.3.4:5033
Connected successfully
Speicherzugriffsfehler (Speicherabzug geschrieben)


Alle 3 Geräte (Notebook, fhem, E3DC) sind im selben Subnetz, die E3DC lässt Verbindungen  auf Port 5033 zu.

Ich bin grad ratlos, wie man den Fehler weiter eingrenzen könnte....






Basti-K

Kann man über Modbus das manuelle Speicher laden steuern?
über das Webinterface kann man nur 3kw/w ziehen (besser als nix), aber vielleicht geht über modbus mehr wenn man den Wert selber vorgeben kann.
Mir fallen 2 Anwendungsfalle ein:
Koppelung an Unwetterwarnungen.
Im Winter automatisch noch mal den Speicher vollladen, wenn eine akute Warnsituation besteht. Haben ist besser als brauchen.
Wenn man einen Strom Lieferanten hat der dynamische Tarife bietet (tibber oder awatar): #
Den Speicher dann vollladen wenn der Strom billig ist, also Nachts.

bennifri

#81
Hallo zusammen,

ich bin neu hier im Forum und möchte mich erstmal für die super Anleitung zur Einbindung des S10 unter
https://forum.fhem.de/index.php?topic=109735.0 bedanken!
Ich hatte auch das Gefühl, dass die Register verdreht sind sind. Meiner Meinung nach funktioniert das -unpack nicht, wie man denkt.
Nachdem ich mich an der Beispiel-Konfiguration etwas langgehangelt habe und mich mit unpack-Codes rumgeschlagen habe (dank dazu auch für die Erklärung zu pack() und unpack hier:
https://stackoverflow.com/questions/40998796/how-to-convert-2-unsigned-16bit-integers-into-a-signed-32bit-integer-in-perl) möchte ich gerne eine knappere Version zum Berechnen der 32bit-Signed-Int-Werte anbieten (Bezug nehmend auf die ursprüngliche Anleitung):

define S10 ModbusAttr 1 5 192.168.1.244:502 TCP
attr S10 userattr devStateIcon event-min-interval event-on-change-reading icon 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 room PV
attr S10 DbLogExclude state
attr S10 dev-h-allowShortResponses 1
attr S10 dev-h-combine 200
attr S10 dev-h-defPoll 1
attr S10 dev-timing-commDelay 1

attr S10 obj-h40067-len 1
attr S10 obj-h40067-reading sunwatt0
attr S10 obj-h40067-unpack n
attr S10 obj-h40068-len 1
attr S10 obj-h40068-reading sunwatt1
attr S10 obj-h40068-unpack n


attr S10 obj-h40069-len 1
attr S10 obj-h40069-reading battwatt0
attr S10 obj-h40069-unpack n
attr S10 obj-h40070-len 1
attr S10 obj-h40070-reading battwatt1
attr S10 obj-h40070-unpack n


attr S10 obj-h40071-len 1
attr S10 obj-h40071-reading homewatt0
attr S10 obj-h40071-unpack n
attr S10 obj-h40072-len 1
attr S10 obj-h40072-reading homewatt1
attr S10 obj-h40072-unpack n


attr S10 obj-h40073-len 1
attr S10 obj-h40073-reading gridwatt0
attr S10 obj-h40073-unpack n
attr S10 obj-h40074-len 1
attr S10 obj-h40074-reading gridwatt1
attr S10 obj-h40074-unpack n

attr S10 obj-h40082-len 1 
attr S10 obj-h40082-reading battsoc
attr S10 obj-h40082-unpack n

attr S10 obj-h40083-len 1
attr S10 obj-h40083-reading emps
attr S10 obj-h40083-unpack n 

attr S10 obj-h40084-len 1
attr S10 obj-h40084-reading ems_status
attr S10 obj-h40084-unpack n
attr S10 userReadings homewatt {my $high = ReadingsVal("S10", "sunwatt1", 0);; my $low = ReadingsVal("S10", "sunwatt0", 0);; return unpack('l>', pack('nn', $high, $low));; },\
sunwatt {my $high = ReadingsVal("S10", "sunwatt1", 0);; my $low = ReadingsVal("S10", "sunwatt0", 0);; return unpack('l>', pack('nn', $high, $low));; },\
battwatt {my $high = ReadingsVal("S10", "battwatt1", 0);; my $low = ReadingsVal("S10", "battwatt0", 0);; return unpack('l>', pack('nn', $high, $low));; },\
homewatt {my $high = ReadingsVal("S10", "homewatt1", 0);; my $low = ReadingsVal("S10", "homewatt0", 0);; return unpack('l>', pack('nn', $high, $low));; },\
gridwatt {my $high = ReadingsVal("S10", "gridwatt1", 0);; my $low = ReadingsVal("S10", "gridwatt0", 0);; return unpack('l>', pack('nn', $high, $low));; }                                                                                                                                                                               

Vielleicht kann das jemand noch eleganter machen.

Grüße

Benni

Dirk070

Zitat von: sig10680 am 05 Mai 2021, 07:01:16
Hallo,

danke dir für die Antwort. Da ich mich mit dblog nicht richtig auskenne werde ich versuchen das anderweitig zu berechnen.

mfg Tobias

Hi Tobias,

warst Du erfolgreich? Der Wert würde mich auch für die Plots interessieren.

Danke und schöne Grüße
Dirk

sig10680

Zitat von: Dirk070 am 19 Juni 2022, 20:52:00
Hi Tobias,

warst Du erfolgreich? Der Wert würde mich auch für die Plots interessieren.

Danke und schöne Grüße
Dirk

Hallo,

nein habe mangels Zeit nicht auf dblog umgestellt.

mfg Tobias

Dirk070


blofield

Zitat von: Basti-K am 05 November 2021, 13:07:34
Kann man über Modbus das manuelle Speicher laden steuern?

Meines Wissens nach nur über RSCP z.B. mit e3dcset. s.o.
Das läuft bei mir zuverlässig.

blofield

Zitat von: baeda am 03 November 2021, 21:24:32
Ich möchte mich gerne begl. RSCP anschliessen, da ich auf das selbe Problem gestossen bin:
- mit make kompiliert
Ein Test vom meinem Notebook schlug ebenfalls fehl.
Diesmal mit dem Fehler:

Connecting to server 1.2.3.4:5033
Connected successfully
Speicherzugriffsfehler (Speicherabzug geschrieben)


Das Problem habe ich auch. Man kann es auf einem X86 System compilieren, aber es segfaultet immer.
Ich habe dann einen Workaround verwendet, weil es auf einem Raspberry Pi compiliert und funktioniert!
S. Issue auf Github https://github.com/mschlappa/e3dcset/issues/1