Neue Versionen und Support zum Modbus-Modul

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

Vorheriges Thema - Nächstes Thema

ch.eick

#495
Hallo max333,

ich denke das kann das Modbus Modul nicht direkt selber unterstützen, da es eine weitergehende Auswertung der übermittelten Werte ist.
In einem Device habe ich mal innerhalb des userreadings nicht mehr benötigte Readings entfernt, was sicherlich nicht die tollste Lösung sein wird.

Dieses Beispiel erstellt aus drei readings ein lesbares Datum und löscht anschließend die einzelnen readings

consumption_WaterDailyDate:consumption_WaterDailyDate-1.* {my $date=sprintf("%4d-%02d-%02d",ReadingsVal("$NAME","consumption_WaterDailyDate-3",0),ReadingsVal("$NAME","consumption_WaterDailyDate-2",0),ReadingsVal("$NAME","consumption_WaterDailyDate-1",0) );; fhem("deletereading $NAME  consumption_WaterDailyDate-.*");; $date }


Wenn Du so etwas wie fhem("deletereading $NAME  consumption_WaterDailyDate-.*") in eine if Abfrage auf den Status einbaust, dann wären Deine Readings weg, die Events kommen jedoch trotzdem.
Sollte sich der Inhalt der Readings bei einem negativen Status jedoch nicht verändern, dann könntest Du mal mit event-on-change experimentieren.

Gruß
   Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

max333

Das nachträgliche Löschen ist für mich leider keine Option, denn die falschen Werte sind schon in der LogDB und es kommt zu Fehlermeldungen im Log.

ch.eick

Zitat von: max333 am 06 Juli 2020, 10:43:07
Das nachträgliche Löschen ist für mich leider keine Option, denn die falschen Werte sind schon in der LogDB und es kommt zu Fehlermeldungen im Log.

Wenn Du ein Modul erstellt hast, musstest Du den Status zuerst abfragen und die restlichen Werte dann ueberspringen.
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

StefanStrobel

#498
dafür gibt es folgendes Attribut:

Zitat
obj-[cdih][1-9][0-9]*-ignoreExpr
defines a perl expression that returns 1 if a value should be ignored and the existing reading should not be modified
beziehungsweise
Zitat
dev-([cdih]-)*defIgnoreExpr
defines a default Perl expression to decide when values should be ignored.

Allerdings muss man dabei aufpassen, welche Werte in welcher Reihenfolge bzw. zusammen gelesen werden...

Gruss
   Stefan Strobel

max333

Ich habe das mit obj-[cdih][1-9][0-9]*-ignoreExpr hinbekommen, vielen Dank für den Tipp.

der-Lolo

Guten Morgen Community - Stefan,
ich habe keine ahnung seit wann es so ist - aber ich habe via Modbus meinen Wärmemengenzähler eingebunden. Aus mir unerklärlichen Gründen kommen hier "ohne Ende" Events an.

