Neue Versionen und Support zum Modbus-Modul

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

Vorheriges Thema - Nächstes Thema

Andy1981

Hallo Stefan,

Zitat von: StefanStrobel am 20 Januar 2018, 18:17:46
Du könntest aber versuchen, in einer "expr" für eine Adresse per Perl readingsBulkUpdate($hash, "nachWT", $val) aufzurufen.
danke für den Tipp, aber ich habe mich jetzt für einen anderen Weg entschlossen. Da ich sowieso ein arduino als Gateway zwischen meiner Pluggit und FHEM habe, werde ich den arduino als Modbus slave nach der Modbus Spezifikation programmieren. Ich werde in meine Lüftungsanlage noch VOC, Luftdruck, Luftfeuchte und Temperatursensoren einbauen, die Daten will ich auch noch über RS485 an FHEM schicken. Die Kommunikation Arduino Mega zur Pluggit und den Sensoren hab ich fertig, jetzt muss ich noch die Software für einen Modbus slave erstellen. Als Endgültige Version stell ich mir dann noch vor ein paar DI und DO über Modbus mit dem Arduino abzufragen/steuern.

Gruß Andreas

StefanStrobel

Hallo lewej,

Zitat
wenn ich per Modbus eine Digital Input Board anschliesse, wie schnell reagiert fhem hier? Liegt man im millisekunden Bereich oder eher im Sekunden Bereich

Bei Modbus fragt ein Master in regelmäßigen Abständen den Status des Slave ab. Das kann man nicht alle 10 Millisekunden tun. Eher alle 30 Sekunden.
Das ist kein Problem von Fhem sondern vom Protokoll. Wenn Du innerhalb von Millisekunden auf einen Eingang reagieren möchtest, dann sollte das Eingangsmodul sich selbst bei Fhem melden können und nicht darauf warten, dass Fhem nach dem aktuellen Status fragt.

Gruss
   Stefan

Negropo

#77
Zitat von: StefanStrobel am 22 Januar 2018, 22:09:10
Hallo Negropo,
Du kannst z.B. statt bei jedem Input-Register erneut den Unpack-Code und -poll anzugeben entsprechende Defaults für alle Input-Register setzen (dev-i...)Diese Frage verstehe ich nicht. Die Readings werden doch in Fhemweb angezeigt sobald Werte erfolgreich gelesen wurden. Oder klappt das Lesen schon nicht?Auch der set-Befehl muss mit Attributen je Objekt aktiviert werden.
obj-xy-set 1
Im Wiki und der Commandref ist dafür sogar ein Beispiel.

Gruss
   Stefan

Hallo Stefan,

vielen Dank für die Info. Habe es etwas gestrafft.

Zu meiner etwas unverständlichen Frage Die Readings werden bei mir nicht direkt im fhemweb angezeigt sondern lediglich im log-File sehe ich die Werte. Muss ich noch irgendeinen Dummy anlegen und ihm den Wert zuweisen oder wie funktioniert das?

Noch eine Frage zu dem set-Befehl: Ich würde gern einen Taster-Dummy anlegen mit dem ich dann den set-Befehl absetzen kann und somit das Relay ein und ausschalte. Kannst du mir sagen ob und wenn ja, wie der Aufruf sein müsste?!

Hier mal ein Auszug von den Log-Einträgen zu dem ich noch eine Frage habe (habe das Reading auf die coils umgestellt):


