Neue Versionen und Support zum Modbus-Modul

Begonnen von StefanStrobel, 20 August 2017, 12:11:08

Vorheriges Thema - Nächstes Thema

StefanStrobel

Hallo Andy,

ist denn ttyUSB0 wirklich noch korrekt? Evt. ist der richtige serielle Adapter ja inzwischen ttyUSB1 oder ttyUSB2 ...
Der Log-Eintrag "opened" bedeutet nur dass die serielle Schnittstelle geöffnet wurde. Einen echten Verbindungsaufbau gibt es nicht.
Eventuell hat sich ja auch an der Verkabelung etwas gelöst. Probier es doch mal mit einem anderen Modbus-Simulator.
Oder die ID stimmt nicht mehr ...

Es kann leider viele Gründe haben, warum keine Antwort kommt.

Gruss
   Stefan

StefanStrobel

Ich habe die neuen Versionen von 98_Modbus und 98_ModbusAttr gerade eingecheckt und hoffe das die größten Bugs der neuen Version behoben sind.

Gruss
   Stefan

holle75

Hallo Stefan, seit heutigem update hagelts bei Neustart fhem:


2018.11.19 15:56:27 3: Xtender_AC_in: MapConvert called from ModbusLD_ParseObj did not find 00020000 in map 1:import, 2:import+export, 3:import-export
2018.11.19 15:56:46 3: Xtender_AC_out: MapConvert called from ModbusLD_ParseObj did not find 00020000 in map 1:import, 2:import+export, 3:import-export
2018.11.19 15:56:50 3: Xtender_AC_out: MapConvert called from ModbusLD_ParseObj did not find 00000000 in map 0:0.001/imp, 1:0.01/imp, 2:0.1/imp, 3:1/imp
2018.11.19 15:56:54 3: Xtender_AC_out: MapConvert called from ModbusLD_ParseObj did not find 00000000 in map 0:0.001/imp, 1:0.01/imp, 2:0.1/imp, 3:1/imp
2018.11.19 15:56:56 3: Xtender_AC_out: MapConvert called from ModbusLD_ParseObj did not find 00020000 in map 1:import, 2:import+export, 3:import-export


Bei mir  SDM220M von Roger. Das war vorher nicht so. Kann ich etwas zur Fehlerfindung beitragen? List, etc ... oder sagt dir das schon was?

Die defines:
define Eastron Modbus /dev/ttyUSB1@9600
attr Eastron busDelay 1
attr Eastron clientSwitchDelay 1
attr Eastron group Xtender
#attr Eastron timeoutLogLevel 4

#------------------------ 1. Zaehler AC-IN, Modul Modbus , ID1, abfrage alle 25sec. ---------------#

define Xtender_AC_in ModbusSDM220M 1 25
attr Xtender_AC_in userattr IODev event-min-interval event-on-change-reading event-on-update-reading userReadings
attr Xtender_AC_in IODev Eastron
attr Xtender_AC_in event-min-interval Power_.*.W:900,Voltage__V:900,Energy_total__kWh:900,statEnergy_total__kWh:900,statEnergy_total__kWhDay:900,Verbrauch_Enel:900,.*Last.*:900
attr Xtender_AC_in event-on-change-reading Power_.*.W:10,Voltage__V:1,Energy_total__kWh,statEnergy_total__kWh,statEnergy_total__kWhDay,Verbrauch_Enel,.*Last.*
attr Xtender_AC_in event-on-update-reading Power_.*.W,Voltage__V,Energy_total__kWh,statEnergy_total__kWh,statEnergy_total__kWhDay,Verbrauch_Enel,.*Last.*
attr Xtender_AC_in group Xtender
attr Xtender_AC_in userReadings Verbrauch_Enel:Energy_total__kWh { ReadingsNum("$name","Energy_total__kWh",0)-159.01 . " kWh";; }

#--------------------------- 2. Zaehler AC-Out, Modul Modbus , ID2, abfrage alle 7 sec. -------------#

