modbus - Wie eine Adresse abfragen?

Begonnen von netpirat, 23 Mai 2021, 20:35:06

Vorheriges Thema - Nächstes Thema

netpirat

Hallo,

ich bin neu beim Thema Modbus. Den Modbusattr habe ich mit defnie installiet und er ist aktiv. Wie bekommt man nund ie Werte ausgelen, bzw. geschrieben.

Ich habe einen Modbus über TCP.

Read Input Register (0X04) Start Adress 1

Data Format Dec
Number of Register 1 Data Format Dec.

Unit ID 1. Scan Rate 1000ms

Hab das in der Englichen Doku nicht so recht gefunden. Vielleicht kann mir jemand einen Tipp geben.

Gruß


yoda_gh

Du musst uns schon verraten, was für ein Gerät Du per Modbus auslesen willst, welches Register und wo es die Dokumentation dazu gibt - pauschal kann man diese Frage nicht beantworten...

Sind die englischen Sätze Auszüge aus einer Doku?

netpirat

Hallo yoda_gh

kein Problem. Ich möchte die Paradigma Heizung Systa Smart C auslesen und steuern.

https://www.paradigma.de/wp-content/uploads/2020/10/TH-2833_V1.0_1018_Heizungsregler_SystaSmartC_Modbus-Schnittstelle-Smarthome.pdf

Mit qmodMaster über Windows kann ich die Werte schon auslesen.

Nun muss ich das nur noch in FHEM implementieren.

Danke schon mal für die Hilfe.

Gruß

yoda_gh

Also wenn Du wirklich das "input register" mit der Adresse 1 und 1 Byte Länge lesen willst, sollte es das hier eigentlich tun:


attr deinDevice obj-i1-reading readingName
attr deinDevice obj-i1-unpack n
attr deinDevice obj-i1-poll 1


Und dann mal ein "set deinDevice reread" probieren.

Ich vermute zumindest mal, dass "dec" eine Ganzzahl sein soll, falls auch negative Werte erlaubt sind, wäre es vermutlich "attr deinDevice obj-i1-unpack s>".

Sehr hilfreich ist auch "set deinDevice scanModbusObjects i1-5".

Und schreiben kann man ein "input register" nicht, wie der Name sagt, ist das nur zum Lesen. Schreiben  kann man nur "coil"s und "holding register".


yoda_gh

Sag doch einfach mal ein Beispiel-Register, das Du mit qmodMaster erfolgreich lesen kannst und was Du in qmodMaster einstellst, dann versuche ich das mal in die FHEM-Syntax zu übersetzen.

Ich kenne allerdings Modbus TCP nur von unserer Solaranlage und die hat nur Holding Register, daher kann ich für andere Register-Typen auch nur Vermutungen anstellen.

netpirat

#5
Hallo yoda-gh,

ok. Erstmal für mich zum Verständniss, muss ich für jeden Wert den ich auslese einen Modbus define machen.

Als beispiel;

ich will wissen wie die Aussentemperatur ist.

In der Tabelle B2 Messwerte
Register 30001 Lesender Zugriff 0X04@0 Anzahl Register 1
(Ich lese mit qmodMaster im Modus TCP Unit ID1 Function Code Read Input Register (0X04) Start Adresse 0  DEC ausgewählt. Namber of Register 1 Data Format DEC)

Wie kann ich das in FHEM auslesen?

Und wenn ich nun einen Zweiten Wert lesen will, Sagen wir in der Tabelle B2 das Register 30004 die Warmwassertemperatur muss ich dann einen neuen Modbus define machen? Oder kann ich die alle unter dem modbus mit attr anlegen. Ich hoffe es wird klar was  ich Frage.

Ich hoffe es wird klar was ich machen möchte. Mir ist der Weg nur noch nicht ganz klar. Aber danke schon mal, dass Du mir (einem blutigen Anfänger) so nett hilfst.

netpirat

Bilder sagen ja bekanntlich mehr als Worte - Mit qmodmaster habe ich nur diesmal alle readings ausgewertet. Stelle ich Register aber auf 1 bekomme ich natürlich nur einen Wert.

yoda_gh

Vielen Dank für die Screenshots, die sind tatsächlich sehr hilfreich. Was dort schon mal auffällt, ist, dass Du in dem Windows-Programm Unit-ID "1" eingestellt hast, in FHEM dagegen "3" (die erste Zahl im Define), so kann es nicht funktionieren. :)

Zitat von: netpirat am 23 Mai 2021, 21:20:16
Hallo yoda-gh,

ok. Erstmal für mich zum Verständniss, muss ich für jeden Wert den ich auslese einen Modbus define machen.

Du brauchst ein Define pro Modbus-TCP-Geräte-ID. Für jedes Register brauchst Du mindestens ein "obj-iXXXX-reading-*"-Attribut.

Zitat von: netpirat am 23 Mai 2021, 21:20:16
Als beispiel;

ich will wissen wie die Aussentemperatur ist.

In der Tabelle B2 Messwerte
Register 30001 Lesender Zugriff 0X04@0 Anzahl Register 1
(Ich lese mit qmodMaster im Modus TCP Unit ID1 Function Code Read Input Register (0X04) Start Adresse 0  DEC ausgewählt. Namber of Register 1 Data Format DEC)

Wie kann ich das in FHEM auslesen?

Wenn Du die ID in der Definition korrigiert hast, probier mal diese Attribute:


attr SystaSmartC obj-i30001-reading Aussentemperatur
attr SystaSmartC obj-i30001-unpack s>
attr SystaSmartC obj-i30001-poll 1


Vielleicht ist es auch "30000" statt "30001", gerne wird hier mal von 0, mal von 1 beginnend gezählt, einfach mal probieren. :)