2018.01.27 11:46:26 5: NeuronxS10: GetUpdate called
2018.01.27 11:46:26 4: NeuronxS10: update timer modified: will call GetUpdate in 60.0 seconds at 2018-01-27 11:47:26 - Interval 60
2018.01.27 11:46:26 5: NeuronxS10: GetUpdate objects from attributes: c6 c3 c5 c7 c2 c1 c8 c4
2018.01.27 11:46:26 5: NeuronxS10: GetUpdate full object list: c1 c2 c3 c4 c5 c6 c7 c8
2018.01.27 11:46:26 5: NeuronxS10: GetUpdate check c1 => 1, poll = 0, last = 0
2018.01.27 11:46:26 5: NeuronxS10: GetUpdate check c2 => 1, poll = 0, last = 0
2018.01.27 11:46:26 5: NeuronxS10: GetUpdate check c3 => 1, poll = 0, last = 0
2018.01.27 11:46:26 5: NeuronxS10: GetUpdate check c4 => 1, poll = 0, last = 0
2018.01.27 11:46:26 5: NeuronxS10: GetUpdate check c5 => 1, poll = 0, last = 0
2018.01.27 11:46:26 5: NeuronxS10: GetUpdate check c6 => 1, poll = 0, last = 0
2018.01.27 11:46:26 5: NeuronxS10: GetUpdate check c7 => 1, poll = 0, last = 0
2018.01.27 11:46:26 5: NeuronxS10: GetUpdate check c8 => 1, poll = 0, last = 0
2018.01.27 11:46:26 5: NeuronxS10: GetUpdate tries to combine read commands
2018.01.27 11:46:26 5: NeuronxS10: don't sort objList before sending requests


Danke und Gruß
Negropo

StefanStrobel

Hallo Negropo,

in dem von Dir geposteten Log-Ausschnitt sieht man dass das Modbus-Modul prüft, ob die Objekte c1, c2 etc. überhaupt abgefragt werden sollen. Poll=0 bedeutet, dass Du weder im Objekt noch als Default für alle Coils poll auf 1 gesetzt hast. Entsprechend wird nichts abgefragt.
Du brauchst keinen Dummy sondern ein Attribut wie in den Beispielen der Anleitung.

Wenn Du ein Relais per Coil 1 schalten möchtest und dieses z.B. als obj-c1-reading Relais1 benannt hast, dann würdest Du mit obj-c1-set 1 den Set-Befehl ermöglichen und dann z.B. mit set Relais1 1 schalten.

Gruß
     Stefan.

Herjemine

Hallo Stefan,

hast Du seit der 98_Modbus.pm 98_ModbusAttr.pm von 2017-07-15 noch was am IP Reconnect gemacht?
Muss ich für den Reconnect ein Timeout  Attribut setzen?

Bei mir bleiben die Devices immer mal wieder mit disconnect hängen, bis ich nen fhem neustart mache.

Gruß Hermann

device111

Hallo zusammen,

hab jetzt mal das "saveAsModule" Module feature probiert und es funktioniert auch einwandfrei.

Das Modul ist für eine IDM Wärmepumpe mit Navigator 1.7

Einfach ins FHEM Verzeichnis kopieren und definieren als Modul: "ModbusGenIDM <Parameter>".

Danke an Stefan für das echt coole Modbusattr. 

Viel Spass damit.

Gruß,
Martin

StefanStrobel

Hallo Hermann,

Zitat von: Herjemine am 31 Januar 2018, 12:22:51
hast Du seit der 98_Modbus.pm 98_ModbusAttr.pm von 2017-07-15 noch was am IP Reconnect gemacht?
Muss ich für den Reconnect ein Timeout  Attribut setzen?

Im letzten Update habe ich zwar Änderungen am Timeout machen müssen, aber ich kann mir eigentlich nicht vorstellen, dass die negative Auswirkungen haben können. Bei TCP basierten Verbindungen sollte aber maxTimeoutsToReconnect gesetzt werden. Dann versucht das Modul nach der Anzahl vorgegebener Timeouts die TCP-Verbindung neu aufzubauen.
Hast Du das schon gesetzt?

Gruss
  Stefan

mani

Hallo @Stefan Strobl,

wie gewünscht nun meine Frage betreffend Varista Ernergyguard.

Ich habe vom Hersteller nachfolgende Info zur RS485 Schnittstelle erhalten,

