Neue Versionen und Support zum Modbus-Modul

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

Vorheriges Thema - Nächstes Thema

StefanStrobel

Darf ich fragen, was Du Dir davon versprichst?

Gruss
    Stefan

Wzut

Zitat von: R1F800 am 28 November 2019, 07:11:55
also über UART am PIN 8 / 10 / 12 ?
wenn du an direkt an den beiden GPIOS etwas anklemmst dann ändert sich aus FHEM Sicht lediglich der Port.
D.h. statt etwa /dev/ttyUSBx oder /dev/ttyACMx hat die interne serielle Schnittstelle des RPi /dev/AMA0,
musst nur darauf achten sie auch zuvor "frei" zu machen (config.txt , usw siehe GOOGLE) wie bei allem was da direkt drauf gesteckt wird. 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

R1F800

Zitat von: StefanStrobel am 29 November 2019, 21:05:19
Darf ich fragen, was Du Dir davon versprichst?

Gruss
    Stefan
Das ich kein USB kabelgeraffel an dem PI dran hab, da ich das nicht brauche.

R1F800

Zitat von: Wzut am 29 November 2019, 21:12:06
wenn du an direkt an den beiden GPIOS etwas anklemmst dann ändert sich aus FHEM Sicht lediglich der Port.
D.h. statt etwa /dev/ttyUSBx oder /dev/ttyACMx hat die interne serielle Schnittstelle des RPi /dev/AMA0,
musst nur darauf achten sie auch zuvor "frei" zu machen (config.txt , usw siehe GOOGLE) wie bei allem was da direkt drauf gesteckt wird.
Soweit ok.
Aber wie kann ich dann im Modbus Modul den RX TX switch mitteilen.

franky08

@Stefan
Sooo, hab das Ganze mal auf einem frisch installierten fhem getestet, da zeigt sich der gleiche Fehler! Ich warte iMo auf ein anderes 485 ---> USB Interface (welche Module werden eigentlich benötigt? 00_HM485LAN.pm/10_HM485.pm, 98_Modbus.pm und 98_ModbusSDM530M.pm)
98_Modbus.pm und 98_ModbusSDM530M.pm werden auf jeden Fall benötigt, doch ob HM485LAN oder HM485 benötigt wird ist mir nicht ganz klar!

VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

StefanStrobel

Hallo Frank,

98_Modbus.pm ist das Basis-Modul für Modbus. Das brauchst Du.
98_ModbusSDM530.pm enthält die Registerdefinitionen fpr den Zähler und baut auf 98_Modbus.pm auf.

HM485 etc. haben nichts mit Modbus zu tun und wenn die auf das gleiche RS485-Interface zugreifen wollen, könnte das Probleme machen.

Gruss
   Stefan

ch.eick

#396
Hallo zusammen,

Ich habe einen EM410 mit modbus TCP im Einsatz und wollte mal fragen, ob schon jemand so fleißig war die register zu entschlüsseln?
Für einen Kostal Plenticore 10 Plus habe ich das bereits gemacht und würde mich über einwenig Zeitersparnis freuen.

Viele Grüße
    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

jewuma

Hallo Stefan,

wir versuchen gerade mit einem "IntensisBox" Modbus-Server zu sprechen.
Da hängen diverse Klimageräte dran. Dabei werden die jeweiligen Modbus-Adressen in 100er Schritten auf die einzelnen Geräte gemappt.

Eigentlich wollte ich jetzt ein define mb<id> ModbusINTENSISBOX <id> 60 <IP> TCP für jedes Klimagerät machen.
Entsprechend deinem Post vom 17.04. dachte ich auch, dass man die parseInfo im Rahmen der Define-Funktion auch anpassen kann, so dass
die passenden Register also h1xx für das erste Gerät, h2xx für das 2. Gerät usw. ausgelesen werden können. Leider klappt das nicht.
Offensichtlich existiert hier bei mir ein Denkfehler, denn er liest nur die Adressen, die in der "initialize"-Funktion angegeben werden.
Mein Code sieht so aus:


sub ModbusIBOX_Define($$) {
    my ($hash, $def) = @_;
    my @a = split("[ \t]+", $def);
    my $id=$a[2];
    my %newInfo = (
      "h105" => {
              name => "Ambient Temperature",
              reading => "Ambient_Temperature",
              unpack => "s>",
              expr => '$val/10',
              format => '%.1f C',
              poll => 1,
            },
    );
    $hash->{parseInfo}=\%newInfo;
    #foreach my $key ( keys %{$parseInfo}) {
    #  $newInfo{"h".($key+(100*$id))}=$parseInfo->{$key};
    #}
    Modbus_LD_Define($hash,$def);
}


Hast Du einen Tipp für mich, wie man mehrere Geräte mit verschiedenen Registern einbindet?

Gruß
Jens

jewuma

Das Grundproblem habe ich selbst gelöst, die Define-Funktion wurde nicht ausgelöst, da ich in der Initialize-Funktion


$modHash->{DefFn}      = "ModbusIBOX_Define";
ModbusLD_Initialize($modHash);


anstatt


ModbusLD_Initialize($modHash);
$modHash->{DefFn}      = "ModbusIBOX_Define";


geschrieben hatte.
Irgendwie verstehe ich das mit den Perl-Variablen noch nicht.
Ich dachte eigentlich, wenn man eine Variable in einer Funktion mit "my $var" initialisiert, dann ist diese Variable auch nur in der Funktion sichtbar.
Offensichtlich ist das nicht so...

holle75

#399
Hallo Ihr, "früher" hat mir modbus im fhem-log (sehr viele aufeinanderfolgende) timeout-Fehler geworfen, wenn ein Device (Stromzähler) nicht mehr ansprechbar war. Dies war der Fall, wenn der Stromzähler nicht mehr mit Strom versorgt wurde. Auf diese Fehler im Log konnte ich mit einem notify reagieren.

Mit der aktuellen modbus Version werden diese (vielen) Fehler im Log nicht mehr geschrieben....  und alle Readings bleiben unverändert .... was schade ist, da ich somit nicht mehr automatisiert auf eine fehlende Verbindung mit dem Stromnetz reagieren kann.

Jemand eine Idee, welches Reading ausgelesen werden, oder welches attr gesetzt werden kann, um ein nicht reagierendes Modbus device auch als solches zu identifizieren?

Danke und Gruß

StefanStrobel

Hallo holle75,

timeouts werden nach wie vor geloggt. Das Loglevel ist dabei mit dem Attribut timeoutLogLevel einstellbar. Default ist 3.

Gruß
    Stefan

holle75

Mmh, hatte es vorhin getestet (Zähler stromlos gesetzt) und für diesen Stromzähler kein einziges timeout mehr bekommen. Entgegen den von uns schon öfter besprochenen "normalen" timeouts ;) ... vielleicht während all der gerade parallel laufenden Tests irgendwas durcheinandergekommen. Ich versuche es morgen nochmals.

Ein galanterer Weg existiert nicht? Der ganze Umweg über fhem-log, notify usw. hat mir noch nie ganz gefallen. Gibt es nicht irgend ein Reading, was dir sagt, dass das Device gerade nicht erreichbar ist? Du hast doch sonst so ziemlich alle erdenklichen Manipulationsmöglichkeiten eingebaut ;)

holle75

Jo, funktioniert wie eh und je. Keine Ahnung, warum ich die timeouts im Test nicht bekommen habe.

Noch eine Idee, wie ich ohne den ganzen Umweg erkennen kann, ob ein physisches Modbus Device aktiv/inaktiv ist?

StefanStrobel

Hallo,

Setz doch mal das Attribut profileInterval.
Da werden auch Statistik-Readings zu Timeouts erzeugt.

Gruß
    Stefan

holle75

#404
Ah, very nice. Muss mal schauen, wie viele timeouts bei Stromlos in der entsprechenden Zeitspanne geworfen werden und kann dann darauf triggern. Und dann endlich timeoutloglevel auf 4 setzen :)

Das sagt mir zwar nicht welches Device, aber das etwas nicht stimmt. Bei nur zwei Devices ist die Wahrscheinlichkeit hoch, dass es der entsprechende Stromzähler ist.

Danke Stefan