Und statt "s>" könnte es auch "s<" sein, wenn die gelesenen Werte Unsinn sind - das genaue Datenformat wird mir vom Überfliegen der Paradigma-Dokumentation nicht klar, müsste man ggf. intensiver lesen oder mit qmodMaster vergleichen. Generell ist es immer hlifreich, erstmal ein paar Werte auszulesen, wo man das Ergebnis schon sicher kennt.

Zitat von: netpirat am 23 Mai 2021, 21:20:16
Und wenn ich nun einen Zweiten Wert lesen will, Sagen wir in der Tabelle B2 das Register 30004 die Warmwassertemperatur muss ich dann einen neuen Modbus define machen? Oder kann ich die alle unter dem modbus mit attr anlegen. Ich hoffe es wird klar was  ich Frage.

Ich hoffe es wird klar was ich machen möchte. Mir ist der Weg nur noch nicht ganz klar. Aber danke schon mal, dass Du mir (einem blutigen Anfänger) so nett hilfst.

Du brauchst dann wieder entsprechende "attr"-Kommandos wie oben, pro "-reading"-Attribut in Deinem Device wird dann (hoffentlich) ein Reading in Deinem Device angelegt, wenn Du das nächste mal "set SystaSmartC reread" machst.

yoda_gh

Noch zu den Screenshots:

  • Wie gesagt, die Modbus-ID scheint falsch zu sein, muss wohl "1" sein, nicht "3".
  • Der Wert für das "-poll"-Attribut muss immer "1" sein, nicht "3".

Statt für jedes Register eigens "*-poll 1" zu setzen, kannst Du auch global das automatische Auslesen für alle Register vom Typ "i" aktivieren:

attr SystaSmartC dev-i-defPoll 1

netpirat

Halklo yoda_gh,

dass bringt mich schon eine Ecke weiter. So langsam verstehe ich immer mehr. ICh habe nun auch den Scan durchführen können. Nur ein Reading habe ich noch nicht. Befürchte ich muss über obj.hXXXXX.reading das Objet anlegen? Und es scheint als müsste ich ein Scan Format ($hash, $val) anlegen? Werde mal probieren aber wenn Du siehst was fehlt bin ich auch über einen Tipp sehr dankbar.

netpirat

Gelöst. Deine erste Idee war schon richtig. Morgen probiere ich weitere Werte und Formatierungen aus. Ich komme dem Ziel näher.

yoda_gh

Echt, beginnt die Nummerierung miit "obj-i0", "obj-i1", usw.? Das heißt, Du siehst jetzt sinnvolle Werte für Aussentemperatur, Vorlauftemperatur, usw.?

Faszinierend, wieso schreiben sie dann in der Anleitung Register 30001, 30002, ...? Dann ist wohl die Spalte "Lesender Zugriff" die richtige und "0x04@0" heißt wohl "lesen von input register (0x04) mit der Adresse 0". Verrückte Doku. Na egal, Hauptsache es funktioniert. Wenn ich das richtig in der Doku verstanden habe, werden die Temperatur-Werte mit 10 multipliziert als Ganzzahlen angegeben, zurückrechnen kannst Du z.B. so:

attr SystaSmartC obj-i0-expr $val / 10

Die "dev-h-*"- und "obj-h*"-Atttribe kannst Du ziemlich sicher wieder löschen.

Und Änderungen immer schön eine nach der anderen durchführen, und zwischendurch die aktuelle Definition sichern. ;-)

Ach ja, rechne auch mal mit einem Absturz deiner FHEM-Instanz, wenn er Werte nicht dekodieren kann, also auch immer mal wieder "Save config" anklicken, damit die Definitionen in der fhem.cfg dauerhaft hinterlegt werden.

Überflüssige Readings (z.B. die vom Scan erzeugten) kann man übrigens mit "deletereading SystaSmartC readingName" löschen, dabei werden auch Regex akzeptiert.

yoda_gh

Ach ja, und wenn Du mal eine funktionierende Definition mit korrekten Werten hast, freuen sich andere sicher darüber, wenn Du die fertige ModbusAttr-Konfiguration mit "Raw definition" (Link ganz unten in der Device-Ansicht) kopierst und in das Board "Heizungssteuerung" (https://forum.fhem.de/index.php/board,60.0.html) postest. Sieh es als Ausgleich für meine Zeit. :-)

netpirat

Hallo,

da ich noch nichts zu Paradigma gefunden habe würde ich im Anschluss (habe noch etwas Gartenarbeit in dne nächsten Taqen) ene Doku erstellen. Das hilft sicher auhc anderen.

Ich habe deinen Code noch um die EInheit erweitert.

attr SystaSmartC obj-i0-expr $val / 10."°C"

Jetzt habe ich das auch noch mit Einheit, also 16,9   °C. Voll Cool, so wollte ich das.

Nun noch eine Frage.

Kann man dem System auch sagen, wenn eine 0 zurückkommt dann sage - Eingeschaltet und bei einer 1 sage Ausgeschaltet als Rückgabewert des Readings`?

Gruß

laserrichi

Zitat von: netpirat am 24 Mai 2021, 10:00:45
Kann man dem System auch sagen, wenn eine 0 zurückkommt dann sage - Eingeschaltet und bei einer 1 sage Ausgeschaltet als Rückgabewert des Readings`?

das geht z.b. mit map:
attr SystaSmartC obj-deinobjekt-map 1:Ausgeschaltet, 0:Eingeschaltet
RaspberryPi 4 Bullseye,Homematic,Z-Wave,Rademacher Duofern,Signalduino,Fritz7590,ESPEasy,Tasmota,Robonect,Kameras,1-Wire,Modbus,Solar,Maranz,VU+,ulanzi tc001 mit awtrix light