Informationen zum RS 485 Anschluß
Sie können eine Schnittstelle zum Energiezähler RS485 verwenden, wenn Sie z.B. einen RS485-USBKonverter
(Beispiel TTL-485) und eine Modbus Pol-Software haben.
Sie können alle Register vom Stromzähler inklusive Strom und Strom für eine Phase lesen.
Verbindung mit RS485:
MAPPING DEVICE DATEN
Aufgrund der Beschaffenheit des ModBus-Protokolls sind die Daten in vier Speicherbereiche
unterteilt:
InputRegister (16-Bit-Variablen im Nur-Lese-Modus)
InputStatus (1-Bit-Variablen im Nur-Lese-Modus)
HoldingRegister (16-Bit allgemein nicht-flüchtige Variablen)
CoilStatus (1-Bit-Variablen)
Das Gerät ist kompatibel mit den gängigsten ModBus-Befehlen wie Single und
sequentielles Lesen aller Speicherplätze und einmaliges Schreiben aller Halteregister und
Spulenstatus.
Das Gerät kann als Doppel-Dreiphasen-Energiezähler oder als sechs Einphasen-Energie verwendet
werden Meter. Stichprobendaten werden in zwei Gruppen von InputRegister gruppiert:
1) Adresse 0-88 für sechs einphasigen Betrieb
2) Adresse 100-201 für Doppel-Dreiphasenbetrieb
Der ZR-HM3-EM hat folgende Daten:
(89 + 102) Eingaberegister
3 Eingabestatus
3 HoldingRegister
2 Spulenstatus



InputRegister [120] Phasenspannung L3 B
InputRegister [121] Phasenstrom L1 A
InputRegister [122] Phasenstrom L2 A
InputRegister [123] Phasenstrom L3 A
InputRegister [124] Gesamtphasenstrom A Hi
InputRegister [125] Gesamtphasenstrom A Lo
InputRegister [126] Phasenstrom L1 B
InputRegister [127] Phasenstrom L2 B
InputRegister [128] Phasenstrom L3 B
InputRegister [129] Gesamtphasenstrom B Hi
InputRegister [130] Gesamtphasenstrom B Lo
InputRegister [131] Netzfrequenz
InputRegister [132] Wirkleistung L1 A
InputRegister [133] Wirkleistung L2 A
InputRegister [134] Wirkleistung L3 A
InputRegister [135] Total Wirkleistung A Hi
InputRegister [136] Summe Wirkleistung A Lo
InputRegister [137] Wirkleistung L1 B
InputRegister [138] Wirkleistung L2 B
InputRegister [139] Wirkleistung L3 B
InputRegister [140] Total Wirkleistung B Hi
InputRegister [141] Total Wirkleistung B Lo
InputRegister [142] Blindleistung L1 A
InputRegister [143] Blindleistung L2 A
InputRegister [144] Blindleistung L3 A
InputRegister [145] Total Blindleistung A Hi
InputRegister [146] Total Blindleistung A Lo
InputRegister [147] Blindleistung L1 B
InputRegister [148] Blindleistung L2 B
InputRegister [149] Blindleistung L3 B
InputRegister [150] Gesamtreaktive Leistung B Hi
InputRegister [151] Total Blindleistung B Lo
InputRegister [152] Scheinleistung L1 A
InputRegister [153] Scheinleistung L2 A
InputRegister [154] Scheinleistung L3 A
InputRegister [155] Scheinleistung A Hi
InputRegister [156] Scheinleistung A Lo
InputRegister [157] Scheinleistung L1 B
InputRegister [158] Scheinleistung L2 B
InputRegister [159] Scheinleistung L3 B
InputRegister [160] Gesamte Scheinleistung B Hi
InputRegister [161] Scheinleistung gesamt B Lo
InputRegister [162] Leistungsfaktor L1 A
InputRegister [163] Leistungsfaktor L2 A
InputRegister [164] Leistungsfaktor L3 A
InputRegister [165] Gesamtleistungsfaktor A
InputRegister [166] Leistungsfaktor L1 B
InputRegister [167] Leistungsfaktor L2 B
InputRegister [168] Leistungsfaktor L3 B
InputRegister [169] Gesamtleistungsfaktor B
InputRegister [170] Aktive Energie L1 A Hi
InputRegister [171] Aktive Energie L1 A Lo
InputRegister [172] Aktive Energie L2 A Hi
InputRegister [173] Aktive Energie L2 A Lo
InputRegister [174] Aktive Energie L3 A Hi
InputRegister [175] Aktive Energie L3 A Lo


Nun möchte ich z.B datenpunkt 135 und 140 Auslesen, dazu habe ich folgende Config erstellt:

define ModbusRS485 Modbus /dev/ttyAMA0@9600
define varista ModbusAttr 5 60 RTU
attr varista userattr obj-h135-reading obj-h140-reading
attr varista IODev ModbusRS485
attr varista obj-h135-reading Total Wirkleistung A HI
attr varista obj-h140-reading Total Wirkleistung B HI


kann ich das so machen?


Danke Mfg Mani
RasPi B+,Onkyo_AVR,Luxtronik2,Logo7,Mpd,Arduino Uno mit Ethernet,KNX,Jablotron

StefanStrobel

Hallo mani,

neben der Zuordnung eines Namens zu einem Objekt sollte man noch den Datentyp als unpack-Code festlegen.
Wenn die Werte Integer ohne Vorzeichen sind, wäre das ein n. Eventuell ist es aber auch ein s>.
Siehe http://perldoc.perl.org/functions/pack.html.

Falls die Werte automatisch alle 60 Sekunden abgefragt werden sollen (60 hast Du ja beim Define angegeben), dann fehlt auch noch ein -poll Attribut.
Oder falls Du die Werte bei Bedarf mit get abfragen möchtest, ein -showGet.

Am besten liest Du Dir einmal die komplette Beschreibung im Wiki durch:
https://wiki.fhem.de/wiki/ModbusAttr

Dann wäre es noch wichtig, dass die Modbus-Adresse des Geräts stimmt. Im Define hast Du 5 angegeben. Viele Geräte stehen per Default erst mal auf 1. Die Seriellen Parameter müssen natürlich auch stimmen (Baudrate, Parität, Stoppbits etc.). Bei RS2232 ist das oft 9600, 8, N, 1.
Bei RS485 mit Modbus ist es oft eine "even" Parity.

Gruss
   Stefan


mani

Hallo @Stefan,

habe die config so angepasst...define ModbusRS485 Modbus /dev/ttyUSB0@9600,8,N,1
define varista ModbusAttr 1 10 RTU
attr varista userattr IODev obj-h135-poll obj-h135-reading obj-h135-unpack obj-h140-poll obj-h140-reading obj-h140-unpack verbose
attr varista IODev ModbusRS485
attr varista obj-h135-poll 1
attr varista obj-h135-reading Total Wirkleistung A HI
attr varista obj-h135-unpack n
attr varista obj-h140-poll 1
attr varista obj-h140-reading Total Wirkleistung B HI
attr varista obj-h140-unpack n
attr varista verbose 5



und das steht im log

2018.02.15 09:00:04 5: Cmd: >attr varista verbose 5<

2018.02.15 09:00:04 5: Cmd: >setstate ModbusRS485 opened<
2018.02.15 09:00:04 5: Cmd: >setstate ModbusRS485 2018-02-15 08:50:19 state opened<


