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, ...

ChrisD

Hallo,

@KerniSani: Kein Problem meinerseits.

@Ichirou: Das Modul bietet nur die Möglichkeit auf Registerebene zuzugreifen. Du kannst aber auf binäre Zustande über einzelne Bits in den Registern zugreifen.

Wenn du von einem externen ModbusTCP-Client auf einen Aktor in FHEM zugreifen willst musst du zuerst das Modul wie in Beitrag 3 beschrieben installieren und einbinden. Anschließend kannst du z.B. mit
attr aktor comment MBR:1,1,H,,B0
festlegen dass aktor unter der Registeradresse 1, Bit 0 ansprechbar ist.

Welchen ModbusTCP-Client verwendest du ?

Grüße,

ChrisD


Ichirou

Hi,

ich hab derzeit noch GSI Modbus App aufm tablet, es wird ein Eaton HMI älteren Baujahres werden.

Das mit den Registeradressen funktioniert gut, ich wollte es der Einfachheit wegen aber gerne über Coils regeln, da ich viele Einzelzustände habe und die Register dafür mißbrauchen eigentlich nicht Sinn und Zweck der Sache ist.

Technisch muss ich dann sehen, wie ich das auf dem Panel umsetze. Es soll die werte dann an eine PLC weiter reichen und das Gateway Modbus-MPI spielen.

Ggf. ist es nur eine kleine Anpassung für I und H noch ein C für Coil einzubauen, dann wäre dein Modul unschlagbar :)
Es funktioniert jetzt schon fast perfekt, einzig die Übertragung eines Baro-Sensor ist auf 5 Ziffern begrenzt, das muss ich noch fixen. Multiplikator 10 geht (5 Stellen), bei 100 (6 Stellen) kommt nur noch 0.

Sonst lesen und schreiben top :)

Daniel


ChrisD

Hallo,

Ich habe versucht das Modul so zu erweitern dass auch Coils direkt gelesen und geschrieben werden können, die Syntax ist ähnlich wie bei den Registern:

MBC:<unitId>,<coil>,<type>[,<reading>[,<off>[,<on>]]
mit
    <unitId> - Unit Id (0 - 255), * für beliebig
    <coil> - Coilnummer (1 - 65536) (Achtung, dies ist nicht die Adresse)
    <type> - I für Input (nur Lesen), C für Coil (Lesen und Schreiben), * für beide
    <reading> - optional, Name des Readings, wenn nicht angegeben wird 'state' verwendet
    <off> - optional, alternativer Wert für 'off', z.B. 'auf' bei Jalousie
    <on> - optional, alternativer Wert für 'on', z.B. 'zu' bei Jalousie

Damit kann der Aktor z.B. durch setzen von
attr aktor comment MBC:1,10,C
über Coil 10 ausgelesen und gesteuert werden.

Du kannst das Modul mit
update force https://raw.githubusercontent.com/ChrisD70/FHEM-Modules/master/autoupdate/mbs/controls_mbcc.txt
aktualisieren. Danach muss FHEM neu gestartet werden.

Grüße,

ChrisD

Ichirou

Hallo ChrisD,

nach etwas rumprobieren, einigen Anwenderfehlern (shutdown restart vergessen, MBR nicht auf MBC geändert) und etwas ärger mit der App funktioniert es tadellos :)

Als Hinweis für andere:
Modbus kann mit einem Adressoffset arbeiten, in dem Beispiel von Chris: MBC:1,10,C habe ich Reaktion auf Coil 9.
Je nachdem wo die Anwendung anfängt zu zählen, sind die Coils und Register möglicherweise um -1 verschoben.

Danke ChrisD, vor allem für die superschnelle Umsetzung.  :)

ChrisD

Hallo,

Bei Modbus wird (leider) zwischen Coils/Registern und ihren Adressen unterschieden. Die Adressen liegen dabei immer 1 unter der Coil/Registernummer. Oft ist aber nicht klar ob ein Hersteller unter dem Begriff Register/Coil eigentlich die Adresse meint. Deshalb habe ich in der Dokumentation geschrieben
Zitat<coil> - Coilnummer (1 - 65536) (Achtung, dies ist nicht die Adresse)

Zum Teil findet man auch in der Dokumentation Register wie 40108 die unter der Adresse 107 anzusprechen sind. Hierbei wird der FC (4 für Eingangsregister lesen) vor die Registernummer gesetzt.

Grüße,

ChrisD

rammelsberg

Moin!

Ich habe das Ganze mit einem Codesys V3 auf einem Raspberry als Master getestet, lesen von der SPS aus mit FC 4 funktioniert, schreiben mit FC 6 leider nicht, ist ähnlich dem was franzlimholz weiter oben geschrieben hatte: im Event Monitor taucht das zyklische Schreiben (1x pro sekunde) auf, allerdings immer mit dem Wert 0, ich schreibe aber 255 rein, es sollten 25,5 ankommen.
"2018-01-14 02:11:58 MAX MAX_0682e1 desiredTemperature 0"
Definition am Aktor: MBR:1,1,I,temperature,N,10:1,21,*,desiredTemperature,N,10

Fällt Euch da direkt was auf?
Danke und viele Grüße...


ChrisD

Hallo,

Ich habe das Modul geändert, so dass das Schreiben in deinem Fall auch funktionieren sollte. In der Version 0007 werden unbekannte Format-Bezeichner (in deinem Fall 'N') ignoriert.

Grüße,

ChrisD

rammelsberg

Hallo ChrisD,

Das hat auf Anhieb geklappt, vielen Dank!  :D
Grüße...

lechez

Hallo Chris,

ich möchte gerne dass fhem als Modbus Slave über rs485 läuft, kann man kein Modul Slave auf von TCP auf RS485 rtu irgendwie umbauen?

Gruß

lechez

ChrisD

Hallo,

Die Anpassungen für den Betrieb als Modbus Slave sind nicht all zu groß. Ich sehe mir das am Wochenende an.

Grüße,

ChrisD

ChrisD

#25
Hallo,

Anbei eine erste Version für Modbus RTU. Das Gerät kann z.B. mit
define mbslave ModbusSlave /dev/ttyS0angelegt werden. Die Schnittstelle wird dann mit 9600,8,E,1 geöffnet.

Optional können auch die Parameter für die Schnittstelle mit übergeben werden, z.B.:
define mbslave ModbusSlave /dev/ttyS0@19200,8,N,1

Unter Windows mit Strawberry Perl lautet die Syntax:
define mbslave ModbusSlave COM1@19200,8,N,1

Bei Problemen mit der Datenübertragung kann verbose auf 5 gesetzt werden damit die ein- und ausgehenden Pakete aufgezeichnet werden.

Die Zuordnung von Coils/Registern erfolgt wie beim Modul ModbusTCP_CC über die Kommentarfelder.

Grüße,

ChrisD

Edit 06.10.2019: Version 0002 mit Anpassungen für Windows

Edit 24.09.2022: die angehängte Version ist nicht mehr aktuell, bitte von hier herunterladen

lechez

Cool vielen Dank!
Werde hoffe ich heute noch ausprobieren können.

monty_burns_007

Hallo Chris,

Zunächst einmal vielen Dank für die hervorragenden Modbus Master & Slave FHEM-Module.
Ich habe eine Frage zum Schreiben von separaten Bits in Holding-Register (4xxxxx).

Mein SCADA-System (Industrial HMI) scheint ein separates Bit an FHEM (als Modbus-Slave) zu schreiben.

Lesen ist kein Problem. Der SCADA Modbus IO-Treiber kann ein separates Bit aus einem Halteregister lesen.

Das Schreiben eines separaten Bits in ein Halteregister funktioniert jedoch nicht.

Ich vermute, der SCADA IO-Treiber verwendet Modbus FC22 (16 Hex). (Maskenschreibregister).
Ich glaube, das Modbus-Slave-Modul unterstützt dies nicht? Richtig?

FHEM als Modbus-Master unterstützt auch FC22 nicht? (zB wenn FHEM mit einer Slave-Modbus-SPS verbunden ist).
Kann der FC22 auch für beide Master als Slave-Module unterstützt werden?

Andere Lösung ist, dass ich für Ex verwendet habe. Kepware OPC-Server, der auswählen kann, ob Sie FC22 verwenden oder nicht.
Wenn der FC22 nicht verwendet wird, liest der OPC-Server den Wert schnell, bevor er mit den "geänderten" Bits maskiert wird, bevor er zum Modbus-Slave zurückgeschaltet wird.

Eine weitere Bemerkung, die ich zu dem Modbus-Slave-Modul habe, ist, dass eine Modbus-UnitID-Slave-Nummer erwartet wird, wenn sie von einem Modbus-Master abgefragt wird. Einige Modbus-Master geben diese Slave-ID (meistens 1) in ihren Modbus-FC-Anforderungen nicht an. (da meistens nur eine einzige IP-Adresse angegeben ist).

Danke im Voraus,

Monty :-)

Or english:


Hi Chris,

First of all thanks already for the excellent Modbus Master & Slave FHEM Modules.
I have a question about writing seperate bits into Holding registers (4xxxxx). My SCADA system (industrial HMI) can seem to write a seperate bit to FHEM (as modbus slave).
Reading is no problem. SCADA Modbus IO driver can read a seperate bit from a holding register. But writing a seperate bit into a holding register does not work.
I suspect the SCADA IO driver uses modbus FC22 (16 hex). (Mask write Register).
I seems the modbus slave module does not support this ? Correctly ?