define Xtender_AC_out ModbusSDM220M 2 7
attr Xtender_AC_out userattr IODev event-min-interval event-on-change-reading event-on-update-reading userReadings
attr Xtender_AC_out IODev Eastron
attr Xtender_AC_out event-min-interval Power_.*.W:900,Voltage__V:900,Energy_total__kWh:900,statEnergy_total__kWh:900,statEnergy_total__kWhDay:900,Verbrauch_Home:900,.*Last.*:900
attr Xtender_AC_out event-on-change-reading Power_.*.W:10,Voltage__V:1,Energy_total__kWh,statEnergy_total__kWh,statEnergy_total__kWhDay,Verbrauch_Enel,.*Last.*
attr Xtender_AC_out event-on-update-reading Power_.*.W,Voltage__V,Energy_total__kWh,statEnergy_total__kWh,statEnergy_total__kWhDay,Verbrauch_Home,.*Last.*
attr Xtender_AC_out group Xtender
attr Xtender_AC_out userReadings Verbrauch_Home:Energy_total__kWh { ReadingsNum("$name","Energy_total__kWh",0)-366.51 . " kWh";; }


Grüße!
H.

StefanStrobel

Hallo,

Ein Log-Auszug mit verbose 5 (sowohl für das Modbus-Device als auch die SDM-Devices)
wäre sehr hilfreich.

Gruss / Thanx
    Stefan

holle75

#184
Hallo Stefan, log anbei. Habe jetzt mal neben Modbus-Device nur den einen Zähler auf verbose 5 gesetzt, da beide das selbe Problem haben sollten. Datenmenge reduzieren. Wenn das nicht in deinem Sinne ist mach ich das gerne nochmal.


StefanStrobel

Hallo,

wenn ich mir das so ansehe, dann wundere ich mich wie das bisher funktioniert hat.
Um diese Frage zu klären, wäre es hilfreich, wenn Du das alte Modul nochmal reaktivieren könntest und damit den gleichen Teil mit verbose 5 loggen könntest.
Ich wäre da sehr neugierig...

Um es mit dem neuen Modul in Ordnung zu bringen, würde ich das SDM220-Modul korrigieren:
Bisher (sofern das noch aktuell ist) steht da bei Zeile 340:


"h63776" => { # holding register 0xF920
# Data Format: Hex
# 0001:mode 1(total = import)
# 0002:mode 2(total = import + export) ( default)
# 0003:mode 3 (total = import - export)
name => "Measurement mode", # internal name of this register in the hardware doc
reading => "System_Measurement_mode", # name of the reading for this value
unpack => "H*", # Hex pack / unpack code to convert raw values
map => "1:import, 2:import+export, 3:import-export", # map to convert visible values to internal numbers (for reading and writing)
hint => "1,2,3", # string for fhemweb to create a selection or slider
format => '%s', # format string for sprintf
poll => "once", # only poll once after define (or after a set)
set => 1, # this value can be set
},


korrigiert sollte da stehen:


"h63776" => { # holding register 0xF920
# Data Format: Hex
# 0001:mode 1(total = import)
# 0002:mode 2(total = import + export) ( default)
# 0003:mode 3 (total = import - export)
name => "Measurement mode", # internal name of this register in the hardware doc
reading => "System_Measurement_mode", # name of the reading for this value
        unpack => "S", # unsigned 16 Bit Integer
                                        len                    =>   1,                                     # one register, not two
map => "1:import, 2:import+export, 3:import-export", # map to convert visible values to internal numbers (for reading and writing)
hint => "1,2,3", # string for fhemweb to create a selection or slider
format => '%s', # format string for sprintf
poll => "once", # only poll once after define (or after a set)
set => 1, # this value can be set
},


Ich habe len 1 hinzugefügt, da sonst defLen 2 aus Zeile 77 greift und
unpack auf S geändert, da sonst Werte wie 0001 kommen, die Map aber auf 1 matcht und nicht 0001.

Es wäre super wenn Du beides mal testen könntest, da ich keinen SDM220 habe.

Gruss
   Stefan

holle75