2018.02.15 09:00:09 4: varista: update timer modified: will call GetUpdate in 10.0 seconds at 2018-02-15 09:00:19 - Interval 10
2018.02.15 09:00:09 5: varista: GetUpdate called
2018.02.15 09:00:09 5: varista: GetUpdate objects from attributes: h135 h140
2018.02.15 09:00:09 5: varista: GetUpdate full object list: h135 h140
2018.02.15 09:00:09 5: varista: GetUpdate check h135 => Total Wirkleistung A HI, poll = 1, last = 0
2018.02.15 09:00:09 4: varista: GetUpdate will request Total Wirkleistung A HI
2018.02.15 09:00:09 5: varista: GetUpdate check h140 => Total Wirkleistung B HI, poll = 1, last = 0
2018.02.15 09:00:09 4: varista: GetUpdate will request Total Wirkleistung B HI
2018.02.15 09:00:09 5: varista: GetUpdate tries to combine read commands
2018.02.15 09:00:09 5: varista: No Combine Total Wirkleistung A HI / h135 with Total Wirkleistung B HI / h140, span 6 > max 1
2018.02.15 09:00:09 4: varista: Send called with h135, len 1 / span 1 to id 1, op read, qlen 0, value hex 30
2018.02.15 09:00:09 4: varista: Send queues fc 3 to 1, for h135 (Total Wirkleistung A HI), len/span 1, value hex 30
2018.02.15 09:00:09 4: ModbusRS485: HandleSendQueue sends fc 3 to id 1, tid 77 for Total Wirkleistung A HI (h135), len 1, device varista (RTU), pdu 0300870001, V 3.5.12 - 06.01.2017
2018.02.15 09:00:09 5: SW: 0103008700013423
2018.02.15 09:00:09 4: varista: Send called with h140, len 1 / span 1 to id 1, op read, qlen 0, value hex 30
2018.02.15 09:00:09 4: varista: Send queues fc 3 to 1, for h140 (Total Wirkleistung B HI), len/span 1, value hex 30
2018.02.15 09:00:10 5: redefine at command EinTrittDown as +*
2018.02.15 09:00:25 3: ModbusRS485: timeout waiting for fc 3 from id 1, (h140), Request was 0103008c000145e1, Buffer contains
2018.02.15 09:00:25 4: ModbusRS485: HandleSendQueue sends fc 3 to id 1, tid 157 for Total Wirkleistung A HI (h135), len 1, device varista (RTU), pdu 0300870001, V 3.5.12 - 06.01.2017
2018.02.15 09:00:25 5: SW: 0103008700013423
1 to id 1, op read, qlen 0, value hex 30
2018.02.15 09:01:01 4: varista: Send queues fc 3 to 1, for h140 (Total Wirkleistung B HI), len/span 1, value hex 30
2018.02.15 09:01:01 4: ModbusRS485: HandleSendQueue sends fc 3 to id 1, tid 33 for Total Wirkleistung B HI (h140), len 1, device varista (RTU), pdu 03008c0001, V 3.5.12 - 06.01.2017
2018.02.15 09:01:01 5: SW: 0103008c000145e1
2018.02.15 09:01:01 4: varista: Send called with h135, len 1 / span 1 to id 1, op read, qlen 0, value hex 30
2018.02.15 09:01:01 4: varista: Send queues fc 3 to 1, for h135 (Total Wirkleistung A HI), len/span 1, value hex 30



würdest du sagen das da eine Kommunikation möglich ist?





mfg Mani
RasPi B+,Onkyo_AVR,Luxtronik2,Logo7,Mpd,Arduino Uno mit Ethernet,KNX,Jablotron

StefanStrobel

Hallo Mani,

Dein Gerät antwortet nicht.
Stimmt die Modbus Id?
Sind die seriellen Parameter korrekt?

Gruß
   Stefan

mani

Hallo,
Hab ich schon befürchtet.... Weiß die Einstellungen leider nicht werde den Hersteller nochmals kontaktieren.
Danke
Mfg Mani
RasPi B+,Onkyo_AVR,Luxtronik2,Logo7,Mpd,Arduino Uno mit Ethernet,KNX,Jablotron

hauwech

Hallo an die Experten,

ich versuche mich der Beantwortung meiner Frage hier: https://forum.fhem.de/index.php/topic,84669.0.html schrittweise zu nähern.
Ich bin im Bereich Hardware, Arduino usw. nicht so zu Hause.
Kann es sein, daß Modbus für die RS485 Kamera Anbindung an fhem hier mein Freund ist?

Danke und Gruß
Roland
Fhem auf Intel NUC11TNKi5+M2 NVMe+32GB RAM mit Ubuntu 22.04 LTS

StefanStrobel

Hallo Roland,

mit Modbus hat das Kommunikationsprotokoll Deiner Kamera leider nichts zu tun.

Gruss
   Stefan

hauwech

Hallo Stefan,

schade. Der USB-RS485 Adapter schlägt im System als Feb 23 11:21:44 fhem-nuc kernel: [144936.011906] usb 1-2: ch341-uart converter now attached to ttyUSB0

Deswegen dachte ich, daß man mit sowas wie echo <command> > /dev/ttyUSB0 die in der Kamera-Doku beschriebenen Commands hinschicken kann oder eben mit
define ModBusLine Modbus /dev/ttyUSB0@9600 von fhem aus was machen kann und die Kamera empfängt die Daten stumpf und setzt sie im internen RS485 Controller um.

Möglicherweise habe ich aber aus Unkenntnis einfach zu einfach gedacht.

Danke und Gruß
Roland
Fhem auf Intel NUC11TNKi5+M2 NVMe+32GB RAM mit Ubuntu 22.04 LTS