FHEM als Modbus Slave

Begonnen von SkyFox, 25 Januar 2016, 23:24:22

Vorheriges Thema - Nächstes Thema

SkyFox

Hallo,

ich mochte gern das FHEM als Modbus-Slave fungiert und dabei die GPIO (Raspberry) + einige Werte von FHEM auf bestimmte Register legen. Diese würde ich dann von extern auslesen.
Gibt es eine Möglichkeit dazu?

Danke im Voraus.

SkyFox

keiner der eine Antwort kennt?

ChrisD

#2
Hallo,

Anbei findest du ein Modul das ich vor langer Zeit für diesen Zweck geschrieben hatte (nur Lesezugriffe). Ich habe es an FHEM 5.7 angepasst und die Möglichkeit zum Schreiben hinzugefügt.

Das Modul wird mit
define mbcc ModbusTCP_CCeingebunden. Da für ModbusTCP Port 502 verwendet wird muss FHEM root/Administratorrechte haben. Falls dies nicht möglich (oder erwünscht) ist kann ein anderer Port (>1024) mit angegeben werden:
define mbcc ModbusTCP_CC 10502 Der Master muss dann auch dementsprechend angepasst werden.

Die Verbindung von FHEM-Readings zu Modbus-Registern erfolgt über das Kommentarfeld des jeweiligen Gerätes. Für einen Homematic Thermostat (HM-TC-CC) mit dem Namen th könnte es z.B. so aussehen:
attr th comment MBR:1,1,I,measured-temp,N,10:1,2,I,humidity:1,21,H,desired-temp,N,10
Das Reading measured-temp ist unter UnitId 1, Inputregister 1 erreichbar, humidity unter UnitId 1, Inputregister 2 und desired-temp unter UnitId 1, Holdingregister 21. Die Werte von measured-temp und desired-temp werden beim Lesen mit 10 multipliziert (und beim Schreiben durch 10 geteilt), negative Werte werden im 2er-Komplement dargestellt.

Das Format für das Kommentarfeld ist:
MBR:<unitId>,<register>,<register type>[,<reading>[,<negative representation>[,<multiplier>[,<offset>]]]]
mit
    <unitId> - Unit Id (0 - 255), * für beliebig
    <register> - Registernummer (1 - 65536) (Achtung, dies ist nicht die Adresse)
    <register type> - I für Inputregister (nur Lesen), H für Holdingregister (Lesen und Schreiben), * für beide
    <reading> - optional, Name des Readings, wenn nicht angegeben wird 'state' verwendet
    <negative representation> - optional, T for 2er Komplement, bei jedem anderen Wert werden negative Zahlen auf 0 gesetzt
    <multiplier> - optional, Multiplikator, angewandt beim Lesen, beim Schreiben als Divisor verwendet
    <offset> - optional, Offset der beim Lesen zum Reading addiert wird, beim Schreiben wird er abgezogen

Grüße,

ChrisD

Edit: Die aktuelle Version des Moduls kann mit
update force https://raw.githubusercontent.com/ChrisD70/FHEM-Modules/master/autoupdate/mbs/controls_mbcc.txtdirekt in FHEM installiert werden.

monty_burns_007

#3
Danke Chris für deine Module.
Ich suche auch ein Module wo den FHEM Daten über Modbus TCP Adresse (holdiing registers) lese und schriebbar sind.
So kann ich zb. mit ein standard HMI panel (WinCCFlex/Vijeo/...) über modbus TCP ein HMI machen die FHEM data visualisiert.

Ist die Module in diese Thread die letzte versione ? Oder gibt es da schon ein neuere ?

Werde diese Module mal ausprobieren.
edit: habe es mal installiert und es funzt super !

Nur integers sind moglich ? Floating values are not possible to map to 4 registers as real format ?
Einige losing wird dann floating x 10 oder x100 zu machen um nicht die zahlen hinten komma zu verlieren.