holle75

#187
Dateien jongliert.

die logs anbei. ModbusSDM220 in der geänderten Form

Jetzt in der letzten Testversion (modbus neu, Modifikationen an SDM220 ausgeführt) wieder auf Verbose 3 gibts noch folgende (selbige) Infos/Fehler


2018.11.19 21:31:42 3: Xtender_AC_in: defined with id 1, interval 25, protocol default (RTU), mode master
2018.11.19 21:31:42 3: Xtender_AC_in: RegisterAtIODev called from ModbusLD_SetIODev registers Xtender_AC_in at Eastron with id 1, MODE master, PROTOCOL RTU
2018.11.19 21:31:42 3: Xtender_AC_out: defined with id 2, interval 7, protocol default (RTU), mode master
2018.11.19 21:31:42 3: Xtender_AC_out: RegisterAtIODev called from ModbusLD_SetIODev registers Xtender_AC_out at Eastron with id 2, MODE master, PROTOCOL RTU




2018.11.19 21:39:10 3: Xtender_AC_in: RegisterAtIODev called from ModbusLD_SetIODev registers Xtender_AC_in at Eastron with id 1, MODE master, PROTOCOL RTU
2018.11.19 21:39:10 3: Xtender_AC_in: Notify / Init: using Eastron for communication
2018.11.19 21:39:10 3: Xtender_AC_out: RegisterAtIODev called from ModbusLD_SetIODev registers Xtender_AC_out at Eastron with id 2, MODE master, PROTOCOL RTU
2018.11.19 21:39:10 3: Xtender_AC_out: Notify / Init: using Eastron for communication



2018.11.19 21:39:12 3: Xtender_AC_in: MapConvert called from ModbusLD_ParseObj did not find 00000000 in map 0:0.001/imp, 1:0.01/imp, 2:0.1/imp, 3:1/imp
2018.11.19 21:39:21 3: Xtender_AC_in: MapConvert called from ModbusLD_ParseObj did not find 512 in map 1:import, 2:import+export, 3:import-export
2018.11.19 21:39:48 3: Xtender_AC_out: MapConvert called from ModbusLD_ParseObj did not find 00000000 in map 0:0.001/imp, 1:0.01/imp, 2:0.1/imp, 3:1/imp
2018.11.19 21:39:52 3: Xtender_AC_out: MapConvert called from ModbusLD_ParseObj did not find 00000000 in map 0:0.001/imp, 1:0.01/imp, 2:0.1/imp, 3:1/imp


StefanStrobel

Hallo,

Zunächst mal Danke fürs Testen.
Im Log der alten Version ist der Fehler auch drin. Nur wird er nicht auf Level 3 Protokolliert:

2018.11.19 21:25:22 5: Xtender_AC_out: ParseObj unpacked 00020000 with H* to hex 3030303230303030 (00020000)
2018.11.19 21:25:22 5: Xtender_AC_out: ParseObj for System_Measurement_mode maps value to 00020000 with 1:import, 2:import+export, 3:import-export
2018.11.19 21:25:22 5: Xtender_AC_out: ParseObj for System_Measurement_mode does sprintf with format %s value is 00020000
2018.11.19 21:25:22 5: Xtender_AC_out: ParseObj for System_Measurement_mode sprintf result is 00020000
2018.11.19 21:25:22 4: Xtender_AC_out: ParseObj for System_Measurement_mode assigns 00020000
2018.11.19 21:25:22 5: Eastron: ParseFrames got 1 readings from ParseObj


In der neuen Version klappt es auch noch nicht ganz, da die Byte-Reihenfolge noch falsch ist. Unpack mit S macht aus hex 0001 eine 512. Unpack S> sollte besser funktionieren und daraus eine 1 machen, die dann in der Map gefunden wird.

Das gleiche Problem besteht mit h63760 und eventuell bei anderen Maps, die mit Unpack H* definiert sind.
In der alten Version ist der ursprüngliche Wert einfach beibehalten worden, wenn eine Map nicht gepasst hat. Die neue beschwert sich im Log.