2020-07-15 08:26:44 statistics statistic Updated stats for: WMZ
2020-07-15 08:26:44 ModbusAttr WMZ Vorlauftemperatur: 24.7
2020-07-15 08:26:44 ModbusAttr WMZ Spreizung: -1.7
2020-07-15 08:26:44 ModbusAttr WMZ Waermeleistung: 0.0
2020-07-15 08:26:44 ModbusAttr WMZ aktAZ: 0.00
2020-07-15 08:26:44 ModbusAttr WMZ statGesamtWaermemenge: Hour: 0.000 Day: 0.006 Month: 0.089 Year: 1.466 (since: 2020-03-23 )
2020-07-15 08:26:44 ModbusAttr WMZ Spreizung: -1.7
2020-07-15 08:26:44 ModbusAttr WMZ Waermeleistung: 0.0
2020-07-15 08:26:44 ModbusAttr WMZ aktAZ: 0.00
2020-07-15 08:26:44 statistics statistic Updated stats for: WMZ
2020-07-15 08:26:44 ModbusAttr WMZ Ruecklauftemperatur: 26.4
2020-07-15 08:26:44 ModbusAttr WMZ Spreizung: -1.7
2020-07-15 08:26:44 ModbusAttr WMZ Waermeleistung: 0.0
2020-07-15 08:26:44 ModbusAttr WMZ aktAZ: 0.00
2020-07-15 08:26:44 ModbusAttr WMZ statGesamtWaermemenge: Hour: 0.000 Day: 0.006 Month: 0.089 Year: 1.466 (since: 2020-03-23 )
2020-07-15 08:26:44 ModbusAttr WMZ Spreizung: -1.7
2020-07-15 08:26:44 ModbusAttr WMZ Waermeleistung: 0.0
2020-07-15 08:26:44 ModbusAttr WMZ aktAZ: 0.00
2020-07-15 08:26:44 statistics statistic Updated stats for: WMZ
2020-07-15 08:26:44 ModbusAttr WMZ gesamtWaermemenge: 40.629
2020-07-15 08:26:44 ModbusAttr WMZ Spreizung: -1.7
2020-07-15 08:26:44 ModbusAttr WMZ Waermeleistung: 0.0
2020-07-15 08:26:44 ModbusAttr WMZ aktAZ: 0.00
2020-07-15 08:26:44 ModbusAttr WMZ statGesamtWaermemenge: Hour: 0.000 Day: 0.006 Month: 0.089 Year: 1.466 (since: 2020-03-23 )
2020-07-15 08:26:44 ModbusAttr WMZ Spreizung: -1.7
2020-07-15 08:26:44 ModbusAttr WMZ Waermeleistung: 0.0
2020-07-15 08:26:44 ModbusAttr WMZ aktAZ: 0.00
2020-07-15 08:26:44 statistics statistic Updated stats for: WMZ
2020-07-15 08:26:44 ModbusAttr WMZ aktWaermeleistung: 0
2020-07-15 08:26:44 ModbusAttr WMZ Spreizung: -1.7
2020-07-15 08:26:44 ModbusAttr WMZ Waermeleistung: 0.0
2020-07-15 08:26:44 ModbusAttr WMZ aktAZ: 0.00
2020-07-15 08:26:44 ModbusAttr WMZ statGesamtWaermemenge: Hour: 0.000 Day: 0.006 Month: 0.089 Year: 1.466 (since: 2020-03-23 )
2020-07-15 08:26:44 ModbusAttr WMZ Spreizung: -1.7
2020-07-15 08:26:44 ModbusAttr WMZ Waermeleistung: 0.0
2020-07-15 08:26:44 ModbusAttr WMZ aktAZ: 0.00
2020-07-15 08:26:44 statistics statistic Updated stats for: WMZ
2020-07-15 08:26:44 ModbusAttr WMZ Durchfluss: 0
2020-07-15 08:26:44 ModbusAttr WMZ Spreizung: -1.7
2020-07-15 08:26:44 ModbusAttr WMZ Waermeleistung: 0.0
2020-07-15 08:26:44 ModbusAttr WMZ aktAZ: 0.00
2020-07-15 08:26:44 ModbusAttr WMZ statGesamtWaermemenge: Hour: 0.000 Day: 0.006 Month: 0.089 Year: 1.466 (since: 2020-03-23 )
2020-07-15 08:26:44 ModbusAttr WMZ Spreizung: -1.7
2020-07-15 08:26:44 ModbusAttr WMZ Waermeleistung: 0.0
2020-07-15 08:26:44 ModbusAttr WMZ aktAZ: 0.00


Eigentllich brauche ich jeden Wert ja nur einmal. Habe aber keine Idee wie ich hier einfluss nehmen kann.
Vielleicht habt Ihr eine Idee...

