FHEM Module für B+G E-Tech & EASTON Modbus Zähler

Begonnen von Roger, 03 März 2016, 22:15:25

Vorheriges Thema - Nächstes Thema

laserrichi

also das  Elfin EE11  kenne ich jetzt nicht.

Ich mache das mit einem Espeasy einfach mit RS485 Pegelwandler als Serielle Schnittstelle.

Ich habe daher bei mir das ganze mit RTU definiert und der modbusproxy handled das ganze, auch habe ich keine delays usw. drin.
Würde da mal an der elfin config schauen ob du da noch was drehen kannst.
RaspberryPi 4 Bullseye,Homematic,Z-Wave,Rademacher Duofern,Signalduino,Fritz7590,ESPEasy,Tasmota,Robonect,Kameras,1-Wire,Modbus,Solar,Maranz,VU+,ulanzi tc001 mit awtrix light

Guzzi-Charlie

Hallo,
Hat schonmal Jemand den Zähler DS100-30B von B+G E-Tech LINK erfolgreich ausgelesen/eingebunden?

Ich habe versucht das Modul des SDM630 anzupassen, also die Modbus-Register angepaßt. Leider hat es so einfach nicht geklappt. In den Downloads zum Zähler gibt es zwar eine umfangreiche Liste aller auslesbaren Werte und der zugehörigen Modbus-Register, aber ich weiß z.B. nicht mit welchen Funktions-Codes der Zähler angesprochen werden muß und vielleicht stimmen auch meine Registereintragungen nicht. Mit dem ebenfalls herunterladbaren Windows-Tool läßt sich der Zähler (über einen RS485/USB-Adapter) problemlos auslesen und auch einstellen.

Wenn Jemand eine Idee hat wie ich weiter vorgehen könnte wäre das Super.
- RaspPI 4+: (Cuno V2 -2x KS300, JeeLink -13x EC3000)
- Stromzähler (B+G E-Tech): 6x SDM120M, 9x XTM100A, 38x DRS110M
- LAN: IT LAN-Gateway mit 34x RMF-R1 (Rohrmotor24)
- WLAN: 85x Shelly, 12x Gosund SP111, 16x D1-Mini, 15x Sonoff Basic
- DECT: 6x DECT200, 8x DECT301, - HmIP: 3x FalmotC12, 16x WTH2

satprofi

Hallo @all

Wollte euch nur mitteilen, das der SDM630M supergenau misst. Habe einen IR-Kopf auf meinem Smartmeter, und der passt +-5W mit den Ergebnissen vom 630M zusammen.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Guzzi-Charlie

Hallo,
nach langer Zeit habe ich mal wieder versucht den DS100 Zähler endlich in Fhem einzubinden.

Grundsätzlich ist mir das inzwischen gelungen, aber ich bekomme immer noch nicht alle Werte ausgelesen. Ich weiß nicht woran es liegt, aber das Modbus-Modul oder/und die Einstellparameter verhalten sich sehr seltsam. Vielleicht bin ich aber auch nur zu blöd das Ganze richtig einzusetzen.

Das ist der momentan erreichte Stand:
  • Die Verbindung des modifizierten SDM630-Moduls mit dem Modbusmodul funktioniert.
  • Ich kann die 32Bit-Werte auslesen (abgesehen davon, daß die Werte alle um den Faktor 1000 zu hoch sind, aber das kann man ja konfigurieren).
  • 16Bit-Werte funktionieren praktisch nicht.
  • Die meisten unpacking Parameter haben im besten Fall gar keine Wirkung oder bringen im schlimmsten Fall FHEM zum Absturz.

Im Moment fällt mir wirklich nichts mehr ein.

Beispiel einer funktionierenden Verbindung:
Modbusregister: 1024
Registerlänge: 2
Datenart: INT32(3+3)

