Dieser GIRA Homeserver Logikbaustein liest mittels Modbus TCP Werte aus Geräten wie Wärmepumpen, Wallboxen etc. aus. Hierzu muss das Gerät ModbusTCP sprechen und eine Register-Beschreibung vorliegen. Bei der Anbindung von Modbus ist es sehr wichtig sehr genau vorzugehen. Sprich auch Little/Big Endian sowie die Register-Typen korrekt zu wählen.
Getestet und unterstützt im Forum wird HS-Firmware 4.12
Bei Problemen bitte hier unter Best-Pratices und häufige Fehler lesen!
Nummer | Datentyp | Default | Beschreibung |
---|---|---|---|
1 | Zahl | 0 | Schaltet den Intervall-Timer des Baustein an oder aus. 0 = Aus, 1 = an. Ist der Timer deaktiviert, so sind noch manuelle Abrufe möglich. |
2 | Zahl | 5 Sekunden | Ist die Frequenz des Intervalls, wie oft der Baustein die Werte abfragt. - Nur wenn Intervall-Abfrage aktiv! |
3 | Zahl | 1 | Bei einer 1 fragt der Baustein von außen gesteuert alle Werte ab |
4 | Text | 127.0.0.1 | Die IP-Adresse für den Wechselrichter. Hostname aktuell nicht implementiert. |
5 | Zahl | 502 | Der TCP-Port für Modbus. |
6 | Zahl | 1 | Die Modbus Unit ID. |
7 | Text | Spezielle Optionen, Kommagetrennt. Siehe Doku! | |
8 | Zahl | 0 | Word Order bei Multi-Byte Elementen. Per default: LittleEndian. (0: LittleEndian, 1: BigEndian) |
9 | Zahl | 1 | Byte Order bei Multi-Byte Elementen. Per default: BigEndian. (0: LittleEndian, 1: BigEndian) |
10 | Zahl | 0 | Offset, bewegt alle Register in eine oder andere Richtung. In der Regel 0, gern aber auch -1 |
11 | Zahl | 0 | Eintrag in Debug-Seite. 0: Nein, 1: Ja |
12 | Zahl | -1 | Abfrage 1: Modbus-Register in Dezimal Darstellung. -1: Abfrage wird deaktiviert |
13 | Zahl | 3 | Abfrage 1: Lese-Mechanismus / -Function: 1=Coil, 2=Discrete, 3=Holding, 4=Input |
14 | Text | uint16 | Abfrage 1: Datentyp |
15 | Zahl | 1 | Abfrage 1: Bei numerischen Datentypen: Multiplikator, bei String: Länge des Strings für Abfrage |
16 | Zahl | -1 | Abfrage 2: Modbus-Register in Dezimal Darstellung. -1: Abfrage wird deaktiviert |
17 | Zahl | 3 | Abfrage 2: Lese-Mechanismus / -Function: 1=Coil, 2=Discrete, 3=Holding, 4=Input |
18 | Text | uint16 | Abfrage 2: Datentyp |
19 | Zahl | 1 | Abfrage 2: Bei numerischen Datentypen: Multiplikator, bei String: Länge des Strings für Abfrage |
20 | Zahl | -1 | Abfrage 3: Modbus-Register in Dezimal Darstellung. -1: Abfrage wird deaktiviert |
21 | Zahl | 3 | Abfrage 3: Lese-Mechanismus / -Function: 1=Coil, 2=Discrete, 3=Holding, 4=Input |
22 | Text | uint16 | Abfrage 3: Datentyp |
23 | Zahl | 1 | Abfrage 3: Bei numerischen Datentypen: Multiplikator, bei String: Länge des Strings für Abfrage |
24 | Zahl | -1 | Abfrage 4: Modbus-Register in Dezimal Darstellung. -1: Abfrage wird deaktiviert |
25 | Zahl | 3 | Abfrage 4: Lese-Mechanismus / -Function: 1=Coil, 2=Discrete, 3=Holding, 4=Input |
26 | Text | uint16 | Abfrage 4: Datentyp |
27 | Zahl | 1 | Abfrage 4: Bei numerischen Datentypen: Multiplikator, bei String: Länge des Strings für Abfrage |
28 | Zahl | -1 | Abfrage 5: Modbus-Register in Dezimal Darstellung. -1: Abfrage wird deaktiviert |
29 | Zahl | 3 | Abfrage 5: Lese-Mechanismus / -Function: 1=Coil, 2=Discrete, 3=Holding, 4=Input |
30 | Text | uint16 | Abfrage 5: Datentyp |
31 | Zahl | 1 | Abfrage 5: Bei numerischen Datentypen: Multiplikator, bei String: Länge des Strings für Abfrage |
32 | Zahl | -1 | Abfrage 6: Modbus-Register in Dezimal Darstellung. -1: Abfrage wird deaktiviert |
33 | Zahl | 3 | Abfrage 6: Lese-Mechanismus / -Function: 1=Coil, 2=Discrete, 3=Holding, 4=Input |
34 | Text | uint16 | Abfrage 6: Datentyp |
35 | Zahl | 1 | Abfrage 6: Bei numerischen Datentypen: Multiplikator, bei String: Länge des Strings für Abfrage |
36 | Zahl | -1 | Abfrage 7: Modbus-Register in Dezimal Darstellung. -1: Abfrage wird deaktiviert |
37 | Zahl | 3 | Abfrage 7: Lese-Mechanismus / -Function: 1=Coil, 2=Discrete, 3=Holding, 4=Input |
38 | Text | uint16 | Abfrage 7: Datentyp |
39 | Zahl | 1 | Abfrage 7: Bei numerischen Datentypen: Multiplikator, bei String: Länge des Strings für Abfrage |
40 | Zahl | -1 | Abfrage 8: Modbus-Register in Dezimal Darstellung. -1: Abfrage wird deaktiviert |
41 | Zahl | 3 | Abfrage 8: Lese-Mechanismus / -Function: 1=Coil, 2=Discrete, 3=Holding, 4=Input |
42 | Text | uint16 | Abfrage 8: Datentyp |
43 | Zahl | 1 | Abfrage 8: Bei numerischen Datentypen: Multiplikator, bei String: Länge des Strings für Abfrage |
Der Datentyp ist nur nötig bei Registertypen 3 (Holding) und 4 (Input). Bei den Anderen (Coil, Discrete) wird dieser ignoriert, da es sich um boolische Rückgabewerte handelt (0 oder 1).
Änderungen von Eingängen die keine Werte darstellen werden beim nächsten Wert berücksichtigt - führen aber NICHT zu einem neu-senden der bestehenden Werte.
Alle Ausgänge senden bei jedem Abruf den entsprechenden Wert -- unabhängig davon, ob dieser sich geändert hat oder nicht. Der Datentyp des KO, das mit dem Ausgang verbunden wird hängt vom Modbus-Register ab: Je nach Länge machen auch nur größere Genauigkeiten beim KO Sinn.
Nummer | Beschreibung |
---|---|
1 | Gibt eine 1 aus nach einem erfolgreichen Durchlauf. Kann mit Eingang 3 verbunden werden für eine Verkettung |
2 | Register 1: Ausgelesener nummerischer Wert (nur wenn nummerisch!) |
3 | Register 1: Ausgelesener Wert als String |
4 | Register 2: Ausgelesener nummerischer Wert (nur wenn nummerisch!) |
5 | Register 2: Ausgelesener Wert als String |
6 | Register 3: Ausgelesener nummerischer Wert (nur wenn nummerisch!) |
7 | Register 3: Ausgelesener Wert als String |
8 | Register 4: Ausgelesener nummerischer Wert (nur wenn nummerisch!) |
9 | Register 4: Ausgelesener Wert als String |
10 | Register 5: Ausgelesener nummerischer Wert (nur wenn nummerisch!) |
11 | Register 5: Ausgelesener Wert als String |
12 | Register 6: Ausgelesener nummerischer Wert (nur wenn nummerisch!) |
13 | Register 6: Ausgelesener Wert als String |
14 | Register 7: Ausgelesener nummerischer Wert (nur wenn nummerisch!) |
15 | Register 7: Ausgelesener Wert als String |
16 | Register 8: Ausgelesener nummerischer Wert (nur wenn nummerisch!) |
17 | Register 8: Ausgelesener Wert als String |
Folgende Datentypen werden unterstützt. Unbekannte Typen werden übersprungen! Bei RegisterType 'Coil' spielt der Datentyp keine Rolle: Es wird 1 für True und 0 für False zurückgegeben.
Typ | Register-Anzahl | Beschreibung |
---|---|---|
int8 | 1 | Vorzeichenbehafteten Wert aus: -128 - 127 |
uint8 | 1 | Vorzeichenlosen Wert aus: 0 - 255 |
int16 | 1 | Vorzeichenbehafteten Wert aus: -32.768 - 32.767 |
uint16 | 1 | Vorzeichenlosen Wert aus: 0 - 65.535 |
int32 | 2 | Vorzeichenbehafteten Wert aus: −2.147.483.648 - 2.147.483.647 |
uint32 | 2 | Vorzeichenlosen Wert aus: 0 - 4.294.967.295 |
int64 | 4 | Vorzeichenbehafteten Wert aus: −9.223.372.036.854.775.808 - 9.223.372.036.854.775.808 |
uint64 | 4 | Vorzeichenlosen Wert aus: 0 - 18.446.744.073.709.551.615 |
float32 | 2 | Gleitkommazahl mit einfacher Genauigkeit |
float64 | 4 | Gleitkommazahl mit doppelter Genauigkeit |
Sind die Register in Modicon Notation, so ist der Typ manuell zu wählen und die vorderste Stelle zu streichen. Beispiel: 40001 => Holding Register, Function Type 3 mit Register 1
Register Adressen | Function Type | Typ |
---|---|---|
00000 - 09999 | 1 | Coil: 1bit-Register für boolische Representationen. Kann gelesen und geschrieben werden |
10000 - 19999 | 2 | Discrete Register: 1bit-Register für boolische Representationen. Kann nur gelesen werden |
30000 - 39999 | 4 | Input Register: 16bit-Register - können nur gelesen werden |
40000 - 49999 | 3 | Holding Register: 16bit-Register - können gelesen und geschrieben werden |
Komma-separiert dort angeben, was für Spezialdinge man aktivieren möchte. Beispiel: KeepAlive,Sleep100ms Eingabe ist nicht Case-Sensitiv.
Lässt die TCP-Verbindung offen für die nächste Iteration / Intervall. Sollte bei mehreren Bausteinen, die den gleichen Master abfragen NICHT verwendet werden. Macht zudem mit mehreren Modbus-Implementierungen Probleme. Wenn es aber funktioniert, reduziert es die TCP-Handshakes, da die Verbindung dauerhaft aufgebaut bleibt.
Nach einer Abfrage wartet der Baustein 100ms bevor er die nächste Abfrage macht. Manche Geräte sind mit den vielen Abfragen überfordert, da kann etwas Ruhe helfen.
Nach einer Abfrage wartet der Baustein 500ms bevor er die nächste Abfrage macht. Manche Geräte sind mit den vielen Abfragen überfordert, da kann etwas Ruhe helfen.
Nach einer Abfrage wartet der Baustein 1s bevor er die nächste Abfrage macht. Manche Geräte sind mit den vielen Abfragen überfordert, da kann etwas Ruhe helfen. Wichtig: Achte darauf, dass die Durchläufe sich nicht einholen: 8 Register abfragen je eine Sekunde: Nimm mehr als 10s Intervall!
Nach einer Abfrage wartet der Baustein 2s bevor er die nächste Abfrage macht. Manche Geräte sind mit den vielen Abfragen überfordert, da kann etwas Ruhe helfen. Wichtig: Achte darauf, dass die Durchläufe sich nicht einholen: 8 Register abfragen je eine Sekunde: Nimm mehr als 10s Intervall!
Kann kombiniert werden mit den anderen Sleeps: Sleep1s,Sleep2s
=> Wartet 3s
Während ohne KeepAlive alle (8) Register hintereinander über eine Verbindung gelesen und diese dann geschlossen wird, schließt dieser Parameter nach jedem Lese-Vorgang die Verbindung und startet danach mit einer frischen TCP-Verbindung. Dies hilft bei schlechten Implementierungen der Gegenseite, erzeugt aber mehr Last auf dem HomeServer und der Gegenseite, da jedes Mal eine neue TCP-Verbindung aufgebaut wird.
Hilft z.B. gegen Fehlermeldungen wie:
Message: Modbus Error: [Connection] ModbusTcpClient(192.168.XXX.XXX:502): Connection unexpectedly closed 0.000034 seconds into read of 8 bytes without response from unit before it closed connection
Hilft auch, dass die Verbindung nicht während der Wartezeit von z.B. Sleep500ms
offengehalten wird. Kann der Modbus-Server nur eine IP-Verbindung zu Zeit ist ansonsten die Verbindung blockiert.
- Wenn das Gerät unbekannt ist, sollte mit einem Tool auf dem PC erstmal versucht werden Register zu lesen.
- Modbus-Beschreibung sehr gründlich bzgl. der UnitId, Endianess und den Datentypen lesen!
- Verwende den Live-Debug vom Homeserver, um später Werte zu überprüfen und Einstellungen zur Laufzeit anzupassen
- Schalte den Debug-Modus nur auf einem Baustein ein und überprüfe bei dem Problem-Baustein die Debug-Ausgaben!
- Werte kommen, aber alle 32-Bit Register sind falsch? Überprüfe die Endianess: E8 mal auf 1 setzen
- Werte sind alle falsch: Manche zählen die Register dezimal von 1 an, andere bei 0. Der Baustein arbeitet mit 0: Versuche mal E10 auf -1 zu setzen
- Die Register sind 5-Stellig und sehen aus wie Modicon: Lasse die erste Ziffer weg und setze den Register-Typen entlang der Register-Typen Beschreibung: 34567 => Input Register 4567
- Das Gerät antwortet unregelmäßig oder garnicht mehr: Frage es seltener ab. Füge Sleeps zwischen den einzelnen Werten hinzu - Siehe Spezialoptionen auf Eingang 7
Der Logikbaustein zeigt auch die Werte und weitere interne Status-Informationen im Debug-Fenster des Homeservers an. Dort sind auch die letzten Fehler einzusehen:
- Homeserver hslist aufrufen: https://>/hslist
- Listenschlüssel:
debug
, Username und Passwort von einem admin-User eingeben. - Unter HSL2.0 oder hs_modbusTCP_reader14184 die Fehler suchen oder die Werte überprüfen.
Es wird weder eine Haftung noch eine Gewährleistung übernommen. Für den Betrieb ist der Anlagenbetreiber bzw. Integrator verantwortlich.
- Der Sourcecode ist auf Github zu finden: hs_modbusTCP_reader
- Der Baustein wird im KNX-Forum diskutiert: Thread
- Der Baustein wird unter der LGPL 2.1 frei für die private Nutzung zur Verfügung gestellt.
- Die Nutzung des Logikbausteins ist für Endverbraucher frei, wenn sie diese selbst und selbstständig in Betrieb nehmen und konfigurieren. - Integratoren haben eine angemessene Aufwandsentschädigung zu leisten. Diese kann beim Autoren angefragt werden.
- Freie Software heißt nicht freie Wartung & Support und geschieht auf freiwilliger Basis
- Es wird keine Gewährleistung noch Haftung für Schäden aus der Nutzung des Bausteins übernommens der Nutzung des Bausteins übernommen
- Er enthält folgende weiteren Libraries und Lizenzen
- pymodbus - Own License
- pyserial - BSD-3-Clause License
- six - MIT License