FHEM as Modbus master also does not support FC22 ? (for ex. if FHEM connects to a slave Modbus PLC).
Is it possible to also add support for FC22 for both Master as Slave modules ?

Other solution is that I used for ex. Kepware OPC server which has the ability to select if you use FC22 or not. If FC22 is not used then the OPC server quickly reads the value before masking it with the "changed" bits before poking it back to the modbus slave.

Another remark I have on the Modbus Slave module is that it expects a Modbus UnitID slave nr when polled by a modbus master. Some Modbus master don't provide this slave ID (mostly 1) in it's modbus FC requests. (as it mostly is a single IP adress already specified).

Thanks in advance,

Monty :-)


monty_burns_007

FC22 :


5.3.4 Mask write register (FC 22)

Request

Byte 0:      FC = 16 (hex)
Byte 1-2:   Reference number
Byte 3-4:   AND mask to be applied to register
Byte 5-6:   OR mask to be applied to register

Response

Byte 0:      FC = 16 (hex)
Byte 1-2:   Reference number
Byte 3-4:   AND mask to be applied to register
Byte 5-6:   OR mask to be applied to register

Exceptions

Byte 0:      FC = 96 (hex)
Byte 1:      exception code = 01 or 02

Example

Change the field in bits 0-3 of register at reference 0 (40001 in Modicon 984) to value 4 hex
(AND with 000F, OR with 0004)

16 00 00 00 0F 00 04  =>   16 00 00 00 0F 00 04

ChrisD

Hallo,

Ich habe versucht FC 22 in ModbusTCP_CC zu integrieren. Leider kann ich es nur sehr begrenzt testen.

Du kannst die neue Version mit
update force https://raw.githubusercontent.com/ChrisD70/FHEM-Modules/master/autoupdate/mbs/controls_mbcc.txt
installieren.

Nach einem Neustart von FHEM sollte FC 22 funktionieren.

ZitatEine weitere Bemerkung, die ich zu dem Modbus-Slave-Modul habe, ist, dass eine Modbus-UnitID-Slave-Nummer erwartet wird, wenn sie von einem Modbus-Master abgefragt wird. Einige Modbus-Master geben diese Slave-ID (meistens 1) in ihren Modbus-FC-Anforderungen nicht an. (da meistens nur eine einzige IP-Adresse angegeben ist).

Das Protokoll verlangt eine UnitId im Byte 7. Sie ist aber bei vielen echten ModbusTCP-Servern ohne Funktion. Wenn du in FHEM die UnitId ignorieren möchtest, kannst du bei der Definition * angeben.

Grüße,

ChrisD

monty_burns_007

Hallo Chris,

Ich habe gerade das Update installiert und es funktioniert! ;-)

Getestet mit Modbus Tools & mit einem echten SCADA IO-Treiber von Wonderware HMI.
Der MBBTCP DA-Server des Wonderware IO-Treibers kann ohne Verwendung von FC22 keine separaten Bits in den Halteregistern schreiben.
Eine andere funktionierende Lösung bestand in der Verwendung eines Modbus-OPC-Servers (wie Kepware), bei dem es eine Option gibt, ob der harware-Slave auf FC22-Anforderungen antworten kann.

FHEM als Modbus-Slave kann jetzt auf FC22 antworten. :-)

Ich verwende die FHEM auch als Modbus-Master in Verbindung mit einer SPS. Ist der FC22-Code auch da?
Es spielt keine Rolle, da meine SPS nicht auf FC22-Modbus-Anforderungen antworten kann ... (günstige Version mit eingeschränkter Modbus-Protokollfunktionalität)

Schönes Wochenende noch....

SandroK

Muss mal Fragen, ob das Thema noch aktuell ist:

Mein Problem:

Ich bekomme ein "Connection refused from the non-local address XXX.XXX.XXX.XXX:YYYY, as there is no working allowed instance defined for it"
beim Versuch mit einem Modbus Client auf die FHEM-Anwendung von extern zu zugreifen.

Habe schon einiges nachgelesen, aber nichts passenden gefunden: Ich benutze den Port 10502 und FHEM läuft nicht als root !

Was kann nich noch tun ?

VG Sandro

ChrisD

Hallo,

Der Zugriff erfolgt wahrscheinlich von einem Client der keine private IP-Adresse verwendet (127/8, 10/8, 192.168/16, 172.16/12, 169.254/16). In dem Fall blockiert FHEM den Zugriff.

Du kannst versuchen durch Eingabe von
{$attr{'NameDerModbusClientInstanz'}{allowfrom} = ".*"}
in der Kommandozeile den Zugriff freizuschalten.

Grüße,

ChrisD

SandroK

Hallo Chris,

genau das war es, vielen Dank und viele Grüße

Sandro

SandroK

Hallo Chris,

ein ganz großes Lob, funktioniert einwandfrei.

Habe dennoch eine Frage, Real/Floatwerte kann ich mit dem Suffix "F" im comment
adressieren, wie geht das mit Double (32Bit) Werten ? Im Quellcode habe ich
ein "FB" gefunden, das dreht scheinbar die Float-Register, dann habe ich noch "T"
gefunden, damit kann ich gar nichts anfangen.

Danke für eine kurze Rückinfo.

VG Sandro

ChrisD

Hallo,

Mit 'F' werden Real-Zahlen aus FHEM als Single-Gleitkommazahlen (32 Bit) interpretiert und auf 2 aufeinanderfolgenden Registern zurückgeliefert. Mit 'FB' lässt sich die Reihenfolge von Low/High-Word invertieren.

Wenn du die Zahlen als Double (64 Bit) haben möchtest (auf 4 Registern) muss ich das Modul anpassen.

Mit 'T' lässt sich festlegen dass eine 16-Bit Integerzahl im 2-Komplement übertragen wird.

Grüße,

ChrisD

SandroK

Hallo Chris,

nein 64Bit Double benötige ich nicht, lediglich 32Bit als Double.

Habe des jetzt erstmal als Real/Float gelöst, jedoch gibts da scheinbar einen kleinen Rundungsfehler.

Grüße

Sjae

Hallo Gemeinde,

ich kämpfe nun schon viele Tagen mit dem ModbusSlave aber es will einfach nix an Daten austauschen. Ich gebe aber zu, so die Ahnung von FHEM hab ich nicht, brauchte aber vor ca. einem halben Jahr eine Möglichkeit 2 Modbus Master zu verbinden. IP-Symcon und C.M.I., was dank Anleitung und einigem probieren hin und her dann auch seitdem Störungsfrei läuft.

FHEM läuft bei mir auf einem win10 Laptop in der Version 5.9 mit strawberry-perl-5.30.0.1-64bit-portable.

Wie bereits erwähnt nur als Brücke zwischen den Mastern. Nun habe ich noch einen SDM630 Zähler angeschafft, dieser wird mittels RS485 USB Adapter von IP-Symcon ausgelesen.

Diese Daten werden dann per Modbus TCP an FHEM übertragen, mit ModbusTCP_CC. Nun müssen diese Daten bzw. eigentlich nur die Gesamtleistung, als Modbus Slave meinem PV Wechselrichter zur Verfügung gestellt werden, damit dieser sich so regeln kann das er etwa bei Nulleinspeisung liegt und der Rest zum Akku laden genutzt wird.

Nun der einzige Erfolg bisher, FHEM findet den Comport und öffnet ihn. Hab es ewig mit "define SDM630 ModbusSlave /dev/ttyS0@19200,8,N,1" und allen möglichen Varianten probiert, aber immer nur Fehler, nach einigen probieren und ewigem suchen mit Google und Co. Und dem Forum bin ich bei "define SDM630 ModbusSlave /com4@19200,8,N,1" gelandet, war nur ein kleiner Hinweis, irgendwo versteckt das es bei Windows anders aufgerufen wird, wobei ich das so nirgends gefunden habe immer mit ,,dev" davor nur kommt dann immer ,,Pfad nicht gefunden".

so sieht meine derzeitige Config aus:


define CMI ModbusTCP_CC 502
define SDM630 ModbusSlave /com4@19200,8,N,1


define SDM630_30049 dummy
attr SDM630_30049 comment MBR:1,49,H,,F
attr SDM630_30049 group SDM630
attr SDM630_30049 room SDM630

define SDM630_30053 dummy
attr SDM630_30053 comment MBR:1,52,H,,F
attr SDM630_30053 group SDM630
attr SDM630_30053 room SDM630

define SDM630_30057 dummy
attr SDM630_30057 comment MBR:1,56,H,,F
attr SDM630_30057 group SDM630
attr SDM630_30057 room SDM630



Mittels Modbus_CC wird die Leistung auch wie gewollt in SDM630_30053 dummy eingetragen.

Aber nun: der Wechselrichter senden ca. aller 1s die Anfrage zu: Daten lesen, aber es scheitert bei mir nun schon daran, dass irgendwie in FHEM zu erkennen wie und wo die Daten ankommen, geschweige dem, auszuwerten was er sendet. Dank HTerm weiß ich das der Wechselrichter ,,01 04 00 34 C7 91 17 72 63" sendet für die Abfrage der Gesamtleistung.
Den Beschreibungen nach habe ich es so verstanden, das der ModbusSlave sich um alles kümmert genau so wie es der ModbusTCP_CC macht (einfügen und läuft) und ich mich nicht erst darum kümmern muss zu verstehen was da alles abläuft im Hintergrund.