Programmierung im Modul (Auszug):
my %DS100BdeviceInfo = (
    "timing"    =>    {
            timeout        =>    5,        # 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
            },
    "i"            =>    {            # details for "input registers" if the device offers them
            read        =>    4,        # use function code 4 to read discrete inputs. They can not be read by definition.
            defLen        =>    2,        # default length (number of registers) per value ((e.g. 2 for a float of 4 bytes that spans 2 registers)
                                # can be overwritten in parseInfo per reading by specifying the key "len"
            combine        =>    10,        # allow combined read of up to 10 adjacent registers during getUpdate
#            combine        =>    1,        # no combined read (read more than one registers with one read command) during getUpdate
#            defFormat    =>    "%.3f",        # default format string to use after reading a value in sprintf
                                # can be overwritten in parseInfo per reading by specifying the key "format"
            defUnpack    =>    "I>",        # default pack / unpack code to convert raw values, e.g. "n" for a 16 bit integer oder
                                # "f>" for a big endian float IEEE 754 floating-point numbers
                                # can be overwritten in parseInfo per reading by specifying the key "unpack"
            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
            },
    "h"            =>    {            # details for "holding registers" if the device offers them
            read        =>    3,        # use function code 3 to read holding registers.
            write        =>    16,        # use function code 6 to write holding registers (alternative could be 16)
            defLen        =>    3,        # default length (number of registers) per value (e.g. 2 for a float of 4 bytes that spans 2 registers)
                                # can be overwritten in parseInfo per reading by specifying the key "len"
            combine        =>    10,        # allow combined read of up to 10 adjacent registers during getUpdate
            defUnpack    =>    "f>",        # default pack / unpack code to convert raw values, e.g. "n" for a 16 bit integer oder
                                # "f>" for a big endian float IEEE 754 floating-point numbers
                                # can be overwritten in parseInfo per reading by specifying the key "unpack"
            defShowGet    =>    1,        # default für showget Key in parseInfo
            },
.
.
.
.

my %DS100BparseInfo = (
#    Spannung L3,        nur bei jedem 11. Zyklus    10s --> 1min 50s
    "i1028"    =>    {    # input register 0x0400
                    name        => "A phase and N-phase voltage",       
                    reading        => "Voltage_L3",               
#                    format        => '%.1f V',                   
                    format        => '%.1f',                   
                    expr        => '$val / 1000',
                    polldelay    => "x11",
Empfangene Hex-Daten (Test mit einem Modbustool): 33 04 04 00 03 8a 7a fe c4
Empfangene Dezimal-Daten (in FHEM): 232058
nach Dezimalstellenkorrektur: 232,058 (V)
=> der Wert ist richtig

Beispiel einer nicht funktionierenden Verbindung:
Modbusregister: 1077
Registerlänge: 1
Datenart: INT16(2+1)

Programmierung im Modul (Auszug):
#    Frequenz,            nur bei jedem 13. Zyklus:    10s --> 2min 10s
    "i1077" =>    {    # input register 0x0435
                    name        => "Combined frequency",           
                    reading        => "Frequency",                   
                    expr        => '$val / 10',
                    len        => 2,        wenn man len=1 eingibt gibt es gar kein Ergebnis
                    unpack        => "I>",
#                    format        => '%.1f Hz',                   
                    format        => '%.1f',                   
                    polldelay    => "x13",                   
                },
Empfangene Hex-Daten (Test mit einem Modbustool):  33 04 02 01 f3 c1 21
=> in Dezimal wäre das 499
Empfangene Dezimal-Daten (in FHEM): 3270246.4
=> der Wert ist vollkommen unsinnig

Vielleicht mache ich ja hier auch eine Menge Blödsinn, aber bisher weiß ich es nicht besser. Es wäre schön wenn ich etwas Hilfe bekommen könnte.
- RaspPI 4+: (Cuno V2 -2x KS300, JeeLink -13x EC3000)
- Stromzähler (B+G E-Tech): 6x SDM120M, 9x XTM100A, 38x DRS110M
- LAN: IT LAN-Gateway mit 34x RMF-R1 (Rohrmotor24)
- WLAN: 85x Shelly, 12x Gosund SP111, 16x D1-Mini, 15x Sonoff Basic
- DECT: 6x DECT200, 8x DECT301, - HmIP: 3x FalmotC12, 16x WTH2

Guzzi-Charlie

So, neuer Stand (es funktioniert endlich):

Nachdem ich mehrere Tage versucht hatte das Modul vom SDM120 für den DS100B anzupassen habe ich es Heute aufgegeben und das Ganze mit dem Modbusattr-Modul neu aufgebaut. Das hat mich zwar auch einiges an Mühe gekostet da ich das Modbusattr-Modul auch noch nie verwendet hatte, aber schlußendlich funktioniert es jetzt. Der Zähler hängt am gleichen Modbus wie alle anderen 10 Zähler und ich habe nun alle für mich relevanten Daten (Code siehe unten). Man könnte noch eine Menge anderer Daten von diesem Zähler abfragen, aber die benötige ich nicht.

Das Gute an diesem Zähler ist der unschlagbare Preis von nur 54,-€ (B+G E-Tech über Amazon, bei Prime ohne Versandkosten) für einen direktmessenden dreiphasigen 100A Zähler mit Modbus,S0 und MID-Eichung.

Hier mein momentaner Stand:
defmod DS100B_52 ModbusAttr 52 30
attr DS100B_52 alias P502 Zähler ELW (Netzstrom)
attr DS100B_52 dev-h-defPoll 1
attr DS100B_52 dev-i-defPoll 1
attr DS100B_52 dev-type-F16-len 1
attr DS100B_52 dev-type-F16-unpack f>
attr DS100B_52 dev-type-S16_0-expr $val/10
attr DS100B_52 dev-type-S16_0-format %.1f
attr DS100B_52 dev-type-S16_0-len 1
attr DS100B_52 dev-type-S16_0-unpack s>
attr DS100B_52 dev-type-S32-len 2
attr DS100B_52 dev-type-S32-unpack l>
attr DS100B_52 dev-type-S32_00-expr $val/100
attr DS100B_52 dev-type-S32_00-format %.2f
attr DS100B_52 dev-type-S32_00-len 2
attr DS100B_52 dev-type-S32_00-unpack l>
attr DS100B_52 dev-type-S32_000-expr $val/1000
attr DS100B_52 dev-type-S32_000-format %.3f
attr DS100B_52 dev-type-S32_000-len 2
attr DS100B_52 dev-type-S32_000-unpack l>
attr DS100B_52 disable 0
attr DS100B_52 event-min-interval .*:300
attr DS100B_52 event-on-change-reading .*
attr DS100B_52 group ELW
attr DS100B_52 icon measure_power
attr DS100B_52 obj-h4096-expr sprintf("%X", $val)
attr DS100B_52 obj-h4096-reading Serial_No_a
attr DS100B_52 obj-h4096-unpack s>
attr DS100B_52 obj-h4097-expr sprintf("%X", $val)
attr DS100B_52 obj-h4097-reading Serial_No_b
attr DS100B_52 obj-h4097-unpack s>
attr DS100B_52 obj-h4098-expr sprintf("%X", $val)
attr DS100B_52 obj-h4098-reading Serial_No_c
attr DS100B_52 obj-h4098-unpack s>
attr DS100B_52 obj-h4099-reading Modbus_ID
attr DS100B_52 obj-h4099-type F16
attr DS100B_52 obj-h4099-unpack s>
attr DS100B_52 obj-h4108-hint 6,7,8,9
attr DS100B_52 obj-h4108-map 6:9600, 7:19200, 8:38400, 9:115200
attr DS100B_52 obj-h4108-reading RS485_Baudrate
attr DS100B_52 obj-h4108-type F16
attr DS100B_52 obj-h4108-unpack s>
attr DS100B_52 obj-h4109-hint 0,1,2
attr DS100B_52 obj-h4109-map 0:no.parity, 1:odd, 2:even
attr DS100B_52 obj-h4109-reading RS485_Parity
attr DS100B_52 obj-h4109-type F16
attr DS100B_52 obj-h4109-unpack s>
attr DS100B_52 obj-h4110-reading RS485_Stopbit
attr DS100B_52 obj-h4110-type F16
attr DS100B_52 obj-h4110-unpack s>
attr DS100B_52 obj-i0270-reading Energy_total__kWh
attr DS100B_52 obj-i0270-type S32_00
attr DS100B_52 obj-i1024-reading Voltage_L1
attr DS100B_52 obj-i1024-type S32_000
attr DS100B_52 obj-i1026-reading Voltage_L2
attr DS100B_52 obj-i1026-type S32_000
attr DS100B_52 obj-i1028-reading Voltage_L3
attr DS100B_52 obj-i1028-type S32_000
attr DS100B_52 obj-i1030-reading Voltage_L1L2
attr DS100B_52 obj-i1030-type S32_000
attr DS100B_52 obj-i1032-reading Voltage_L2L3
attr DS100B_52 obj-i1032-type S32_000
attr DS100B_52 obj-i1034-reading Voltage_L3L1
attr DS100B_52 obj-i1034-type S32_000
attr DS100B_52 obj-i1040-reading Current_L1
attr DS100B_52 obj-i1040-type S32_000
attr DS100B_52 obj-i1042-reading Current_L2
attr DS100B_52 obj-i1042-type S32_000
attr DS100B_52 obj-i1044-reading Current_L3
attr DS100B_52 obj-i1044-type S32_000
attr DS100B_52 obj-i1046-reading Current_N
attr DS100B_52 obj-i1046-type S32_000
attr DS100B_52 obj-i1050-reading Power_L1__W
attr DS100B_52 obj-i1050-type S32
attr DS100B_52 obj-i1052-reading Power_L2__W
attr DS100B_52 obj-i1052-type S32
attr DS100B_52 obj-i1054-reading Power_L3__W
attr DS100B_52 obj-i1054-type S32
attr DS100B_52 obj-i1056-reading Power_total__W
attr DS100B_52 obj-i1056-type S32
attr DS100B_52 obj-i1077-reading Frequency
attr DS100B_52 obj-i1077-type S16_0
attr DS100B_52 obj-i1280-reading Energy_L1__kWh
attr DS100B_52 obj-i1280-type S32_00
attr DS100B_52 obj-i1380-reading Energy_L2__kWh
attr DS100B_52 obj-i1380-type S32_00
attr DS100B_52 obj-i1480-reading Energy_L3__kWh
attr DS100B_52 obj-i1480-type S32_00
attr DS100B_52 room Energiezähler
attr DS100B_52 stateFormat {"P L1: ".ReadingsVal($name,"Power_L1__W",0)." W          ".\
"P L2: ".ReadingsVal($name,"Power_L2__W",0)." W          ".\
"P L3: ".ReadingsVal($name,"Power_L3__W",0)." W          ".\
"P ges: ".ReadingsVal($name,"Power_total__W",0)." W          ".\
"E: ".sprintf("%.2f",ReadingsVal($name,"Energy_total__kWh",0))." kWh          "\
}
attr DS100B_52 userReadings Serial_No {ReadingsVal("$name", "Serial_No_a", "").\
          sprintf("%04d",ReadingsVal("$name", "Serial_No_b", "")).\
          sprintf("%04d",ReadingsVal("$name", "Serial_No_c", ""))}



Warum die Werte bei meinem Versuch über das angepaßte Modul teilweise so seltsame Ergebnisse geliefert hatten weiß ich auch nicht, aber egal.

Damit haben sich meine im vorherigen Beitrag genannten Probleme/Fragen erledigt. Das muß sich Niemand mehr anschauen.
- RaspPI 4+: (Cuno V2 -2x KS300, JeeLink -13x EC3000)
- Stromzähler (B+G E-Tech): 6x SDM120M, 9x XTM100A, 38x DRS110M
- LAN: IT LAN-Gateway mit 34x RMF-R1 (Rohrmotor24)
- WLAN: 85x Shelly, 12x Gosund SP111, 16x D1-Mini, 15x Sonoff Basic
- DECT: 6x DECT200, 8x DECT301, - HmIP: 3x FalmotC12, 16x WTH2