Neue Versionen und Support zum Modbus-Modul

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

Vorheriges Thema - Nächstes Thema

dobiwan

Zitat von: StefanStrobel am 22 Januar 2021, 16:27:48
Hallo dobiwan,

wie fragst Du die Readings denn ab?
Hast Du einen get-Befehl verwendet?
Oder möchtest Du dass die Readings automatisch zyklisch abgefragt werden, dann muss beim Define ein Intervall angegeben sein und das poll-Attribut entsprechend bei den Objekten.
In jedem Fall hilft es wenn Du verbose auf 5 setzt und dann einen Auszug aus dem Log postest. Dann sieht man was wirklich passiert und muss weniger raten :-)

Gruss
    Stefan

Hallo Stefan,

das poll hat jetzt geholfen und ich bekomme Werte angezeigt. Leider sind die Werte toital willkürlich. Da ist wohl noch etwas tuning nötig.

holle75

#721
Hallo,


RegisterNr  VarioTrack parameter description  Unit  Default  Min  Max  Format  Incremt
  18       Absorption voltage                  Vdc      57.6  37.9  68.2  FLOAT  0.1
  20       Force absorption phase              S           S              "SIGNAL"   
  22       Absorption duration                 min        120   5    510     FLOAT  5


ich möchte Register 20 Force absorption phase schreiben.
Aber wie setze ich ein "Signal" ab und was wäre das unpack??


attr Studer485_VT obj-h20-hint S
attr Studer485_VT obj-h20-reading Force_Absorption
attr Studer485_VT obj-h20-set 1
attr Studer485_VT obj-h20-poll 0
attr Studer485_VT obj-h20-unpack ?

holle75

blöd, ganz einfach. Man muß "1" senden.

attr Studer485_VT obj-h20-hint ForceNow
attr Studer485_VT obj-h20-reading Force_Absorption
attr Studer485_VT obj-h20-set 1
attr Studer485_VT obj-h20-poll 0
attr Studer485_VT obj-h20-map 1:ForceNow

StefanStrobel

Hallo,

ich habe gerade eine neue Version eingecheckt, in der die letzten Fixes drin sind.
Zudem war das Scanning defekt und sollte jetzt wieder gehen.
Ab morgen wird das per update verteilt.

Gruss
   Stefan

StefanStrobel

Hallo,

es gibt mal wieder was Neues zum Testen:
Ein neues Attribut ...-group ermöglich es die Zusammenfassung von Requests und die Reihenfolge der Auswertung bei Responses zu steuern.
Für SolarEdge, Fronius Wechselrichter und ähnliche Geräte, bei denen es einen Scale-Faktor oder Multiplyer gibt, sollte das eine Vereinfachung bringen.

Beispiel:

attr MyMaster obj-h100-reading Temp
attr MyMaster obj-h100-unpack f>
attr MyMaster obj-h100-len 2
attr MyMaster obj-h100-format %.2f
attr MyMaster obj-h100-poll 1
attr MyMaster obj-h100-expr ReadingsVal($name, 'TempMultiplyer', 1) * $val
attr MyMaster obj-h100-group 1-2

attr MyMaster obj-h102-reading TempMultiplyer
attr MyMaster obj-h102-unpack f>
attr MyMaster obj-h102-len 2
attr MyMaster obj-h102-poll 1
attr MyMaster obj-h102-group 1-1

attr MyMaster dev-h-combine 8


Durch die -group-Attribute wird zum Einen sichergestellt, das h100 und h102 immer gemeinsam gelesen werden.
Zudem wird durch -group 1-2 und group 1-1 festgelegt, dass zuerst das Reading für h102 und erst danach das Reading für h100 aktualisiert wird.

welche Rolle dev-h-combine dabei spielen soll, muss ich mir noch überlegen. Momentan muss combine mindestens genauso groß sein wie die größte definierte Gruppe. Es können bei combine aber auch Gruppen insgesamt kombiniert werden.
Ich könnte mir aber auch vorstellen, dass combine bei Gruppen einfach ignoriert wird.

Gruss
   Stefan

dobiwan

Hallo Stefan,

ich habe jetzt ein enigg mit den Werten die bekomme experimentiert. Leider bekomme ich es nicht hin, dass ich realistische Werte raus bekomme. Im Bild siehst du was ich eingestellt habe und in der Excel Datei ist die Definition des Smartfox. Die Werte die ich erwarte sin uint32 / uint 16.

Vielen Dank für die Hilfe im Voraus.

Dirk

StefanStrobel

Hallo dobiwan,

leider sehe ich keine Einstellungen, nur das Bild mit den Internals und Readings.

Gruss
   Stefan

dobiwan

Zitat von: StefanStrobel am 08 Februar 2021, 17:42:37
Hallo dobiwan,

leider sehe ich keine Einstellungen, nur das Bild mit den Internals und Readings.

Gruss
   Stefan

Hier die Device Definitionen.