Die Kombination ModbusTCP_CC "verbose 5" und ModbusSlave "verbose 5" ergibt das in der LogDatei:


2019.10.02 07:21:40 1: Including C:/FHEM/fhem.cfg
2019.10.02 07:21:40 3: WEB: port 8083 opened
2019.10.02 07:21:40 2: eventTypes: loaded 89 events from ./log/eventTypes.txt
2019.10.02 07:21:41 3: CMI: port 502 opened
2019.10.02 07:21:41 1: Including ./log/fhem.save
2019.10.02 07:21:41 3: Opening SDM630 device /com4
2019.10.02 07:21:41 3: Setting SDM630 serial parameters to 19200,8,N,1
2019.10.02 07:21:41 3: SDM630 device opened


wenn ModbusSlave "verbose 5" allein läuft:

2019.10.02 07:23:18 1: Including C:/FHEM/fhem.cfg
2019.10.02 07:23:18 3: WEB: port 8083 opened
2019.10.02 07:23:18 2: eventTypes: loaded 89 events from ./log/eventTypes.txt
2019.10.02 07:23:18 1: Including ./log/fhem.save
2019.10.02 07:23:18 3: Opening SDM630 device /com4
2019.10.02 07:23:18 3: Setting SDM630 serial parameters to 19200,8,N,1
2019.10.02 07:23:18 3: SDM630 device opened


wenn ModbusTCP_CC "verbose 5" allein läuft:

2019.10.02 07:27:15 1: Including C:/FHEM/fhem.cfg
2019.10.02 07:27:15 3: WEB: port 8083 opened
2019.10.02 07:27:15 2: eventTypes: loaded 89 events from ./log/eventTypes.txt
2019.10.02 07:27:16 3: CMI: port 502 opened
2019.10.02 07:27:16 1: Including ./log/fhem.save
2019.10.02 07:27:18 4: Connection accepted from CMI_192.168.2.11_50421
2019.10.02 07:27:18 5: ModbusTCP_CC_Parse: received [00 00 00 00 00 06] 14 03 00 14 00 01
2019.10.02 07:27:18 4: ModbusTCP_CC_Parse(CMI_192.168.2.11_50421) : caching devspec2array
2019.10.02 07:27:18 5: ModbusTCP_CC_Parse: sending [00 00 00 00 00 05] 14 03 02 01 97
2019.10.02 07:27:18 5: ModbusTCP_CC_Parse: received [00 00 00 00 00 06] 14 03 00 15 00 01
2019.10.02 07:27:18 5: ModbusTCP_CC_Parse: sending [00 00 00 00 00 05] 14 03 02 5C 08
2019.10.02 07:27:18 5: ModbusTCP_CC_Parse: received [00 00 00 00 00 06] 14 03 00 16 00 01
2019.10.02 07:27:18 5: ModbusTCP_CC_Parse: sending [00 00 00 00 00 05] 14 03 02 01 F4
2019.10.02 07:27:18 5: ModbusTCP_CC_Parse: received [00 00 00 00 00 06] 0A 06 00 01 00 7B
2019.10.02 07:27:18 5: ModbusTCP_CC_Parse: sending [00 00 00 00 00 06] 0A 06 00 01 00 7B



Ich hoffe nun auf viele Vorschläge und am besten wäre es natürlich wenn ich es daduch zum laufen bekomme.


ChrisD

Hallo,

Die Anfrage vom Wechselricher (01 04 00 34 C7 91 17 72 63) ist nicht richtig. Die ersten vier Bytes sehen noch gut aus (lesen von Slave 1 ab Adresse 52), der Rest ist aber falsch. Insgesamt dürfen es nur 8 Bytes sein.

Eventuell stimmt das Datenformat nicht oder es gibt Störungen bei der seriellen Übertragung. Die Anfrage für z.B. 2 Worte müsste 01 04 00 34 00 02 30 05 lauten.

Bei verbose 5 sollte ModbusSlave auch anzeigen dass die Daten fehlerhaft sind. Hast du schon versucht die Definition in
define SDM630 ModbusSlave com4@19200,8,N,1
zu ändern ? Der / am Anfang sollte nicht nötig sein.

Grüße,

ChrisD

Sjae

Hallo,

danke für die Tipps,

hier nochmal der Empfangene Satz, ist natürlich nur 8bytes lang, so kommt es bei IP-Symcom rein.


01 04 00 34 00 02 30 05

es war mein Fehler, ich habe den falchen Satz eingefügt, das tut mir sehr leid.

Ohne "/" funktioniert es auch, leider aber weder besser noch schlechter.


define SDM630 ModbusSlave com4@19200,8,N,1


Lagdatei:

2019.10.02 14:34:26 1: Including C:/FHEM/fhem.cfg
2019.10.02 14:34:26 3: WEB: port 8083 opened
2019.10.02 14:34:26 2: eventTypes: loaded 89 events from ./log/eventTypes.txt
2019.10.02 14:34:26 3: CMI: port 502 opened
2019.10.02 14:34:26 1: Including ./log/fhem.save
2019.10.02 14:34:26 3: Opening SDM630 device com4
2019.10.02 14:34:26 3: Setting SDM630 serial parameters to 19200,8,N,1
2019.10.02 14:34:26 3: SDM630 device opened


Viele Grüße
Sven

ChrisD

Hallo,

Ich habe nicht verstanden wieso die Daten vom Wechselrichter jetzt bei IP-Symcon ankommen.

In deinem 1. Beitrag steht dass der SDM von IP-Symcon ausgelesen wird und die Daten per ModbusTCP an FHEM übertragen werden (was auch funktioniert). Der Wechselrichter ist direkt mit dem Rechner auf dem FHEM läuft verbunden und diese Verbindung scheint nicht zu gehen.

Kannst du nochmal mit HTerm prüfen was der Wechselrichter auf COM4 sendet ?

Grüße,

ChrisD

Sjae

Ja Okay ist etwas Verwirrend, ich versuche das mal besser zu beschreiben:

Auf dem Win10 Rechner läuft IP-Symcon und FHEM parallel.