Noch ein list des Devices:
Internals:
   DEF        35 30
   FUUID      5e765a10-f33f-c6c7-f386-bc294aafb8467fbb
   INTERVAL   30
   IODev      modbusRTU
   MODBUSID   35
   MODE       master
   MODULEVERSION Modbus 4.1.5 - 17.9.2019
   NAME       WMZ
   NOTIFYDEV  global
   NR         16
   NTFY_ORDER 50-WMZ
   PROTOCOL   RTU
   STATE      opened
   TRIGGERTIME 1594794698.36077
   TRIGGERTIME_FMT 2020-07-15 08:31:38
   TYPE       ModbusAttr
   lastUpdate 1594794668.36077
   FRAME:
   READ:
   READINGS:
     2020-07-15 08:31:10   Durchfluss      0
     2020-07-15 08:31:09   Ruecklauftemperatur 26.4
     2020-07-15 08:31:11   Spreizung       -1.7
     2020-07-15 08:31:10   Vorlauftemperatur 24.7
     2020-07-15 08:31:11   Waermeleistung  0.0
     2020-07-15 08:31:11   aktAZ           0.00
     2020-07-15 08:31:10   aktWaermeleistung 0
     2018-10-01 06:13:08   gesElektrAm01.10.18 3739.418
     2019-10-01 06:54:03   gesElektrAm01.10.19 5811.907
     2018-09-30 22:27:43   gesWaermeAm01.10.18 22.384
     2019-10-01 06:51:18   gesWaermeAm01.10.19 32.031
     2020-07-15 08:31:10   gesamtWaermemenge 40.629
     2020-07-15 08:31:11   statGesamtWaermemenge Hour: 0.000 Day: 0.006 Month: 0.089 Year: 1.466 (since: 2020-03-23 )
     2020-07-15 07:59:55   statGesamtWaermemengeLast Hour: 0.000 Day: 0.007 Month: 0.189 Year: -
     2020-03-22 19:17:31   statStateDay    opened: 19:17:36 opened_Count: 1
     2020-03-21 23:59:55   statStateDayLast opened: 04:20:56 opened_Count: 1 (since: 2020-03-21_19:38:59)
     2020-03-22 19:17:31   statStateMonth  opened: 23:38:32 opened_Count: 1 (since: 2020-03-21_19:38:59)
     2020-03-22 19:17:31   statStateYear   opened: 23:38:32 opened_Count: 1 (since: 2020-03-21_19:38:59)
     2020-07-15 08:31:00   state           opened
   REMEMBER:
     lrecv      1594794670.4295
     lsend      1594794670.40396
   gotReadings:
     Durchfluss 0
   helper:
     _98_statistics statistic
   lastRead:
     h256       1594794670.3028
     h258       1594794670.43084
     h262       1594794670.17471
     h264       1594794670.04711
     h266       1594794669.91922
Attributes:
   IODev      modbusRTU
   comment    aktAZ {sprintf("%.2f",ReadingsVal("WMZ","aktWaermeleistung","0")*1000 / ReadingsVal("SDM630","Power_L2__W","0"))},
   dev-h-defBswapRegs 1
   dev-h-defPoll 1
   event-on-update-reading .*
   obj-h256-format %.3f
   obj-h256-len 2
   obj-h256-reading gesamtWaermemenge
   obj-h256-showGet 1
   obj-h256-unpack f
   obj-h258-len 2
   obj-h258-reading Durchfluss
   obj-h258-showGet 1
   obj-h258-unpack f
   obj-h262-len 2
   obj-h262-reading aktWaermeleistung
   obj-h262-showGet 1
   obj-h262-unpack f
   obj-h264-format %.1f
   obj-h264-len 2
   obj-h264-reading Vorlauftemperatur
   obj-h264-showGet 1
   obj-h264-unpack f
   obj-h266-format %.1f
   obj-h266-len 2
   obj-h266-reading Ruecklauftemperatur
   obj-h266-showGet 1
   obj-h266-unpack f
   room       ModbusRTU
   userReadings Spreizung {sprintf("%.1f",ReadingsVal("WMZ","Vorlauftemperatur","0") - ReadingsVal("WMZ","Ruecklauftemperatur","0"))},
