Neues Modul für Geräte mit Modbus Schnittstelle über RS232 bzw. RS485

Begonnen von StefanStrobel, 12 Juli 2014, 14:50:22

Vorheriges Thema - Nächstes Thema

pejonp

Hallo eszych,

Was wird denn nicht richtig angezeigt? Im Portal werden die Werte nur im 15min abstand angezeigt.
Am besten du vergleichst mit der Anzeige am WR.

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

eszych

Hallo PEJONP,

das die Werte aus dem Portal nicht mit den aktuellen Werten aus dem WR zusammen passen, sondern etwas zeitverzögert sind dachte ich mir schon. Ich habe noch einen Fehler in meinen Notify Definitionen gefunden und jetzt werden zumindest die Werte des 3 phasigen WR korrekt angezeigt... Hier noch einmal die DEF aus einem der Notifiy:

PWP3:PWP3_I_AC_Strom_A.* {
   use Math::Round qw/nearest/ ;;
   my $a = ReadingsVal("PWP3","PWP3_I_AC_Strom_A",0) ;;
   my $a1 = ReadingsVal("PWP3","PWP3_I_AC_StromL1_A",0) ;;
   my $a2 = ReadingsVal("PWP3","PWP3_I_AC_StromL2_A",0) ;;
   my $a3 = ReadingsVal("PWP3","PWP3_I_AC_StromL3_A",0) ;;
   my $b = ReadingsVal("PWP3","PWP3_I_AC_Strom_SF",0) ;;
   my $beginn = 65536 ;;
   my $vv = $beginn - $b ;;
   if ($vv==6) {
       $vv=1000000;
   } elsif ($vv == 5) {
       $vv=100000;
   } elsif ($vv == 4) {
       $vv=10000;
   } elsif ($vv == 3) {
       $vv=1000;
   } elsif ($vv == 2) {
       $vv=100;
   } elsif ($vv == 1 ) {
       $vv=10;
   } else {
       $vv=1;
   }
   my $suma = nearest(0.001, $a/$vv) ;;
   my $text = "$suma" ;;
   fhem("set D_PWP3_I_AC_Strom_A $text") ;;
   my $suma1 = nearest(0.001, $a1/$vv) ;;
   $text = "$suma1" ;;
   fhem("set D_PWP3_I_AC_StromL1_A $text") ;;
   my $suma2 = nearest(0.001, $a2/$vv) ;;
   $text = "$suma2" ;;
   fhem("set D_PWP3_I_AC_StromL2_A $text") ;;
   my $suma3 = nearest(0.001, $a3/$vv) ;;
   $text = "$suma3" ;;
   fhem("set D_PWP3_I_AC_StromL3_A $text") ;;
}


Die Werte des 1P WR sind aber völlig daneben. Das hängt aber sicher damit zusammen, dass der 1P WR für das Laden und Entladen der Batterie zuständig ist, er also entweder Strom erzeugt, oder Strom verbraucht. Ich habe zwischenzeitlich Werte von 62.536 bei PWP1_I_AC_Leistung_W.
Ich denke da werde ich mal bei SolarEdge nachfragen, ob es einen Wert gibt, der Anzeigt ob geladen oder entladen wird...

Andere Frage:
Ich meine mal einen Thread gefunden zu haben, in dem auch die Monitoring API von SolarEdge mit HTTPMod angezapft wird - aber ich finde den Thread nicht mehr, meine mich aber zu erinnern, dass Du (?) auch dort ein Konfig-Beispiel gegeben hattest...?
Raspberry Pi 2 - FHEM 5.7
HM-LAN, HM-CFG-USB-2
HM-Sec-SCo, HM-Sec-SC-2, HM-TC-IT-WM-W-EU,
HM-LC-SW4-DR, HM-LC-Sw1-DR, HM-ES-PMSw1-DR,    
HM-ES-PMSw1-Pl - Rademacher Hompilot DuoFern

pejonp

Hallo eszych,