Habe auch gemerkt wenn ich mein yahoo wetter FHEM Module kein internet findet es delays verursacht und die modbus comm timeouts kriegt.

Wie mapst du zb. swiches : on:off auf die Holding registers ? Hätte mein type von on:off zum 1:0 geändert und dann könnte ich mein swiches ändern über Modbus.
Aber dan geht mein HomeKit/bridge nicht mehr, muss on:off type sein für HomeKit.

Ist da noch Weiterentwicklung in deine Plugin ? zb.:
- neben die registers auch die coil binair FC's. (lesen und schreiben)
- real floating support wie bei SPS: %MF...... (mapping real/float value auf mehere registers)
- binaire bit mapping auf die holding registers. Zb. on:off state auf bit 0 von register x

monty_burns_007

#4
noch eine kleine Frage: wie gebe ich den FHEM user auch root Rechte so das ich port 502 benuzte kann ?

edit: gefunden: Um Fhem als root laufen lassen zu können, kann es notwendig sein, den Benutzer fhem in der Datei /etc/passwd auszumarkieren oder mittels deleteuser zu löschen. Fhem schaltet in den Benutzerkontext fhem um, wenn es diesen Benutzer beim Start findet.

einfach ; für den fhem user in /etc/passwd setzen funzt.

ChrisD

Hallo,

ZitatIst die Module in diese Thread die letzte versione ? Oder gibt es da schon ein neuere ?

Das Modul entspricht noch dem aktuellen Stand. Dieser befindet sich auf GitHub und kann mit dem Befehl
update force https://raw.githubusercontent.com/ChrisD70/FHEM-Modules/master/autoupdate/mbs/controls_mbcc.txt
direkt in FHEM installiert werden.

ZitatNur integers sind moglich ? Floating values are not possible to map to 4 registers as real format ?
Ja, im Moment sind nur Integer möglich da ich für meine Zwecke nicht mehr brauche. Ich kann aber Unterstützung für IEEE 754 Single Precision-Zahlen über 2 Register hinzufügen.

ZitatHabe auch gemerkt wenn ich mein yahoo wetter FHEM Module kein internet findet es delays verursacht und die modbus comm timeouts kriegt.
Das kann passieren wenn ein Modul FHEM zu lange blockiert. Es gibt zwar verschiedene Möglichkeiten dies zum Teil zu umgehen, ich weiß aber nicht wie das Yahoo-Modul aufgebaut ist.

ZitatWie mapst du zb. swiches : on:off auf die Holding registers ?
Dazu muss ich das Modul erweitern, im Moment ist nur begrenzt lesen über userReadings möglich.

ZitatIst da noch Weiterentwicklung in deine Plugin ?
Ich sehe mir die nächsten Tage mal an was ich machen kann.

Grüße,

ChrisD

monty_burns_007

OK, Danke Chris für den autoupdate Befehl.

Unterstützung für IEEE 754 Single Precision-Zahlen über 2 Register (4 bytes) wäre nett sein.
Ich habe zb. ein Lichtsensor (mit module FHEM BH1750) die oder 4000 Lux oder 12.4 Lux gebt auf die readings.
Feste x10 nach integer geht dan nicht vielleicht.

Den Yahoo Wetter plugin hat kein Internet comm im Moment da effectiv mein Rpi FHEM kein Internet temp. hat.
Aber die Timeouts sind jetzt wieder OK, da ich die "Disable" attribute von Yahoo Wetter Pluging gesetzt habe.