Waermeleistung {sprintf("%.1f",ReadingsVal("WMZ","aktWaermeleistung","0")*1000)},
aktAZ {sprintf("%.2f",ReadingsVal("WMZ","aktWaermeleistung","0")*1000 / ReadingsVal("SDM630","Power_L2__W","0"))}
   userattr   IODev dev-h-defBswapRegs dev-h-defPoll disable event-min-interval event-on-change-reading event-on-update-reading obj-h256-format obj-h256-len obj-h256-poll obj-h256-reading obj-h256-showGet obj-h256-unpack obj-h258-format obj-h258-len obj-h258-poll obj-h258-reading obj-h258-showGet obj-h258-unpack obj-h262-format obj-h262-len obj-h262-poll obj-h262-reading obj-h262-showGet obj-h262-unpack obj-h264-format obj-h264-len obj-h264-poll obj-h264-reading obj-h264-showGet obj-h264-unpack obj-h266-format obj-h266-len obj-h266-poll obj-h266-reading obj-h266-showGet obj-h266-unpack userReadings


Ich kann mir vorstellen das es mit dem userattr zusammenhängt - kann mir auch nicht erklären wo das herkommt, bzw. wie es entstanden ist.
Habe aber versucht das ganze userattr zu löschen, es hat scheinbar keinen Einfluss auf die Event menge...

Mein DB-Log stellt im nachhinein das hauptproblem da, ich habe etwa 40.000 Einträge zuviel pro Tag.

Ich hoffe es hat jemand eine Idee wie ich es hinbekommen kann das der Wärmemengenzähler nicht mehr ganz so gesprächig ist.

Gruß aus Berlin,
der-lolo

ch.eick

#501
Zitat von: der-Lolo am 15 Juli 2020, 08:36:48
   event-on-update-reading .*

Hier wuerde ich mal nur die readings angeben, die Du wirklich haben willst.
Eventuell waere auch event-on-change-reading denkbar, dann gibt es nur Events, wenn der Wert anders ist als der Vorherige.
Das hat natuerlich zur Folge, dass es zu Plotabbruechen kommen kann, wenn die Aenderungen zu lange (Tageswechsel) auseinander liegen.
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

der-Lolo

Ja ch.eick -
grundsätzlich gebe ich Dir recht - frage mich aber warum ich innerhalb eines Lesezykluses mehrfach Updates bekomme.
Und warum die Wärmeleistung z.b. auch innerhalb einer Sekunde mehrfach reinkommt...
Bei der Spreizung kann ich es ja noch verstehen, weil die ja über ein userReading gerechnet wird.
Ich dachte das jedes angefragte object einmal pro Lesezyklus abgerufen wird...



Ich finde das userAttr komisch - zumal wenn ich es lösche, speicher und einen shutdown restart absetze das user Attr sich automatisch wieder setzt...
Oder wird das automatisch vom Modul generiert?

ch.eick

Zitat von: der-Lolo am 15 Juli 2020, 18:49:42
Ich finde das userAttr komisch - zumal wenn ich es lösche, speicher und einen shutdown restart absetze das user Attr sich automatisch wieder setzt...
Oder wird das automatisch vom Modul generiert?
Ich meine auch, dass es automatisch generiert wird und nur eine Liste aller attribute darstellt.
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

Zitat von: der-Lolo am 15 Juli 2020, 18:49:42
grundsätzlich gebe ich Dir recht - frage mich aber warum ich innerhalb eines Lesezykluses mehrfach Updates bekomme.
Und warum die Wärmeleistung z.b. auch innerhalb einer Sekunde mehrfach reinkommt...
Bei der Spreizung kann ich es ja noch verstehen, weil die ja über ein userReading gerechnet wird.
Ich dachte das jedes angefragte object einmal pro Lesezyklus abgerufen wird...
Bei meinen Modbus devices hat das auf jedenfall fuer Ruhe gesorgt. Ich schau auch immer zu beginn in das event log, bis ich nur noch das sehe was ich haben moechte.