du meinst bestimmt diesen Beitrag (https://forum.fhem.de/index.php/topic,54619.msg462453.html#msg462453). Über die RS485 Schnittstelle habe ich alle Werte bekommen.

z.Z. geht diese aber nicht, da am WR ein Protokoll fehlt, es geht nur Master/Slave. Ich warte noch auf ein SW-Update, damit soll ja dann auch ModBus über TCPIP gehen. Damit entfällt die RS485-Schnittstelle (siehe Dok).

Die Daten meiner einzelnen Solarmodule lese ich jetzt, über das Auswerten der Daten die zum Portal gesendet werden, aus. Mit dem Modul von jbuehl (https://github.com/jbuehl/solaredge) habe ich es hinbekommen. z.Z. werden die Daten noch in eine Datei geschrieben. Zukünftig sollen diese in eine MySQL DB geschrieben werden und dann ausgewertet/dargestellt  werden (https://forum.fhem.de/index.php/topic,53584.msg486497.html#msg486497).

Damit ist keine API-Schnittstelle zum Portal notwendig. Um die API_Schnittstelle zu nutzen benötigt man einen Key und mehr Rechte, diese müssen bei SolarEdge beantragt werden. Damit entfällt für den PV-Errichter der Zugang auf meine Daten im SolarEdge-Portal. Bei Fehlern müßte ich mich dann direkt mit SolarEdge in Verbindung setzten.


zwischenzeitlich Werte von 62.536 bei PWP1_I_AC_Leistung_W.


Schau doch einmal in die Anlage, dort stehen doch auch Register für den Export und Import und vergleiche einmal die Firmware. Vielleicht hat sich da etwas geändert.
Oder es gibt einen anderen Wert für negative Werte I_AC_Leistung_SF <= 62555. positive Werte  I_AC_Leistung_SF = 65536

In der Nacht wird der Wert für Strom "I_DC_Strom_A" bei mir auch sehr groß, ist aber noch ein Fehler in der Auswertung, da sich der Faktor ändert. Müßte noch abgefangen werden. Ist mir jetzt aufgefallen. Tritt aber nur im Nachtmodus auf.

2016-08-08_05:46:19 PWP I_DC_Strom_A: 65535
2016-08-08_05:46:19 PWP I_DC_Strom_SF: 32768
2016-08-08_05:46:19 PWP I_DC_Spannung_V: 0
2016-08-08_05:46:19 PWP I_DC_Spannung_SF: 0
2016-08-08_05:46:19 I_DC_Leistung_W 0
2016-08-08_05:46:19 PWP I_DC_Leistung_W: 0
2016-08-08_05:46:19 PWP I_DC_Leistung_SF: 0
2016-08-08_05:46:19 PWP Temp_Kuehler_C: 0
2016-08-08_05:46:19 PWP C_Status: Nachtmodus


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

eszych

Hallo pejonp,

danke für die ausführliche Antwort! Ich habe den Wert für I_AC_Leistung_SF mal bei verschiedenen Situationen (Batterie lädt, Batterie ist geladen, Batterie erzeugt Strom) angeschaut - und der Wert ändert sich tatsächlich...
In der Doku von SolarEdge steht nichts zu den möglichen Werten - leider...

Werte für I_AC_Leistung_SF ist bei Batterie Lädt = 65535 - die anderen Werte reiche ich noch nach, wenn ich ganz sicher bin...
(Ich werde die Definitionen für die Notifies dann entsprechend anpassen und hier wieder posten.)

In dem von Dir angehängten Dokument werden auch Adressen für StromMeter von SolarEdge angegeben. Ich gebe zu ich habe mich mit dem Modul "ModbusAttr" noch nicht so genau auseinander gesetzt - ich nehme aber an, dass ich über die Einträge in "userattr" die Liste der abzufragenden Werte erweitern kann und dann diese dann entsprechend als eigenständige Attribute definieren muss.
Also analog zu
userattr [...] obj-h84-expr obj-h84-reading
für Adresse "40085" mit Länge "1" und Bezeichnung "I_AC_Power_SF" im Format "int16" der den Wert für "AC Power scale factor" liefert
dann zusätzlich
userattr [...] obj-h209-expr obj-h209-reading
für Adresse "40210" mit Länge "1" und Bezeichnung "M_AC_Power_SF" im Format "int16" der den Wert für "SF AC Real Power Scale Factor" liefert
???
Warum eigentlich immer "-1" für die Adresse?

Wie immer freue ich mich auf eure Kommentare!
Raspberry Pi 2 - FHEM 5.7
HM-LAN, HM-CFG-USB-2
HM-Sec-SCo, HM-Sec-SC-2, HM-TC-IT-WM-W-EU,
HM-LC-SW4-DR, HM-LC-Sw1-DR, HM-ES-PMSw1-DR,    
HM-ES-PMSw1-Pl - Rademacher Hompilot DuoFern

eszych

Batterie ist voll geladen, dann bekomme ich folgenden Wert für I_AC_Leistung_SF
PWP1_I_AC_Leistung_SF = 65533

Was ich komisch finde ist, dass bei den Werten für z.B.
40188 1 C_SunSpec_DID uint16 N/A Well-known value. Uniquely identifies this as a
SunSpecMODBUS Map:
Single Phase (AN or AB) Meter (201)
Split Single Phase (ABN) Meter (202)
Wye-Connect Three Phase (ABCN) Meter (203)
Delta-Connect Three Phase (ABC) Meter(204)

im FHEM / ModbusAttr muss ich folgende Definition machen um den richtigen Wert (in meinem Fall 203) zu bekommen:

obj-h188-expr          $val
obj-h188-reading      PWP1_M1_C_SunSpec_DID


Also in dem Fall nicht Adresse -1...???

Raspberry Pi 2 - FHEM 5.7
HM-LAN, HM-CFG-USB-2
HM-Sec-SCo, HM-Sec-SC-2, HM-TC-IT-WM-W-EU,
HM-LC-SW4-DR, HM-LC-Sw1-DR, HM-ES-PMSw1-DR,    
HM-ES-PMSw1-Pl - Rademacher Hompilot DuoFern

StefanStrobel

Hallo,

Die userattr Liste kann man weglassen. Das Modul erzeugt die automatisch und das auch nur damit man in Fhemweb die Werte durch Draufklicken ändern kann.

Ebenso ist ein -expr $val überflüssig. -expr macht nur dann Sinn wenn man den ursprünglichen Wert von $val in einer Perl Expression umwandeln will.

Gruß
   Stefan

eszych

Der Vollständigkeit halber hier noch der Wert für I_AC_Leistung_SF wenn die Batterie Strom liefert:
I_AC_Leistung_SF = 65535

Der Wert für die Stromproduktion ist dann z.B.
I_AC_Leistung_W = 4730
was wohl 473,0 W entspricht.
Raspberry Pi 2 - FHEM 5.7
HM-LAN, HM-CFG-USB-2
HM-Sec-SCo, HM-Sec-SC-2, HM-TC-IT-WM-W-EU,
HM-LC-SW4-DR, HM-LC-Sw1-DR, HM-ES-PMSw1-DR,    
HM-ES-PMSw1-Pl - Rademacher Hompilot DuoFern

rakete123

Hallo zusammen,

ich überlege auch einen sdm220 zu holen. Aber ich rätsel noch wie ich die Daten ins FHEM bekomme... Ich habe in dem Schrank leider kein Ethernet Kabel. Auch WLAN möchte ich ungern nutzen. Ich hatte überlegt einen arduino mit reinzuwerfen und den dann per RS485 anschließen und über zwave die daten zu übertragen oder 433 mhz oder sowas.
Gibts da schon etwas fertiges? Oder einen extra RPi dafür?

VIelen Dank

mfg
Marcel
Zwave: ZMEEUZB1 (Fibaro, Aeotec, diverse)
Zigbee: Conbee (HUE, Xiaomi, osram)
Homematic: HM-MOD-RPI-PCB + diverse HM-CC-RT-DN
Sonstiges: Harmony, Android, Netatmo, Jabber (talk2fhem)
https://resize2fs.de

StefanStrobel

#293
Hallo,

anbei eine neue Version zum Testen, die auch Modbus ASCII unterstützt. Ich habe leider kein echtes Gerät mit Modbus ASCII und kann es daher nur mit einem Simulator testen. Bei der Definition des logischen Device einfach ASCII als Protokoll angeben.

Weitere Änderung: wenn das Attribut disable bei Modbus über TCP auf 1 gesetzt wird, dann wird auch die TCP-Verbindung geschlossen und erst wieder aufgebaut wenn disable auf 0 gesetzt wird oder wenn es gelöscht wird.

Gruss
   Stefan

der-Lolo

Zuerstmal vielen Dank! Tolle Arbeit die hier geleistet wird...

Besonderer Dank an Roger - das war ja schon fast plug&play die beiden Zähler in betrieb zu nehmen.

Gibt es eigentlich auch ein disable Attribut bei dem USB-Adapter?
Ich habe definitionen Testweise in meine Config aufgenommen...

define HA_Modbus_1 Modbus /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_AI03650E-if00-port0@9600
attr HA_Modbus_1 room Modbus

define HA_SDM630M_1 ModbusSDM630M 1 30
attr HA_SDM630M_1 userattr
attr HA_SDM630M_1 IODev HA_Modbus_1
attr HA_SDM630M_1 room Modbus

define HA_SDM630M_2 ModbusSDM630M 2 30
attr HA_SDM630M_2 userattr
attr HA_SDM630M_2 IODev HA_Modbus_1
attr HA_SDM630M_2 room Modbus


Jetzt ist der "Test-stand" wieder zerlegt - ich finde aber kein disable Attribut.
Die folge ist ein großes Log-file

2016.10.03 20:11:23 3: HA_SDM630M_2: Send queue too long, dropping request
2016.10.03 20:11:23 3: HA_SDM630M_1: Send queue too long, dropping request



Wurde schonmal mit den Übertragungsraten gespielt? Da geht doch noch einiges, oder?

StefanStrobel

Hallo,

Eigentlich erben die Gerätemodule auf Basis von 98_Modbus.pm genauso wie ModbusAttr die möglichen Attribute vom Basismodul. Ein attr HA_SDM630_1 disable 1 sollte daher möglich sein.

Gruß
    Stefan

der-Lolo

überbleibsel meiner Bastelstunde war der noch eingesteckte USB-Dongle.
Als ich den rausgenommen habe hörte der Zauber auf.

Es wird noch einen dritten slave geben, den Multical602 (Wärmemengenzähler) konnte ich noch nicht mit Spannung versorgen. Wie füge ich dessen Readings hinzu? Wenn ich alles richtig verstanden habe baue ich auf grundlage der ModbusSDM.pm datei eine neue Zuordnung, oder?

der-Lolo

Hallo Stefan,
ich habe mir die Dokumentation des Wärmemengenzählers gerade mal angesehen, so richtig blicke ich noch nicht welche Register ich lesen sollte.. Die Daten stehen, wenn ich alles richtig verstehe, in mehreren verschiedenen Variablen Formen zur Verfügung. Würdest Du Dir vielleicht das angehangene PDF Dokument mal anschauen und mir sagen auf welche Tabelle ich setzen sollte..?
Das wäre toll.
Ich hoffe wir bekommen eine schöne 98_ModbusMultical602.pm gebastelt...

Danke im voraus...
Michael


oniT

Hallo Stefan,

ich habe eine weitere Frage. Ich bin am Basteln eines Moduls auf Basis 98_ModbusSet.pm. Dabei habe ich nun folgendes Problem. Die abgefragten Werte sind ja Ganzzahlen. Um eine Dezimalstelle, zum Beispiel bei Temperaturen zu erhalten, wird dies mit expr(?) und/oder format(?) doch umgerechnet, richtig? Das ganze sieht dann ja so aus:


'h502' => { reading => 'Referenztemperatur'',
name => 'Referenztemperatur',
expr => '$val/10',
format => '%.1f',
min => 10.0,
max => 40.0,
poll => 1,
set => 1,
},


Was ist aber nun wenn ich Temperaturwerte mit einer Nachkommastelle schreiben möchte? Schreibe ich diese mit einer Nachkommastelle, ist der Wert um ein Zehntel zu klein. Schreibe ich diese als Ganzzahl, also statt zum Beispiel 21.0 -> 210, dann ist der Wert richtig, ist ja logisch. Gibt es da einen Trick oder irgendetwas um den Wert mit Dezimalstelle zu übergeben und dieser wird dann vor dem Schreiben wieder als Ganzzahl umgerechnet?

[gelöst]:-[ "1000 mal die commandref angesehen, 1000 mal ist nichts passiert", setexpr heißt das Zauberwort.

Danke
Gruß
Tino
BBB - debian weezy - FHEM 5.7
HMLAN - HM-LC-Bl1-FM, HM-ES-PMSw1-PI, HM-LC-Sw1-FM, HM-TC-IT-WM-W-EU, HM-WDS40-TH-I, HM-Sen-Wa-Od, HM-Sec-RHS
Dimplex Wärmepumpe / Dimplex ZL 300 - Modbus TCP
SDM630M - Modbus TCP
SolarLog 200 / SMA SonnyBoy 1.5/2.5 - Modbus TCP