StefanStrobel

Hallo dobiwan,

folgendes fällt mir an Deiner Konfiguration auf:


define Smartfox ModbusAttr 1 60 192.168.178.6:502 TCP
attr Smartfox obj-h41012-expr $val
attr Smartfox obj-h41012-len 2
attr Smartfox obj-h41012-poll 60
attr Smartfox obj-h41012-reading Day-Energy-from-Grid
attr Smartfox obj-h41012-unpack V


Die Zeile mit -expr $val ist überflüssig. Eine Perl Expression kann man verwenden, wenn man einen Wert umrechnen muss. Wenn Du nur $val als Ausdruck angibst, dann ist das so etwas wie $val = $val. Das kannst Du einfach weglassen.

die Zeile mit -poll 60 sollte -poll 1 sein. Besser wäre noch dev-h-defPoll 1. Damit wird für alle definierten Holding register festgelegt, dass sie im definierten Intervall abgefragt werden.
Das Intervall wird beim Define angegeben.

unpack V steht für "An unsigned long (32-bit) in "VAX" (little-endian) order". (siehe https://perldoc.perl.org/functions/pack). Das kann richtig sein, muss es aber nicht.
Es könnte auch "N" sein ("An unsigned long (32-bit) in "network" (big-endian) order.") oder es könnten die beiden Register vorher vertauscht werden müssen. dafür gäbe es dann das Attribut -revRegs (siehe Commandref). Das muss man einfach alles ausprobieren.


attr Smartfox obj-h41430-expr $val
attr Smartfox obj-h41430-len 1
attr Smartfox obj-h41430-poll 60
attr Smartfox obj-h41430-reading Battery-Load


Da hast Du keinen unpack-Code angegeben. Als Default wird dann n verwendet ("An unsigned short (16-bit) in "network" (big-endian) order.")
Es ist davon auszugehen, dass Dein Gerät entweder big-endian oder little-endian Formate verwendet. Sicher nicht beides gemischt.

Leider gibt es da keinen Standard und so muss man eben alles ausprobieren. Jeder Hersteller macht das auf seine Weise ...

Gruss
   Stefan


dobiwan

Zitat von: StefanStrobel am 10 Februar 2021, 20:32:38
Hallo dobiwan,

folgendes fällt mir an Deiner Konfiguration auf:


define Smartfox ModbusAttr 1 60 192.168.178.6:502 TCP
attr Smartfox obj-h41012-expr $val
attr Smartfox obj-h41012-len 2
attr Smartfox obj-h41012-poll 60
attr Smartfox obj-h41012-reading Day-Energy-from-Grid
attr Smartfox obj-h41012-unpack V


Die Zeile mit -expr $val ist überflüssig. Eine Perl Expression kann man verwenden, wenn man einen Wert umrechnen muss. Wenn Du nur $val als Ausdruck angibst, dann ist das so etwas wie $val = $val. Das kannst Du einfach weglassen.

die Zeile mit -poll 60 sollte -poll 1 sein. Besser wäre noch dev-h-defPoll 1. Damit wird für alle definierten Holding register festgelegt, dass sie im definierten Intervall abgefragt werden.
Das Intervall wird beim Define angegeben.

unpack V steht für "An unsigned long (32-bit) in "VAX" (little-endian) order". (siehe https://perldoc.perl.org/functions/pack). Das kann richtig sein, muss es aber nicht.
Es könnte auch "N" sein ("An unsigned long (32-bit) in "network" (big-endian) order.") oder es könnten die beiden Register vorher vertauscht werden müssen. dafür gäbe es dann das Attribut -revRegs (siehe Commandref). Das muss man einfach alles ausprobieren.


attr Smartfox obj-h41430-expr $val
attr Smartfox obj-h41430-len 1
attr Smartfox obj-h41430-poll 60
attr Smartfox obj-h41430-reading Battery-Load


Da hast Du keinen unpack-Code angegeben. Als Default wird dann n verwendet ("An unsigned short (16-bit) in "network" (big-endian) order.")
Es ist davon auszugehen, dass Dein Gerät entweder big-endian oder little-endian Formate verwendet. Sicher nicht beides gemischt.

Leider gibt es da keinen Standard und so muss man eben alles ausprobieren. Jeder Hersteller macht das auf seine Weise ...

Gruss
   Stefan
Hallo Stefan,

Laut der Beschreibung des Modbus von Smartfox sind die Werte wie folgt definiert:

battery 1 SOC           int16   %               Battery-Load
battery 1 power   uint32   W               Battery-Power

Day Energy from grid   uint32   Wh     
Day Energy into grid   uint32   Wh
Day Energy Smartfox   uint32   Wh

Die Verbindung so:
offset   com   baud   parity   host   port
-1   COM4   9600   none   192.168.xxx.xxx   502

Also ich hatte unpack N auch schon probiert.

Im Bild siehst du den Vergleich der Werte vom Smartfox mit denen vom Fronius Smartmeter

Da ist irgendwie noch nicht der richtige Wert gefunden. Ich teste mal weiter, aber vielleicht ahst du noch eine Idee.

Vielen Dank erstmal bis hierher.

StefanStrobel

Manchmal zählen die Geräte ihre Adressen auch anders und beginnen mit Register 1 statt Register 0.
Du könntest also versuchen, die Adressen um 1 zu verschieben.
Falls der gesuchte Wert mit Kommas dargestellt wird, würde ich auch vermuten, dass man noch etwas umrechnen muss. Ein Integer-Wert kann ja keine Kommas haben. Manche Geräte speichern die Werte dann mit 10 multipliziert.

Gruss
   Stefan

torte

Hallo zusammen,

hab gestern meinen ersten Kontakt mit Modbus gehabt. Hab nun eine Frage, ich hab eine Alfen Wallbox
laut Doku des Herstellers werden einige Werte über die Slave Adresse 200 und andere Werte über die Slave Adresse 1 (oder 2, wenn man 2 Ladebuchsen) hat.
Ich hab das jetzt so gelöst das ich zwei Devices in FHEM hab, eins für die Slave Adresse 200 und eins  für die Slave Adresse 1. Ist
das so Ok oder macht man das besser irgendwie anders?

Danke!

Grüße
Torte

StefanStrobel

Hallo Torte,

so macht man das, alles richtig :-)

Gruss
    Stefan

torte

Hallo Stefan,

ich bekomme unpack Float64 Big Endian nicht hin.


2021.03.12 17:31:26 5: alfenVolt: ParseFrameStart called from ReadFn protocol TCP expecting id 1
2021.03.12 17:31:26 4: alfenVolt: ParseFrameStart (TCP, master) extracted id 1, fCode 3, tid 152, dlen 11 and potential data 0840e5f54000000000
2021.03.12 17:31:26 5: alfenVolt: HandleResponse called from ReadFn
2021.03.12 17:31:26 5: alfenVolt: ParseResponse called from HandleResponse
2021.03.12 17:31:26 5: alfenVolt: now parsing response data objects, master is alfenVolt relay is undefined
2021.03.12 17:31:26 4: alfenVolt: ParseObj called from HandleResponse with data hex 40e5f54000000000, type h, adr 374, valuesLen 4, op read
2021.03.12 17:31:26 5: alfenVolt: ParseObj unpacked 40e5f54000000000 with F> to 44970
2021.03.12 17:31:26 4: alfenVolt: ParseObj assigns value 44970 to RealEnergyDeliveredSum
2021.03.12 17:31:26 5: alfenVolt: ParseObj created 1 readings
2021.03.12 17:31:26 4: alfenVolt: HandleResponse done, current frame / read buffer: 00980000000b01030840e5f54000000000, id 1, fCode 3, tid 152,
request: id 1, read fc 3 h374, len 4, tid 152, master device alfenVolt, reading RealEnergyDeliveredSum (getUpdate for RealEnergyDeliveredSum len 4), queued 2.15 secs ago, sent 0.13 secs ago,
response: id 1, , fc 3, h . 374, len 4, values 40e5f54000000000
2021.03.12 17:31:26 5: alfenVolt: ResetExpect for HandleResponse from response to idle
2021.03.12 17:31:26 5: alfenVolt: StartQueueTimer called from HandleResponse sets internal timer to process queue in 0.000 seconds
2021.03.12 17:31:26 5: alfenVolt: DropFrame called from ReadFn - drop 00980000000b01030840e5f54000000000
2021.03.12 17:31:26 5: alfenVolt: ProcessRequestQueue called from Fhem internal timer as queue:alfenVolt, qlen 2, request: request: id 1, read fc 3 h1201, len 5, tid 95, master device alfenVolt, reading Mode3State (getUpdate for Mode3State len 5), queued 2.15 secs ago
2021.03.12 17:31:26 5: alfenVolt: checkDelays clientSwitchDelay is not relevant
2021.03.12 17:31:26 5: alfenVolt: checkDelays busDelayRead, last activity on bus was 0.002 secs ago, required delay is 0
2021.03.12 17:31:26 5: alfenVolt: checkDelays commDelay, last communication with same device was 0.002 secs ago, required delay is 0.1



Das sollte das Register 374 mit einer 4er Länge sein. Hier kommt ein Wert 44970 raus sollte aber was mit ca.24244 (wH)  sein
Hab eigentlich schon alles durch. Hat das was mit dem 64 Bit und Perl zu tun?
Obwohl ein Unsigned64 funktioniert mit dem richtigen Wert bei mir.

Danke
Grüße
Torte

torte

obwohl warte mal, ich glaub F> passt schon.
Das was ausgelesen wird ist der aktuelle Stand des Zählers und nicht die Differenz.
Wenn ich den alt Stand des Zählers abziehe ist es schlüssig.

Sorry

Grüße
Torte