Gruß
    Stefan


holle75

Danke Stefan. Könntest du mir noch ein bißchen genauer sagen was ich jetzt wo ändern muß? Das File ist ja von Roger und ich bin nicht drin was wie wo.

holle75

#190
TsTs, Angst abgelegt und einfach mal gemacht, was du geschrieben hast :D

Alle (die 2) H* gegen S> getauscht und funktioniert (zumindest ohne Fehlermeldungen beim starten).

Danke dir!

Braucht es Dies hier beim starten?:


2018.11.20 15:45:49 3: Xtender_AC_in: defined with id 1, interval 25, protocol default (RTU), mode master
2018.11.20 15:45:49 3: Xtender_AC_in: RegisterAtIODev called from ModbusLD_SetIODev registers Xtender_AC_in at Eastron with id 1, MODE master, PROTOCOL RTU
2018.11.20 15:45:49 3: Xtender_AC_out: defined with id 2, interval 7, protocol default (RTU), mode master
2018.11.20 15:45:49 3: Xtender_AC_out: RegisterAtIODev called from ModbusLD_SetIODev registers Xtender_AC_out at Eastron with id 2, MODE master, PROTOCOL RTU
2018.11.20 15:45:53 3: Opening Eastron device /dev/ttyUSB1
2018.11.20 15:45:53 3: Setting Eastron serial parameters to 9600,8,N,1
2018.11.20 15:45:53 3: Eastron device opened
2018.11.20 15:45:53 3: Xtender_AC_in: RegisterAtIODev called from ModbusLD_SetIODev registers Xtender_AC_in at Eastron with id 1, MODE master, PROTOCOL RTU
2018.11.20 15:45:53 3: Xtender_AC_in: Notify / Init: using Eastron for communication
2018.11.20 15:45:53 3: Xtender_AC_out: RegisterAtIODev called from ModbusLD_SetIODev registers Xtender_AC_out at Eastron with id 2, MODE master, PROTOCOL RTU
2018.11.20 15:45:53 3: Xtender_AC_out: Notify / Init: using Eastron for communication


und ein Fehler kommt dann noch verspätet:

2018.11.20 16:51:02 1: PERL WARNING: Argument "" isn't numeric in sprintf at ./FHEM/98_HTTPMOD.pm line 1791.

ist das ein Auslesefehler oder was Generelles?

StefanStrobel

Hallo,

die Meldungen beim Starten sind in Ordnung.
Der Fehler bei HTTPMOD ist ein anderes Thema, vermutlich wurde da ein numerisches Format per Attribut angegeben, aber der gelesene Wert ist "".

Gruss
   Stefan

Turnschuh

Hallo Stefan,

danke schonmal fuer die Antwort.
ttyUSB0 ist korrekt und auch die Modbus ID.

Ich pruefe dann nochmal die Verkabelung.
Hast Du noch einen anderen Hinweis fuer mich?

Cheers,
Andy

Tom_S

#193
habe nun auch die neue Version (Id: 98_Modbus.pm 17767) per Update erhalten.
Ich hole Daten von einem Wechselrichter. Meine Definition ist

defmod SE7K ModbusAttr 1 300 <IP>:502 TCP
attr SE7K dev-h-combine 50
attr SE7K dev-h-defPoll 1
attr SE7K dev-h-defShowGet 1
attr SE7K enableControlSet 1
attr SE7K event-on-change-reading .*
attr SE7K maxTimeoutsToReconnect 600
........
und dann die Register


prinzipiell funktioniert das auch noch, nur die Readings werden nicht mehr automatisch aktualisiert.
Ein set reread funktioniert. Ich habe an der config nichts geändert.
mit der alten Version (Id: 98_Modbus.pm 15871) hat das funktioniert.
Frage: muss ich etwas an der config anpassen?
RaspberryPI2 + pilight, 3x AVR-NetIO, LW12, LW12HX, LW12FC; MAX-Lan, ESP8266, Arduino, H801, Neopixel, Solaredge, Modbus

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