Das Erweitern von das Modul für binaire (zb. switch: on:off) auf bits von Holding registers oder einfach integer Werte 1/0 auf ein Holding register (lesen und schreiben) finde ich eine schöneres Erweiterung dann den floating point. Das floating point ist leicht zu umgehen mit x 10 multiplicazion.
Aber vielleicht ist die floating point schon fertig (copy paste von Code in deine andere Modbus modules (fhem als Modbus master)

Andere FC's für Coils braucht man eingentlich nicht. Nür lese und schreibe von Holding registers (4xxxx). Aber mit Möglichheit float und binair (true/false) zu mappen. Vielleicht mus ich mal suchen nach ein FHEM commando die das ein on:off odere andere binaire reading Tekste umsetzt in 1:0 so das es zu mappen ist auf Modbus registers. Aber da braucht man wieder FHEM dummy's. Und ist nur lesen möglich.

ChrisD

Hallo,

Ich habe das Modul erweitert. Du kannst jetzt Float und Bits in Registern verwenden.

Floats kannst du z.B. mit
attr th comment MBR:1,21,H,desired-temp,F
definieren. 'F' legt fest dass die Zahl im Little-Endian Format übertragen wird. Wenn bei der Gegenstelle Unsinn herauskommt kannst du es mit 'FB' versuchen, dann wird die Zahl im Bit-Endian Format übertragen.

Bits kannst du mit
attr licht comment MBR:1,41,H,,B5
definieren. Auf den Zustand von 'licht' kann über Bit 5 von Register 41 zugegriffen werden. Dabei wird automatisch 'on' nach 1 und 'off' nach 0 konvertiert. Falls du andere Bezeichner benötigst kannst du die mit angeben:
attr rollo comment MBR:1,41,H,,B11,zu,auf
'zu' wird nach 0 und 'auf' nach 1 umgewandelt.

Grüße,

ChrisD

monty_burns_007

Chris,

Vielen Dank für die Erweiterung von deine Modbus Slave Module.  ;)
Funzt einwandfrei. Auch die mapping von mehrere Booleans (verschiedene bitnr) auf das gleiche Modbus holding Register.
Die floating Werte kommt auch gut an.
Und alle lesen und schreiben :-) Super !  :D

Jetzt kann man Fhem wirklich gut anschliessen an zb. Scada/HMI Systeme.

Monty 8)

franzlimholz

Hallo,

das Modul 36_ModbusTCP_CC.pm habe ich installiert und mit einem ModbusTCP-Client getestet.
Das Lesen eines Holdingregisters des Servers (Functioncode 3) funktioniert problemlos , aber das Schreiben auf den Slave (Functioncode 6) funktioniert nicht. Das Reading zeigt immer den Wert 0, obwohl ein Event erzeugt wird. Das sieht man im Event-Monitor und auch am "Zeitstempel" des Readings.
Im Client wird der korrekte Datenverkehr angezeigt.

Wer kann mir hier weiterhelfen?

Danke im Voraus

franzlimholz

ChrisD

#10
Hallo,

Wie sieht die Definition in FHEM aus ?

Was steht genau im Event-Monitor ?

Edit: Der Fehler sollte behoben sein, bitte aktualisiere das Modul.

Grüße,

ChrisD

franzlimholz

Viel Dank ChrisD,

es funktioniert jetzt.
Von github musste ich allerdings das repository als ZIP-File herunterladen und dann die Datei in das Verzeichnis ../fhem/FHEM kopieren.
Beim Update über FHEM kam die Meldung
2017.02.06 19:24:07 1 : UPD FHEM/36_ModbusTCP_CC.pm
2017.02.06 19:24:07 1 : Got 20865 bytes for FHEM/36_ModbusTCP_CC.pm, expected 20841
2017.02.06 19:24:07 1 : aborting.

Gruß
franzlimholz

ChrisD

Danke, habe ich korrigiert

Ichirou

Hallo ChrisD,

ein sehr schönes Plugin, vielen Dank :)
Ich möchte einzelne Schalter bzw. Aktoren steuern, derzeit als dummy-devices drin.
Wie kann ich Coils in dem slave lesen und schreiben?

Ichirou

KernSani

@ChrisD: Was dagegen, wenn ich den Thread nach "Codeschnipsel" verschiebe?
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...