Wie hast Du das mit dem WMZ angeschlossen, ich habe einen mit einer Leseschnittstelle integriert, habe aber noch nicht den passenden Lesekopf gefunden :-(

Gruss
     Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

abc2006

Hallo Stefan,
ich habe ein Problem mit Modbus. Darf ich kurz verlinken?
https://forum.fhem.de/index.php/topic,112869.0.html

Muss mir noch angewöhnen, *vorher* in die Maintainer zu schauen, um das richtige Forum zu finden...
Die Suche hat leider nix brauchbares ergeben, und ich bin mit meinem Perl am Ende :)

Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Wolfshund

#506
Hallo ,

mein Modbus läuft relativ dank Stefans Hilfe, und ich bekomme inzwische auch richtige Werte.
Ein Problen kann ich momentan nicht lösen.
Ich lese aus ainem Weidmüller Energy meter ein Register aus
attr WeidMuellerInput dev-h-defLen 2
attr WeidMuellerInput dev-h-defPoll 1
attr WeidMuellerInput dev-h-defRevRegs 0
attr WeidMuellerInput dev-h-defShowGet 1
attr WeidMuellerInput dev-h-defUnpack f>
attr WeidMuellerInput event-on-change-reading .*
attr WeidMuellerInput event-on-update-reading .*
attr WeidMuellerInput obj-h19026-reading r19026


r19026                      189.201049804688



Dieses Reading möchte ich nun in zwei Teile zerlegen um es dann in zwei 16 bit Register eines anderen Modbus devices zu schreiben

was nachher rauskommen soll ist etwa folgendes


das eingelesene Register s.o.     float             189.201049804688


register100  (anderes Device)                      0x433d
register101 (anderes Device)                       0x3378

das ganze würde ich über notifys lösen

Ich scheitere momentan an der Umrechnung float in zweimal 16 bit.


Liebe Grüße,

Andreas



Raspberry PI, Mysensors Serial Gateway, Firmata Relais,Mysensors Dallas/Relais, Mysensors Dallas mit Nokia Display

der-Lolo

@ch.eik - Danke, ich habe mit event-on-change und event-min-interval für ruhe gesorgt...
Mein WMZ hat eine "eingebaute" Modbus Schnittstelle - also kein Lesekopf oder ähnliches.

StefanStrobel

Hallo Andreas,

wenn Du auf dem Ziel-Gerät auch einen Float-Wert hast, der über zwei Register geht, dann musst Du die nicht einzeln schreiben. Statt dessen kannst Du die Länge des Objekts auf zwei setzen und mit dem passenden Unpack-code einen Float-Wert direkt über zwei Register schreiben. Es kommt aber darauf an, wie das Ziel-Gerät den Wert haben will...

Gruss
   Stefan

Nestor

Hello Stefan,

Attached is small patch to optimize the event processing in Fhem. For ModbusAttr module this NOTIFYDEV was already set. ;)

--- - 2020-07-25 01:14:07.434805432 +0200
+++ /srv/fhem/FHEM/98_Modbus.pm 2020-07-25 01:13:34.000000000 +0200
@@ -547,6 +547,7 @@
     $ioHash->{DeviceName} = $dev;           # needed by DevIo to get Device, Port, Speed etc.       
     $ioHash->{IODev}      = $ioHash;        # point back to self to make getIOHash easier
     $ioHash->{SerialConn} = 1;
+    $ioHash->{NOTIFYDEV}  = "global";       # NotifyFn nur aufrufen wenn global events (INITIALIZED etc.)
     
     Modbus_Close($ioHash, 1);               # close, set Expect, clear Buffer, but don't set state to disconnected