IP-Symcom kümmert sich um die ganzen Steuer- und Regelungsaufgaben:
- Heizung
- thermische Solaranlage 
- PV Anlage -> Wechselrichter per USB - RS232 -> COM2
- PV Anlage -> Batteriemanagmantsystem per USB - RS232 -> COM1
- PV Anlage -> Wechselrichter Modbus Karte USB - RS485 -> COM4 (um die geht es, darüber Regel der WR seine Ausgangsleistung, liest aber dabei nur die Gesamtleistung vom SDM630 aus, ich möchte und benötige aber mehr Daten vom SDM630, daher mein Umweg über
- SDM630 PER USB - RS485 -> COM3 am PC.

FHEM kümmert sich um:
- Datenaustausch zwischen IP-Symcon und dem C.M.I. über ModbusTCP_CC, da IP-Symcon und das C.M.I. beide nur als ModbusMaster arbeiten.
- Datenaustausch zwischen IP-Symcon und Wechselrichter per ModbusSlave über USB - RS485 -> COM4 da beide nur als ModbusMaster arbeiten,

dazu
lese ich die Daten des SDM630 mit IP-Symcon aus dem SDM630 aus (funktioniert)
übergebe die Gesamtleistung mit ModbusTCP_CC von IP-Symcon an FHEM (funktioniert)

Variable in FHEM:

define SDM630_30053 dummy
attr SDM630_30053 comment MBR:1,52,H,,F
attr SDM630_30053 group SDM630
attr SDM630_30053 room SDM630


und nun kommt der Teil wo ich nicht weiter komme, es aber auch keine Fehlermeldung gibt, das diese Variable mit ModbusSlave dem Wechselrichter zur Verfügung gestellt wird.

Der WR sendet:


01 04 00 34 00 02 30 05


und erwartet, vom Aufbau her diese Antwort:


01 04 04 43 FD 91 13 53 AD


wobei 43 FD 91 13 die Gesamtleistung ist wie sie auch in der Variable steht.


Statt mit HTerm habe ich mit IP-Symcon geguckt was der WR sendet,

mit HTerm kommt aber das gleiche:


01 04 00 34 00 02 30 05



Viele Grüße
Sven

Sjae

Kam gerade beim wieder öffnen von COM4


2019.10.03 01:25:14 3: Opening SDM630 device com4
2019.10.03 01:25:14 3: Setting SDM630 serial parameters to 19200,8,N,1
2019.10.03 01:25:14 3: SDM630 device opened
2019.10.03 01:25:27 1: PERL WARNING: Subroutine CloseHandle redefined at ./FHEM/99_CommPort.pm line 170.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine CreateFile redefined at ./FHEM/99_CommPort.pm line 175.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine GetCommState redefined at ./FHEM/99_CommPort.pm line 180.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine SetCommState redefined at ./FHEM/99_CommPort.pm line 184.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine SetupComm redefined at ./FHEM/99_CommPort.pm line 188.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine PurgeComm redefined at ./FHEM/99_CommPort.pm line 192.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine CreateEvent redefined at ./FHEM/99_CommPort.pm line 196.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine GetCommTimeouts redefined at ./FHEM/99_CommPort.pm line 200.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine SetCommTimeouts redefined at ./FHEM/99_CommPort.pm line 204.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine GetCommProperties redefined at ./FHEM/99_CommPort.pm line 208.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine ReadFile redefined at ./FHEM/99_CommPort.pm line 212.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine WriteFile redefined at ./FHEM/99_CommPort.pm line 216.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine TransmitCommChar redefined at ./FHEM/99_CommPort.pm line 220.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine ClearCommBreak redefined at ./FHEM/99_CommPort.pm line 224.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine SetCommBreak redefined at ./FHEM/99_CommPort.pm line 229.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine ClearCommError redefined at ./FHEM/99_CommPort.pm line 234.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine EscapeCommFunction redefined at ./FHEM/99_CommPort.pm line 238.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine GetCommModemStatus redefined at ./FHEM/99_CommPort.pm line 242.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine GetOverlappedResult redefined at ./FHEM/99_CommPort.pm line 246.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine GetCommConfig redefined at ./FHEM/99_CommPort.pm line 250.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine GetCommMask redefined at ./FHEM/99_CommPort.pm line 254.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine SetCommConfig redefined at ./FHEM/99_CommPort.pm line 258.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine SetCommMask redefined at ./FHEM/99_CommPort.pm line 262.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine WaitCommEvent redefined at ./FHEM/99_CommPort.pm line 266.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine ResetEvent redefined at ./FHEM/99_CommPort.pm line 270.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine OS_Error redefined at ./FHEM/99_CommPort.pm line 505.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine get_tick_count redefined at ./FHEM/99_CommPort.pm line 507.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine set_no_messages redefined at ./FHEM/99_CommPort.pm line 510.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine nocarp redefined at ./FHEM/99_CommPort.pm line 515.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine internal_buffer redefined at ./FHEM/99_CommPort.pm line 517.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine yes_true redefined at ./FHEM/99_CommPort.pm line 519.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine new redefined at ./FHEM/99_CommPort.pm line 525.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine fetch_DCB redefined at ./FHEM/99_CommPort.pm line 1029.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine init_done redefined at ./FHEM/99_CommPort.pm line 1121.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine update_DCB redefined at ./FHEM/99_CommPort.pm line 1128.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine initialize redefined at ./FHEM/99_CommPort.pm line 1312.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_status redefined at ./FHEM/99_CommPort.pm line 1352.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine reset_error redefined at ./FHEM/99_CommPort.pm line 1380.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_baud redefined at ./FHEM/99_CommPort.pm line 1387.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_databits redefined at ./FHEM/99_CommPort.pm line 1392.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_stopbits redefined at ./FHEM/99_CommPort.pm line 1397.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_dtrdsr redefined at ./FHEM/99_CommPort.pm line 1402.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_handshake redefined at ./FHEM/99_CommPort.pm line 1407.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_parity_check redefined at ./FHEM/99_CommPort.pm line 1412.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_parity_config redefined at ./FHEM/99_CommPort.pm line 1417.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_parity_enable redefined at ./FHEM/99_CommPort.pm line 1422.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_rlsd_config redefined at ./FHEM/99_CommPort.pm line 1427.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_rlsd redefined at ./FHEM/99_CommPort.pm line 1432.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_16bitmode redefined at ./FHEM/99_CommPort.pm line 1437.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_ioctl redefined at ./FHEM/99_CommPort.pm line 1442.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_rs232 redefined at ./FHEM/99_CommPort.pm line 1447.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_modem redefined at ./FHEM/99_CommPort.pm line 1452.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_rtscts redefined at ./FHEM/99_CommPort.pm line 1457.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_xonxoff redefined at ./FHEM/99_CommPort.pm line 1462.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_xon_char redefined at ./FHEM/99_CommPort.pm line 1467.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_spec_char redefined at ./FHEM/99_CommPort.pm line 1472.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_interval_timeout redefined at ./FHEM/99_CommPort.pm line 1477.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_total_timeout redefined at ./FHEM/99_CommPort.pm line 1482.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_handshake redefined at ./FHEM/99_CommPort.pm line 1487.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine are_handshake redefined at ./FHEM/99_CommPort.pm line 1499.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_baudrate redefined at ./FHEM/99_CommPort.pm line 1506.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine are_baudrate redefined at ./FHEM/99_CommPort.pm line 1518.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_parity redefined at ./FHEM/99_CommPort.pm line 1525.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine are_parity redefined at ./FHEM/99_CommPort.pm line 1537.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_databits redefined at ./FHEM/99_CommPort.pm line 1544.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine are_databits redefined at ./FHEM/99_CommPort.pm line 1556.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_stopbits redefined at ./FHEM/99_CommPort.pm line 1563.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine are_stopbits redefined at ./FHEM/99_CommPort.pm line 1575.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_read_buf redefined at ./FHEM/99_CommPort.pm line 1583.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_write_buf redefined at ./FHEM/99_CommPort.pm line 1590.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_buffers redefined at ./FHEM/99_CommPort.pm line 1596.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine read_bg redefined at ./FHEM/99_CommPort.pm line 1610.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine write_bg redefined at ./FHEM/99_CommPort.pm line 1641.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine read_done redefined at ./FHEM/99_CommPort.pm line 1675.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine write_done redefined at ./FHEM/99_CommPort.pm line 1697.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine purge_all redefined at ./FHEM/99_CommPort.pm line 1719.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine purge_rx redefined at ./FHEM/99_CommPort.pm line 1734.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine purge_tx redefined at ./FHEM/99_CommPort.pm line 1748.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine are_buffers redefined at ./FHEM/99_CommPort.pm line 1762.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine buffer_max redefined at ./FHEM/99_CommPort.pm line 1768.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine suspend_tx redefined at ./FHEM/99_CommPort.pm line 1774.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine resume_tx redefined at ./FHEM/99_CommPort.pm line 1780.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine xmit_imm_char redefined at ./FHEM/99_CommPort.pm line 1786.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_xon_char redefined at ./FHEM/99_CommPort.pm line 1797.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_xoff_char redefined at ./FHEM/99_CommPort.pm line 1809.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_eof_char redefined at ./FHEM/99_CommPort.pm line 1821.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_event_char redefined at ./FHEM/99_CommPort.pm line 1833.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_error_char redefined at ./FHEM/99_CommPort.pm line 1845.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_xon_limit redefined at ./FHEM/99_CommPort.pm line 1857.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_xoff_limit redefined at ./FHEM/99_CommPort.pm line 1872.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_read_interval redefined at ./FHEM/99_CommPort.pm line 1887.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_read_char_time redefined at ./FHEM/99_CommPort.pm line 1904.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_read_const_time redefined at ./FHEM/99_CommPort.pm line 1916.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_write_const_time redefined at ./FHEM/99_CommPort.pm line 1928.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_write_char_time redefined at ./FHEM/99_CommPort.pm line 1940.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine update_timeouts redefined at ./FHEM/99_CommPort.pm line 1952.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_binary redefined at ./FHEM/99_CommPort.pm line 2015.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_parity_enable redefined at ./FHEM/99_CommPort.pm line 2028.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine ignore_null redefined at ./FHEM/99_CommPort.pm line 2039.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine ignore_no_dsr redefined at ./FHEM/99_CommPort.pm line 2060.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine subst_pe_char redefined at ./FHEM/99_CommPort.pm line 2081.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine abort_on_error redefined at ./FHEM/99_CommPort.pm line 2102.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine output_dsr redefined at ./FHEM/99_CommPort.pm line 2123.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine output_cts redefined at ./FHEM/99_CommPort.pm line 2144.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine input_xoff redefined at ./FHEM/99_CommPort.pm line 2165.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine output_xoff redefined at ./FHEM/99_CommPort.pm line 2186.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine tx_on_xoff redefined at ./FHEM/99_CommPort.pm line 2207.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine dtr_active redefined at ./FHEM/99_CommPort.pm line 2228.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine rts_active redefined at ./FHEM/99_CommPort.pm line 2235.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine pulse_dtr_off redefined at ./FHEM/99_CommPort.pm line 2244.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine pulse_rts_off redefined at ./FHEM/99_CommPort.pm line 2254.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine pulse_break_on redefined at ./FHEM/99_CommPort.pm line 2264.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine pulse_dtr_on redefined at ./FHEM/99_CommPort.pm line 2274.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine pulse_rts_on redefined at ./FHEM/99_CommPort.pm line 2284.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine break_active redefined at ./FHEM/99_CommPort.pm line 2294.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine xon_active redefined at ./FHEM/99_CommPort.pm line 2301.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine xoff_active redefined at ./FHEM/99_CommPort.pm line 2307.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_modemlines redefined at ./FHEM/99_CommPort.pm line 2313.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine debug_comm redefined at ./FHEM/99_CommPort.pm line 2325.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine close redefined at ./FHEM/99_CommPort.pm line 2340.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine DESTROY redefined at ./FHEM/99_CommPort.pm line 2389.
2019.10.03 01:25:27 1: Including C:/FHEM/fhem.cfg
2019.10.03 01:25:27 3: WEB: port 8083 opened
2019.10.03 01:25:27 2: eventTypes: loaded 89 events from ./log/eventTypes.txt
2019.10.03 01:25:27 3: CMI: port 502 opened
2019.10.03 01:25:27 1: Including ./log/fhem.save
2019.10.03 01:25:28 3: Opening SDM630 device com4
2019.10.03 01:25:28 3: Setting SDM630 serial parameters to 19200,8,N,1
2019.10.03 01:25:28 3: SDM630 device opened

ChrisD

Hallo,

Danke für die Erklärungen.

Ich habe Strawberry Perl installiert und festgestellt dass FHEM keine Daten von der seriellen Schnittstelle liest. An der Perl-Version liegt es nicht, ein kleines Perl-Testprogramm zeigt Daten an.

Ich muss mir ansehen wo die Daten in FHEM hängen bleiben.

Woher kommt das Modul 99_CommPort ? Es gehört nicht zu zur Standard FHEM-Installation.

Grüße,

ChrisD

Sjae

Vielen Dank das Du dir das ansiehst,

ich habe viel rumprobiert und versucht, bewusst genutzt wird das Modul 99 von mir nicht. Ich nehmean das ist durch meine vielen versuche dazu gekommen. wie bekomme ich das wieder weg?

VG
Sven

ChrisD

#45
Hallo,

Ich habe das Modul geändert so dass es auch unter Windows mit Strawberry Perl funktioniert.

Ob du 99_CommPort benötigst kann ich nicht sagen, eventuell enthält es den Fix für die serielle Schnittstelle unter 64-Bit Perl.

Kannst du mir die Datei schicken, sie befindet sich im FHEM-Verzeichnis.

Grüße,

ChrisD

Edit 24.09.2022: die angehängte Version ist nicht mehr aktuell, bitte von hier herunterladen

Sjae

Hallo,

99_ ist eine Kopie von 99_myUtilys und hatte ich selbst angelegt, das ist mir eingefallen als ich es geöffnet habe um nachzusehen was es macht.

Ich hab die neue Version probiert, aber ich glaube es geht trotzdem nicht, siehe Log???


2019.10.05 17:37:18 0: Server shutdown
2019.10.05 17:37:22 1: registering fhem as Windows Service
2019.10.05 17:37:22 1: starting fhem as a service
2019.10.05 17:37:22 1: Including C:/FHEM/fhem.cfg
2019.10.05 17:37:24 3: WEB: port 8083 opened
2019.10.05 17:37:24 2: eventTypes: loaded 91 events from ./log/eventTypes.txt
2019.10.05 17:37:27 3: CMI: port 502 opened
2019.10.05 17:37:27 1: Including ./log/fhem.save
2019.10.05 17:37:27 3: Opening SDM630 device com4
2019.10.05 17:37:27 3: Setting SDM630 serial parameters to 19200,8,N,1
2019.10.05 17:37:27 3: SDM630 device opened
2019.10.05 17:37:27 0: Featurelevel: 5.9
2019.10.05 17:37:27 0: Server started with 269 defined entities (fhem.pl:20069/2019-08-27 perl:5.030000 os:MSWin32 user:SYSTEM pid:1580)
2019.10.05 17:37:27 3: FHEMWEB WEB CSRF error: csrf_565145487979007 ne csrf_143286092711894 for client WEB_127.0.0.1_49972 / command shutdown restart. For details see the csrfToken FHEMWEB attribute.
2019.10.05 17:37:27 0: Server shutdown
2019.10.05 17:37:30 1: registering fhem as Windows Service
2019.10.05 17:37:30 1: starting fhem as a service
2019.10.05 17:37:30 1: Including C:/FHEM/fhem.cfg
2019.10.05 17:37:31 3: WEB: port 8083 opened
2019.10.05 17:37:31 2: eventTypes: loaded 91 events from ./log/eventTypes.txt
2019.10.05 17:37:33 3: CMI: port 502 opened
2019.10.05 17:37:33 1: Including ./log/fhem.save
2019.10.05 17:37:33 3: Opening SDM630 device com4
2019.10.05 17:37:33 3: Setting SDM630 serial parameters to 19200,8,N,1
2019.10.05 17:37:33 3: SDM630 device opened
2019.10.05 17:37:33 0: Featurelevel: 5.9
2019.10.05 17:37:33 0: Server started with 269 defined entities (fhem.pl:20069/2019-08-27 perl:5.030000 os:MSWin32 user:SYSTEM pid:8476)
2019.10.05 17:37:33 3: FHEMWEB WEB CSRF error: csrf_143286092711894 ne csrf_758795323537473 for client WEB_127.0.0.1_49976 / command shutdown restart. For details see the csrfToken FHEMWEB attribute.



es werden auch keine Daten gesendet

VG

ChrisD

Hallo,

Im Log ist keine Meldung die zeigt dass es nicht gehen würde. Steht verbose beim SDM630 noch auf 5 ?

Zitat99_ ist eine Kopie von 99_myUtilys und hatte ich selbst angelegt, das ist mir eingefallen als ich es geöffnet habe um nachzusehen was es macht.

Wieso hast du die seriellen Funktionen (CloseHandle, CreateFile , etc) in 99_myUtils ? Hast du die Datei selbst erstellt ?

Wenn du die x64 Version von Perl verwendest muss die Datei perl\vendor\lib\Win32API\CommPort.pm angepasst werden. Ansonsten funktioniert die serielle Schnittstelle nicht. Details gibt es hier.

Grüße,

ChrisD

Sjae

Fast am Ziel:

verbose steht auf 5...

Ich habe mir aus Verzweiflung alles mögliche kopiert und eingefügt, um irgendwie die Daten zu empfangen, von selber schreiben bin ich tausende Kilometer entfernt.

Zitat
Wenn du die x64 Version von Perl verwendest muss die Datei perl\vendor\lib\Win32API\CommPort.pm angepasst werden. Ansonsten funktioniert die serielle Schnittstelle nicht. Details gibt es hier.

Hatte ich noch nie was davon gehört also gleich überprüft und geändert, hat aber leider nicht sofort geholfen.

In der Annahmme das es mit dem neuen 36_... gehen muss, habe ich alle Datein unter C:\fhem\FHEM...... gelöscht und aus einer frischen Download Version reinkopiert plus 36_ModbusSlave und 36ModbusTCP_CC und siehe da einen "shutdown und neustart" später und nun geht es.

Allerdings sendet es noch das falsche, es müsste  399,1335 (hex 01 04 04 43 C7 91 17 72 63) aus


define SDM630_30053 dummy
attr SDM630_30053 comment MBR:1,52,H,,F
attr SDM630_30053 group SDM630
attr SDM630_30053 room SDM630


senden ;

sendet aber 01 84 02 C2 C1 von keine Ahnung woher. Hier bin ich noch ratlos aber wenigstens klappt die Verbindung erstmal, nochmal vielen dank.

VG
Sven

ChrisD

Hallo,

Die Meldung 01 84 02 ... besagt dass versucht wurde Daten zu lesen die nicht definiert sind. Das kann daran liegen dass es 2 Adressierungsmöglichkeiten gibt:

01 04 00 34 00 02 30 05
ist die Anfrage nach 2 Worten ab Adresse 52 oder Register 53. Die Registernummern (die ModbusSlave verwendet) liegen immer um 1 höher als die Adressen. SDM630_30053 ist über Register 52, also Adresse 51 erreichbar, so dass die obige Anfrage nicht funktioniert. Kannst du den Wechselrichter umparametrieren so dass er die Daten von Adresse 51 liest ?

Grüße,

ChrisD



Sjae

Am Wechselrichter kann ich nicht einstellen.

Ich habe jetzt versucht in FHEM mit der Adresse hoch und runter zu gehen, in der Hoffnung die Richtige zu treffen, aber das hilft nix, nur wenn ich aus H ein I mache ändert sich was bzw. wird was gesendet allerdings nicht das richtige.


MBR:1,53,I,,F --> 01 04 04 80 00 43 C7 A2 E6



MBR:1,52,I,,F --> 01 04 04 00 00 01 8F BB B0


und senden sollte es 01 04 04 "399,1335" + CRC


viele grüße

ChrisD

Hallo,

Der Wechselrichter will Input Register lesen (Code 04), deshalb musst du I oder * verwenden.

Wenn du das Attribut änderst, ändert sich dann auch der Wert des Dummy ?

Kannst du das Attribut auf MBR:1,53,*,,F setzen und ein Log mit verbose 5 von CMI und SDM630 erstellen ?

Grüße,

ChrisD

Sjae

Guten Morgen,


es ist geschafft und es läuft. Nachdem ändern auf "*" kamen die Daten an, zunächst erst noch vertauscht aber das waren dann nur noch 2 klicks, einmal in IP Sycon auf


"Swap LSW/MSW for 32Bit/64Bit values
,

und das "B" in


MBR:1,53,*,,FB


und nun geht es.

Brauchst Du das Log trotzem?

Danke für die Hilfe das hätte ich wahrscheinlich nie alleine geschafft.

Beste Grüße
Sven

ChrisD

Hallo,

Schön dass es funktioniert.

Das Log brauche ich nicht.

Grüße,

ChrisD

bugs

Hallo

Ich bin auf der Suche einer Lösung für eine Kommunikation zwischen digitalSTROM (dSS20) und Codesys welches als Runtime auf einem Raspberry PI 3 B+ läuft. Meine Idee ist FHEM, auf dem Raspi installiert, als Gateway zu nutzen. Die Kommunikation zwischen digitalSTROM und FHEM habe ich mit Hilfe einer detaillierten Anleitung zum Laufen gebracht. (https://wiki.fhem.de/wiki/DigitalSTROM_einbinden)
FHEM kenne ich leider nur rudimentär und schaffe es nicht eine Verbindung zu Codesys via Modbus-TCP aufzubauen. Das Modul ,36_ModbusTCP_CC.pm ' konnte ich installieren komme nun aber nicht weiter, mir fehlen einfach die Kenntnisse.
Hilfreich wäre eine ähnlich ausführliche Anleitung wie die Projektierung FHEM-digitalSTROM im wiki.fhem. Vielleicht gibt es jemand der mir weiterhelfen kann, ich verstehe aber auch wenn mein Wunsch zu viel verlangt und sich deshalb niemand die Arbeit macht.
Ich bin auch daran FHEM besser zu verstehen was leider nicht ganz einfach ist und viel Zeit beansprucht, zu FHEM findet man im Web viele unterschiedliche und teils auch widersprüchliche Angaben.
Noch eine Zusatzfrage, wie bringe ich FHEM dazu dass der Port 502 deklariert werden kann, die Massnahme in Antwort #4 funktioniert bei mir leider nicht.

Beste Grüsse aus der Zentralschweiz
Heinz

ChrisD

Hallo,

Kannst du etwas genauer beschreiben welche Informationen du weitergeben möchtest ? Auf Basis des Wiki könnte die Definition eventuell so aussehen:
attr dSM_0000131e comment MBR:1,1,I,Consumption,F

In den Beiträgen 2 und 7 sowie in der CommandRef ist die Funktion des Modules beschrieben, welche Informationen fehlen dir ?

ZitatNoch eine Zusatzfrage, wie bringe ich FHEM dazu dass der Port 502 deklariert werden kann, die Massnahme in Antwort #4 funktioniert bei mir leider nicht.

Was funktioniert nicht ?
Gibt es eine Fehlermeldung ?
Es kann sein dass die CoDeSys-Runtime Port 502 blockiert, in dem Fall musst du einen anderen Port verwenden.

Grüße,

ChrisD

bugs

Hallo Chris
Danke für deine Unterstützung, bitte entschuldige die späte Reaktion meinerseits.

Grundsätzlich möchte ich Messwerte wie z.B. den aktuellen Stromverbrauch von digitalSTROM via FHEM zu Codesys übertragen aber auch Ereignisse der Schaltuhr von digitalSTROM zu Codesys senden. Umgekehrt sollten Ereignisse von Codesys, z.B. Steuerbefehle Umwälzpumpe Fussbodenheizung ein-aus, über FHEM zu digitalSTROM gesendet werden.

Dein Code-Vorschlag werde ich testen und schauen ob ich von FHEM zu Codesys eine Kommunikation aufbauen kann.
Mir fehlen einfach die Kenntnisse um FHEM korrekt zu projektieren, zu kontrollieren und zu testen.

Beim Einbinden ,define mbcc ModbusTCP_CC' kommt die folgende Fehlermeldung
.mbcc: Can't open server port at 502: Permission denied', mit dem Port 10502 kommt jedoch keine Fehlermeldung. Der Port 502 wird auf der Codesys-Seite benutzt für eine Kommunikation über Modbus-TCP mit einem PV-Wechselrichter (Solaredge).

Es scheint jedoch, dass der Port trotzdem korrekt ist im FHEM, unter Internals DeviceName steht hinter der IP-Adresse ....:502.

Schöne Grüsse aus der Zentralschweiz
Heinz

ChrisD

Hallo,

ZitatCan't open server port at 502: Permission denied'
kommt wahrscheinlich daher dass der Benutzer unter dem FHEM läuft keine Root-Rechte hat. Entweder musst du auf einen Port >1024 ausweichen oder FHEM den Zugriff auf Port 502 erlauben. Dazu gibt es eine Reihe von Möglichkeiten, die vom eingesetzten Betriebssystem abhängen, für Linux z.B. nach 'linux privileged ports' suchen.

ZitatEs scheint jedoch, dass der Port trotzdem korrekt ist im FHEM, unter Internals DeviceName steht hinter der IP-Adresse ....:502.
FHEM zeigt den konfigurierten Port an, ob dieser geöffnet werden konnte wird an der Stelle nicht angezeigt.

ZitatDer Port 502 wird auf der Codesys-Seite benutzt für eine Kommunikation über Modbus-TCP
Wenn Codesys Port 502 belegt musst du einen anderen verwenden. Da du den Port in Codesys für jeden ModbusTCP-Slave getrennt einstellen kannst sollte das kein Problem sein.

Grüsse,

ChrisD

bugs

Hallo Chris
Danke für deine Hinweise und Tipps.

Den Port änderte ich auf beiden Seiten auf 1502 eine Verbindung kommt jedoch nicht zustande.
Ich versuchte ziemlich viel, leider alles ohne Erfolg, mir fehlt einfach das notwendige FHEM-Wissen für die Projektierung der Modbus-Kommunikation. Aufgeben werde ich trotzdem noch nicht, die Hoffnung stirbt bekanntlich zuletzt.

Grüsse und einen guten Rutsch ins neue Jahr
Heinz

Guzzi-Charlie

Hallo Chris,

das Thema ist zwar schon über ein Jahr alt, aber ich hoffe die Frage erreicht Dich trotzdem.

Ich habe ein spezielles Problem. Ich betreibe mehrere PV-Anlagen und jetzt kommt noch eine Weitere (incl. Batteriespeicher) hinzu. Dafür installiere ich auch das Fenecon Energy Management System (FEMS). Dieses steuert dann die Energieflüsse aller Wechselrichter und der ebenfalls hinzukommenden Batterieanlage. Dafür muß pro PV-Anlage ein Energiezähler installiert werden. Alles zusammen wird mit FEMS per Modbus RTU (RS485) verbunden (siehe anhängendes Schema).

Das Problem ist nun das in FEMS zur Zeit nur bestimmte Zähler implementiert sind und genau diese entweder nicht zu bekommen sind oder absolut überteuert sind. Das betrifft die zusätzlichen Zähler (in meinem Beispiel die Zähler 1+2). Ich habe mir nun überlegt ob ich nicht als Ersatz ein anderes Fabrikat nehmen könnte, die Daten dann mit FHEM abfragen, dort die Register quasi "ummappen" und dann FHEM als Slave an den vorgesehenen Modbus hänge und damit dem FEMS praktisch andere Zähler vorspiegelt werden. Die Registerbelegungen der (in FEMS) implementierten Zähler als auch die der Ersatztypen habe ich natürlich.

Wäre dieses Konstrukt problemlos umzusetzen oder hälst Du das für nicht, bzw. nur mit unverhältnismäßigem Aufwand machbar?
- RaspPI 4+: (Cuno V2 -2x KS300, JeeLink -13x EC3000)
- Stromzähler (B+G E-Tech): 6x SDM120M, 9x XTM100A, 38x DRS110M
- LAN: IT LAN-Gateway mit 34x RMF-R1 (Rohrmotor24)
- WLAN: 85x Shelly, 12x Gosund SP111, 16x D1-Mini, 15x Sonoff Basic
- DECT: 6x DECT200, 8x DECT301, - HmIP: 3x FalmotC12, 16x WTH2

ChrisD

Hallo,

Ich denke dass das umsetzbar ist. Da du die Registerbelegungen (und Formate) der beiden Geräte kennst sollte sich der Aufwand in Grenzen halten.

Grüße,

ChrisD

Guzzi-Charlie

Ok, Danke für die superschnelle Antwort.

Dann werde ich mir Dein Modul demnächst mal zu Gemüte führen und schauen ob ich was damit hinbekomme. Das heißt ich müßte dann das Modbus-Modul von Stefan Strobel zum Einlesen der Daten vom Zähler verwenden (das benutze ich jetzt schon für andere Modbus-Zähler) und dann Dein Modul als Slave mit einem weiteren USB-RS485 Stick als virtuellen Zähler den ich dann an meinen FEMS-Modbus hänge, oder? Und in FHEM mache ich dann lediglich ein Variablen-Mapping, oder?
- RaspPI 4+: (Cuno V2 -2x KS300, JeeLink -13x EC3000)
- Stromzähler (B+G E-Tech): 6x SDM120M, 9x XTM100A, 38x DRS110M
- LAN: IT LAN-Gateway mit 34x RMF-R1 (Rohrmotor24)
- WLAN: 85x Shelly, 12x Gosund SP111, 16x D1-Mini, 15x Sonoff Basic
- DECT: 6x DECT200, 8x DECT301, - HmIP: 3x FalmotC12, 16x WTH2

ChrisD

Hallo,

Wenn es ein fertiges Modul für deinen Zähler gibt solltest du dieses verwenden. Andernfalls kannst du das generische Modbus-Modul von Stefan Strobel einsetzen.

Das Mapping der Variablen erfolgt über die Kommentar-Funktion beim jeweiligen Gerät.

Grüße,

ChrisD

Guzzi-Charlie

Ob es für den vorgesehenen ABB B23 Zähler ein fertiges Modul gibt habe ich noch gar nicht geschaut. Für die anderen bisher von mir eingesetzten Zähler gab es nichts Fertiges. Da habe ich ein anderes Modul angepaßt.

"Kommentar-Funktion", ja stimmt habe ich ja in den Beiträgen schon gelesen. Hab mich nur bisher noch nicht damit beschäftigt. Da werden dann sicher noch einige Fragen auftauchen. Das dauert aber noch, da das FEMS noch nicht installiert ist. Heute ist der BYD-Batteriespeicher gekommen. Die ABB-Zähler kommen Morgen und die PV-Module sind auch schon da, aber die Unterkonstruktion fehlt noch.
- RaspPI 4+: (Cuno V2 -2x KS300, JeeLink -13x EC3000)
- Stromzähler (B+G E-Tech): 6x SDM120M, 9x XTM100A, 38x DRS110M
- LAN: IT LAN-Gateway mit 34x RMF-R1 (Rohrmotor24)
- WLAN: 85x Shelly, 12x Gosund SP111, 16x D1-Mini, 15x Sonoff Basic
- DECT: 6x DECT200, 8x DECT301, - HmIP: 3x FalmotC12, 16x WTH2

Klinki

Hi,
Hast Du Deine Modbus-Umsetzung eigentlich an den Start bekommen? Ich werde mich mit ähnlichen Thematiken auseinandersetzen. Zwar kein FEMS, aber dessen opensource-Ableger OpenEMS. Fhem hält bei mir eine ganze Menge an Stromzähler-Informationen vor - zumeist Impuls-Zähler.

Die Idee die Readings per Kommentar per Modbus zu Verfügung zu stellen, gefällt mir nicht so gut. Es setzt eine gute Strukturierung voraus, die man sich vorher überlegen muss. Eine doppelte Belegung von Slave-IDs oder Registern muss ausgeschlossen werden.

Aber es ist ja schon mal sehr schick überhaupt diese Möglichkeit zu haben!

Gruß,
Klinki

Guzzi-Charlie

Hallo,

inzwischen sind alle Zähler (auf verschiedenste Weise) eingebunden:

  • Die (2) Socomec E23 (Ertragszähler PV-Anlage 2+4), die per Modbus an FEMS hängen sind über HTTPMOD an FHEM angebunden
  • Der (1) Nova 80 (Ertragszähler PV-Anlage 1) ist per S0-Kopplung an den Photon-Datenlogger angebunden
  • Der (1) Nova 80 (Ertragszähler PV-Anlage 2) ist per S0-Kopplung mittels einem D1-Mini mit Tasmota-FW (+ Script) per MQTT an FHEM angebunden.
  • Der (1) Saia Burgess ALD1D5F (Einspeisezähler PV-Anlage 3) ist per S0-Kopplung mittels einem D1-Mini mit Tasmota-FW (+ Script) per MQTT an FHEM angebunden.
  • Die (6) B&G E-Tech XTM100A (Ertragszähler pro WR, PV-Anlage 1) sind per Modbus und RS485/USB-Stick (direkt am RasPi angesteckt) und über ein angepaßtes Modbus SDM220M-Modul an FHEM angebunden.
  • Die (3) B&G E-Tech SDM120M (Ertragszähler pro WR, PV-Anlage 2) sind per Modbus mittels einem D1-Mini mit Tasmota-FW (+ Script) per MQTT an FHEM angebunden.
  • Die (38) B&G E-Tech DRS110M (Stromkreiszähler) werden über die RS485-Schnittstelle (IEC1107-Protokoll) und RS485/USB-Stick (direkt am RasPi angesteckt) mittels Perl-Script (läuft auch auf dem FHEM-RasPi) abgefragt. Das Scrip überträgt dann minütlich die Daten per Telnet an FHEM (auch an dieser Stelle nochmal herzlichen Dank an CoolTux, der mich bei der Einbindung super unterstützt hat und ohne den ich das garantiert nicht hinbekommen hätte).
  • Die (2) ABB B23-100-112 (Wohnungs-Zwischenzähler) sind über Modbus mittels einem D1-Mini mit Tasmota-FW (+ Script) per MQTT an FHEM angebunden.
  • Die (3) ISKRA MT681 eHz  (Zweirichtungs Einspeise- und Bezugszähler) sind per optischer Schnittstelle mittels einem D1-Mini mit Tasmota-FW (+ Script) per MQTT an FHEM angebunden.

Die Zähler 3-5 werden wg. Eichablauf demnächst durch ABB B23-100-112 (3-phasig), bzw. B21-100-112 (1-phasig) ersetzt und dann ebenfalls per D1-Mini und MQTT an FHEM angebunden.

Zukünftige Projekte sind noch:

  • die Einbindung aller (6) Sensostar 2 Wärmemengenzähler (per optischer Schnittstelle/D1-Mini/MQTT)
  • das Auslesen der (2) Wasserzähler (per Kamera-Schnittstelle/D1-Mini/MQTT)
  • das Auslesen des (1) Gaszählers (entweder per Reed-Kontakt oder ebenfalls per Kamera-Schnittstelle/D1-Mini/MQTT)
  • Anbinden der (1) ABB Terra-AC Wallbox (per Modbus/D1-Mini/MQTT
  • Anbinden des zweiten BYD HVS-Speichers und des zugehörigen Goodwe ET8-WR's, die nicht am FEMS hängen (wie, weiß ich noch nicht)

- RaspPI 4+: (Cuno V2 -2x KS300, JeeLink -13x EC3000)
- Stromzähler (B+G E-Tech): 6x SDM120M, 9x XTM100A, 38x DRS110M
- LAN: IT LAN-Gateway mit 34x RMF-R1 (Rohrmotor24)
- WLAN: 85x Shelly, 12x Gosund SP111, 16x D1-Mini, 15x Sonoff Basic
- DECT: 6x DECT200, 8x DECT301, - HmIP: 3x FalmotC12, 16x WTH2

pdp1173

#66
Für eine dynamische Nulleinspeisung am Growatt SPH3600 brauche ich einen virtuellen SDM630 Leistungsmesser, dem ich selbst die Leistung mitgeben kann (3Phasen Netz mt 1 Phasen Inverter). Modbus Master zum Auslesen des Eastron SDM630 gibts einige, aber keinen für die Simulation eines solchen. Da alle Daten in FHEM vorhanden sind (SML Orbis Strommesser, Leistungsmesser Solar, etc.) habe ich dieses genial einfache Modul von ChrisD ausgesucht.  Der Growatt ist RTU Master und sucht den Energymeter auf Adresse #2. Er liest die ersten 18 Input Register. Ein einfacher Amazon USB-RS485 Stecker dient als Anschluß.

Leider hat der hier im Thread angebotene und auch der im Github vorhandene 36_ModbusSlave.pm einen Fehler, der den Betrieb mit dem Growatt unmöglich macht. Statt des Datensatzes der angekommen ist, wird nur das letzte Byte der Checksumme der Parse Routine übergeben, und die sendet dann ein 5 Byte Reply.

Fehlerhafter Code

sub ModbusSlave_Read($) {############################################################
# called from the global loop, when the select for hash->{FD} reports data
[color=red]Log 0[/color],"Read";
  my ($hash) = @_;
  my $buf = DevIo_SimpleRead($hash);
  return "" if(!defined($buf));

  my $name = $hash->{NAME};

  my $pdata = $hash->{helper}{PARTIAL};
  $pdata .= $buf;

  ModbusSlave_LogFrame($hash,"ModbusSlave_Read($name)",$pdata,4);

  if(( bytes::length($pdata) >= 4 ) && ( ModbusSlave_crc_is_ok($pdata)))
  {
    Log3 $hash,4,"ModbusSlave_Read($name) : crc ok, parsing request";
    RemoveInternalTimer( "RTimeout:".$name);
    $hash->{helper}{PARTIAL} = undef;
    ModbusSlave_UpdateStatistics($hash,1,0,bytes::length($buf),0);  #$buf ist letzter Block
    ModbusSlave_Parse($hash, $buf);  #$buf ist letzter Block, nicht ganzer Satz


Bei 9600baud und schnellem Rechner kommt der Datensatz nicht in einem Stück, sondern Zeichen- für Zeichen. Wahrscheinlich fällt der Fehler bei einem langsamen System mit hoher Baudrate gar nicht auf.

$buf = letzter Block von empfangenen Zeichen (hier: 2. Byte der Checksumme)
$pdata = Modbus Datenblock , der verarbeitet werden soll

Richtig  muss es also heissen:


    ModbusSlave_UpdateStatistics($hash,1,0,bytes::length($pdata),0);
    ModbusSlave_Parse($hash, $pdata);


Ausserdem "müllt" der Log über das Read bei Dauerabfragen das Logfile zu. Daher habe ich es auf verbose Level 2 gesetzt:


# called from the global loop, when the select for hash->{FD} reports data
  my ($hash) = @_;
  Log3 $hash,2,"Read RTU"


Danach läuft es jetzt einfach super, über MQTT2 hole ich die benötigten Werte für Spannung (wird nicht gebraucht) und natürlich die Leistung mit Vorzeichen. Die einfache Definition hier noch der Vollständigkeit:


root@mobilheim-esx:/opt/fhem# cat fhem.cfg

attr global userattr cmdIcon devStateIcon:textField-long devStateStyle icon sortby webCmd webCmdLabel:textField-long widgetOverride
attr global autoload_undefined_devices 1
attr global autosave 0
attr global logfile ./log/fhem-%Y-%m.log
attr global modpath .
attr global motd none
attr global statefile ./log/fhem.save
attr global verbose 3

define WEB FHEMWEB 8083 global
setuuid WEB 6327fbb8-f33f-9008-edc0-7d16279fe4a5412f

# Fake FileLog entry, to access the fhem log from FHEMWEB
define Logfile FileLog ./log/fhem-%Y-%m.log Logfile
setuuid Logfile 6327fbb8-f33f-9008-3f21-7401c05374272240

define autocreate autocreate
setuuid autocreate 63294800-f33f-9008-952b-d5effcc5fb36ae0b
attr autocreate filelog ./log/%NAME-%Y.log

define eventTypes eventTypes ./log/eventTypes.txt
setuuid eventTypes 6327fbb8-f33f-9008-164d-9139fc43c197395e

# Disable this to avoid looking for new USB devices on startup
#define initialUsbCheck notify global:INITIALIZED usb create

define MQTT2_Garage MQTT2_CLIENT 192.168.188.240:1883
setuuid MQTT2_Garage 6327fbb8-f33f-9008-1fbf-fad8914b9bc67ccc
attr MQTT2_Garage room Garage

define MQTT2_ewe MQTT2_DEVICE ewe
setuuid MQTT2_ewe 63294800-f33f-9008-39d9-e9b242ee7ccfda5a
attr MQTT2_ewe IODev MQTT2_Garage
attr MQTT2_ewe readingList garage/Strom/Strom/power:.* ewe_power\
  garage/Strom/Strom/power_L1:.* ewe_power_L1\
  garage/Strom/Strom/power_L2:.* ewe_power_L2\
  garage/Strom/Strom/power_L3:.* ewe_power_L3\
  garage/Growatt/Growatt/voltage:.* ewe_voltage
attr MQTT2_ewe room Garage



define SDM630 ModbusSlave /dev/ttyUSB1@9600,8,N,1
setuuid SDM630 63294800-f33f-9008-b320-ceb744d0d0fa80f9
attr SDM630 verbose 1

define SDM630_30001 dummy
setuuid SDM630_30001 63294800-f33f-9008-cd70-66f90b0318cc4025
attr SDM630_30001 comment MBR:2,0,I,,F
attr SDM630_30001 group SDM630
attr SDM630_30001 room SDM630

define SDM630_30003 dummy
setuuid SDM630_30003 63294800-f33f-9008-5876-b9d359d188945905
attr SDM630_30003 comment MBR:2,2,I,,F
attr SDM630_30003 group SDM630
attr SDM630_30003 room SDM630

define SDM630_30005 dummy
setuuid SDM630_30005 63294800-f33f-9008-d17b-b66dc1c0651e6d07
attr SDM630_30005 comment MBR:2,4,I,,F
attr SDM630_30005 group SDM630
attr SDM630_30005 room SDM630

define SDM630_30007 dummy
setuuid SDM630_30007 63294800-f33f-9008-5bda-716d0bc978966cd8
attr SDM630_30007 comment MBR:2,6,I,,F
attr SDM630_30007 group SDM630
attr SDM630_30007 room SDM630

define SDM630_30009 dummy
setuuid SDM630_30009 63294800-f33f-9008-8b30-de23e95b435476b6
attr SDM630_30009 comment MBR:2,8,I,,F
attr SDM630_30009 group SDM630
attr SDM630_30009 room SDM630

define SDM630_30011 dummy
setuuid SDM630_30011 63294800-f33f-9008-2043-c80a26a8d1ff9246
attr SDM630_30011 comment MBR:2,10,I,,F
attr SDM630_30011 group SDM630
attr SDM630_30011 room SDM630

define SDM630_30013 dummy
setuuid SDM630_30013 63294800-f33f-9008-6f26-2784b56ef96ab936
attr SDM630_30013 comment MBR:2,12,I,,F
attr SDM630_30013 group SDM630
attr SDM630_30013 room SDM630

define SDM630_30015 dummy
setuuid SDM630_30015 63294800-f33f-9008-2e00-979ffccc4ccc5d2b
attr SDM630_30015 comment MBR:2,14,I,,F
attr SDM630_30015 group SDM630
attr SDM630_30015 room SDM630

define SDM630_30017 dummy
setuuid SDM630_30017 63294800-f33f-9008-2d2d-8818d8fd079470c0
attr SDM630_30017 comment MBR:2,16,I,,F
attr SDM630_30017 group SDM630
attr SDM630_30017 room SDM630


#define sendtogrowatt at +00:00:10 { fhem "set SDM630_30013 " . ReadingsVal('MQTT2_ewe','ewe_power',0) }

define n_ewe_power notify MQTT2_ewe:ewe_power:.* { fhem "set SDM630_30013 " . ReadingsVal('MQTT2_ewe','ewe_power',0);;fhem "set SDM630_30001 " . ReadingsNum('MQTT2_ewe','ewe_voltage',0) }

setuuid n_ewe_power 63294800-f33f-9008-bda9-d0e2698a87eabef9
attr n_ewe_power room SDM630




30001 = Spannung an der 1. Leitung
30007 = Strom an der 1. Leitung
30013 = Leistung saldiert an der 1. Leistung +/-

Selbst setze ich FHEM schon lange Zeit auf Raspi ein, fremdle jedoch mit der PERL Sprache und vor allem der Syntax. Super mächtig aber manchmal für den non-Profi extrem nervig. Daher bisher wenig selbst gemacht. Ich bitte um Entschuldigung, wenn das Beispiel nicht für jeden optimal ist.

Eine "Unschönheit" des ModbusSlave Moduls: Da nicht global eine Adresse dem Slave zugeordnet wird, sondern nur in den Registern, antwortet der Slave manchmal (während der Testphase) auch auf Aufrufe mit anderen Adressen (#1, #3, etc.) . Das "verwirrte" manche Master, die einfach nach Teilnehmern auf dem Bus suchen (wie mein Growatt). Ein optionaler Parameter für die Slave Adresse wäre eine tolle Erweiterung, sodass das Modul bei allen anderen Adressen "den Mund hält". Ich sehe aber auch das Potential in der Lösung mit übergreifenden Registern. Danke für die Bereitstellung des Moduls.

ChrisD

Hallo,

Vielen Dank für den ausführlichen Fehlerbericht. Ich habe deine Korrekturen übernommen.

Den letzen Absatz habe ich nicht ganz verstanden. Die Adresse (Unit ID) kann mit angegeben werden, in deinem Beispiel ist dies auch der Fall (MBR:2,4,I,,F). Bei Anfragen auf nicht definierte Adressen, Register oder Coils antwortet das Modul mit einem Fehler. Möchtest du diese Fehlermeldung unterdrücken ?

Grüße,

ChrisD



pdp1173

Hallo, ich denke an das "diagslave" / "modpoll" Programm als Referenz. Dieses hat in der Start Command Line den Schalter "-a 2" (für ID 2) und kann dann mit beliebigen Daten beschickt werden, ohne zu reagieren. Das ist ja die Idee vom modBUS, dass mehrere Teilnehmer auf der gleichen 2-Draht-Leitung liegen und immer der, der angesprochen ist (also die ID stimmt), seine Sendeleitung auf die Leitung legen darf. Alle anderen müssen still bleiben. Realisiert ist das elektrisch in der RS485 mit 3-State Schaltern, die zwischen Empfangen/Senden/offen im Halb-Duplex schalten. Das wird heute fast nicht mehr gebraucht, meist ist der BUS eine Punkt-zu-Punkt Verbindung; das erspart viele elektrischen Probleme , die man damit haben kann. Wir haben heute LAN/Wifi-Netzwerke stattdessen , das hat sich damit eigentlich erledigt.

Zur Antwort auf deine Frage: Bei einer Anfrage, die zu keinem Register oder Coil passt, wäre IMHO das Richtige, einfach nicht zu antworten. Dennoch kann das auch so bleiben, da 99% der Fälle die Point-2-Point Situation ist.

Danke.

ChrisD

#69
Hallo,

Das aktuelle Verhalten ist auf einem seriellen Bus mit mehreren Teilnehmer in der Tat nicht sinnvoll.

Ich habe das Modul um das Attribut slaveAddress erweitert. Damit kann festgelegt werden auf welche Adresse(n) geantwortet werden soll. Wenn das Attribut nicht definiert ist wird wie bisher auf alles geantwortet. Beim Attribut kann entweder eine einzelne Adresse oder eine Regexp angegeben werden, z.B.:
attr mbslave slaveAddress [1|7|12]
Hier würde nur auf die Adressen 1, 7 und 12 geantwortet.

Grüße,

ChrisD

Die aktuelle Version kann hier heruntergeladen werden.

pdp1173

Klappt wunderbar, vielen Dank!

8)

Guzzi-Charlie

Hallo zusammen,

nach langer Abstinenz jetzt ein weiterer Fortschritt in Sachen "Anbindung an FHEM".

Der Punkt:
  • Anbinden des zweiten BYD HVS-Speichers und des zugehörigen Goodwe ET8-WR's, die nicht am FEMS hängen (wie, weiß ich noch nicht)

ist inzwischen erfolgreich abgehakt.
  • Sowohl die BYD HVS-Speicher lassen sich jetzt anbinden (mit dem FHEM-Modul "23_BYDBox.pm", Danke an MadMax dafür).
  • als auch die Goodwe-Wechselrichter der ET-Serie sind inzwischen integriert (über das fhempy-binding und das entsprechende fhempy-Modul "goodwe", Danke an dominik dafür).
    p.s. ==> über fhempy lassen sich auch Autos von KIA/Hyundai in FHEM integrieren.
- RaspPI 4+: (Cuno V2 -2x KS300, JeeLink -13x EC3000)
- Stromzähler (B+G E-Tech): 6x SDM120M, 9x XTM100A, 38x DRS110M
- LAN: IT LAN-Gateway mit 34x RMF-R1 (Rohrmotor24)
- WLAN: 85x Shelly, 12x Gosund SP111, 16x D1-Mini, 15x Sonoff Basic
- DECT: 6x DECT200, 8x DECT301, - HmIP: 3x FalmotC12, 16x WTH2