Zum Hauptinhalt springen

Modbus Interface

Übersicht

Dieses Dokument beschreibt die Modbus-TCP/IP-Schnittstelle zur Steuerung der LED-Streifen und SMC-Taster von SEHx01/SEH11-Geräten. Die Modbus-Schnittstelle arbeitet parallel zur bestehenden MQTT-Steuerung. Beide Schnittstellen können gleichzeitig verwendet werden.

Physikalische Schnittstelle

ParameterWert
ProtokollModbus
SchnittstelleTCP/IP
Geräte-ID1 (konfigurierbar)

Register-Übersicht

Holding Registers (Function 03/06/16)

Der Controller unterstützt 5 LED-Streifen (LED_STRIP_1 bis LED_STRIP_5). Jeder Streifen kann mehrere Segmente enthalten. Pro Streifen sind bis zu 8 Segmente konfigurierbar. Jedes Segment unterstützt bis zu 3 Farben.

Globale Register

RegisterBeschreibungDatentypBereichR/W
0Modbus Device IDUINT161-247R/W
2Apply/TriggerUINT160/1W
3Reserved---
4Reserved---

Apply/Trigger (Register 2): Nachdem alle gewünschten Streifen-/Segment-Register beschrieben wurden, muss Register 2 auf 1 gesetzt werden, um die Änderungen zu übernehmen. Das Register wird nach der Anwendung der Änderungen automatisch wieder auf 0 zurückgesetzt.


Streifen-Register

Jeder Streifen belegt einen Block von 100 Registern. Die Basisadresse für Streifen N (N = 1..5) berechnet sich wie folgt:

Basisadresse = 100 * N

OffsetBeschreibungDatentypBereichR/W
0ActiveUINT160/1R/W
1Segment CountUINT160-8R/W
2-9Reserved---

Segment-Register

Innerhalb eines Streifen-Blocks belegt jedes Segment 11 Register. Die Basisadresse für Segment M (M = 0..7) innerhalb von Streifen N lautet:

Segment-Basisadresse = (100 _ N) + 10 + (M _ 11)

OffsetBeschreibungDatentypBereichR/W
0StartLEDUINT160-311R/W
1StopLEDUINT160-311R/W
2EffectUINT16siehe EffekteR/W
3SpeedUINT161-246R/W
4Color 1 - RedUINT160-255R/W
5Color 1 - GreenUINT160-255R/W
6Color 1 - BlueUINT160-255R/W
7Color 2 - RedUINT160-255R/W
8Color 2 - GreenUINT160-255R/W
9Color 2 - BlueUINT160-255R/W
10Color 3 - RedUINT160-255R/W
11Color 3 - GreenUINT160-255R/W
12Color 3 - BlueUINT160-255R/W

SMC-Taster-Steuerung (Holding Registers)

Zusätzlich zu den LED-Streifen können auch die angeschlossenen SMC-Taster über Modbus gesteuert werden. Dies entspricht der bestehenden MQTT-Steuerung (Topic /Set/Data/Smc). Beide Wege erzeugen intern denselben SMC-Befehl und können parallel verwendet werden.

Der SMC-Block belegt einen eigenen Registerbereich ab Basisadresse 1000 und besitzt einen eigenen Apply-Trigger, unabhängig vom LED-Apply (Register 2).

RegisterBeschreibungDatentypBereichR/W
1000SMC AddressUINT16siehe untenR/W
1001SMC CommandTypeUINT160-2 (siehe unten)R/W
1002SMC OffsetUINT160-5 (siehe unten)R/W
1003Button ModeUINT160-2R/W
1004QuantityUINT160-65535R/W
1005ColorUINT160-7R/W
1006Ring EffectUINT16siehe Ring-EffektR/W
1007Text char 0UINT160-255 (ASCII)R/W
1008Text char 1UINT160-255 (ASCII)R/W
1009Text char 2UINT160-255 (ASCII)R/W
1010Text char 3UINT160-255 (ASCII)R/W
1011Special CommandUINT16siehe SpezialbefehlR/W
1012Button RotationUINT160-1R/W
1013Assign AddressUINT16siehe untenR/W
1014-1019Reserved---
1020SMC Apply/TriggerUINT160/1W
1100-1228Hub Polling ChannelsUINT16siehe untenR/W

Analog zum MQTT-Protokoll werden CommandType (Register 1001) und Offset (Register 1002) als zwei getrennte Felder geführt. Gemeinsam legen sie fest, welche Payload-Register beim Apply ausgewertet werden. Die Hub Polling Channels belegen einen eigenen Block (Register 1100-1228), der weiter unten beschrieben wird.

SMC Address (Register 1000): Zieladresse des Befehls.

WertBedeutung
0HUB (SEH selbst)
0xFFFFALL_SENSORS (Broadcast an alle Taster)
andereSpezifische Taster-Adresse (Geräteadresse)

SMC CommandType (Register 1001): Spiegelt das Feld CommandType des MQTT-Protokolls.

WertCommandType
0- (inaktiv, nichts gesendet)
1SET_PARAMETER
2SET_STATUS

Das SMC-Protokoll definiert zusätzlich GET_STATUS, SET_UPDATE, GET_INTERNAL_STATUS und SET_INTERNAL_STATUS. Diese sind noch nicht abgebildet und können später ergänzt werden.

SMC Offset (Register 1002): Spiegelt das Feld Offset des MQTT-Protokolls.

WertOffset
0(keine / leer)
1PRE_BUTTON_MODE
2POST_BUTTON_MODE
3BUTTON_ROTATE
4SPECIAL_COMMANDS
5ADDRESS_TO_BE_ASSIGNED

Gültige Kombinationen: Beim Apply bestimmen CommandType und Offset gemeinsam, welche Payload-Register ausgewertet werden.

CommandTypeOffsetAdressePayload-Register
SET_PARAMETERPRE_BUTTON_MODEbeliebigButton Mode, Quantity, Color, Ring Effect, Text (1003-1010)
SET_PARAMETERPOST_BUTTON_MODEbeliebigButton Mode, Quantity, Color, Ring Effect, Text (1003-1010)
SET_PARAMETERBUTTON_ROTATEbeliebigButton Rotation (1012)
SET_PARAMETER(keine)HUB (0)Hub Polling Channels (1100-1228)
SET_STATUSSPECIAL_COMMANDSbeliebigSpecial Command (1011)
SET_STATUSADDRESS_TO_BE_ASSIGNEDbeliebigAssign Address (1013)

Button Mode (Register 1003):

WertBedeutung
0DISABLED
1ENABLED
2LONGPRESS_ENABLED

Color (Register 1005):

WertBedeutungWertBedeutung
0COLOFF4COLYELLOW
1COLRED5COLMAGENTA
2COLGREEN6COLCYAN
3COLBLUE7COLWHITE

Ring Effect (Register 1006):

WertBedeutungWertBedeutung
0SOLID_RING94ANIMATED_ARROW_UP
1FLASH_RING95ANIMATED_ARROW_DOWN
2CONFIRM96ANIMATED_ARROW_LEFT
84POINT_ANIMATED_CLOCK97ANIMATED_ARROW_RIGHT
85CIRCLE_ANIMATED_CLOCK102SOLID_ARROW_UP_LEFT
86SOLID_ARROW_UP103SOLID_ARROW_UP_RIGHT
87SOLID_ARROW_DOWN104SOLID_ARROW_DOWN_LEFT
88SOLID_ARROW_LEFT105SOLID_ARROW_DOWN_RIGHT
89SOLID_ARROW_RIGHT106FLASH_ARROW_UP_LEFT
90FLASH_ARROW_UP107FLASH_ARROW_UP_RIGHT
91FLASH_ARROW_DOWN108FLASH_ARROW_DOWN_LEFT
92FLASH_ARROW_LEFT109FLASH_ARROW_DOWN_RIGHT
93FLASH_ARROW_RIGHT

Special Command (Register 1011): Nur wirksam, wenn CommandType = SET_STATUS und Offset = SPECIAL_COMMANDS.

WertBedeutung
0PRE_PRESSED_STATE
1POST_PRESSED_STATE
2REBOOT
4SHOW_CURRENT_ADDRESS
5SELF_TRIGGER
6LONG_PRESSED_STATE

Text (Register 1007-1010): Bis zu 4 ASCII-Zeichen für die Taster-Anzeige, ein Zeichen pro Register (Register 1007 = erstes Zeichen). Das Zeichen wird im Low-Byte gespeichert; das High-Byte wird ignoriert. Unbenutzte Zeichen (Wert 0) werden intern mit @ aufgefüllt. Nur relevant für Ring-Effekte mit Textanzeige.

Button Rotation (Register 1012): Nur wirksam, wenn CommandType = SET_PARAMETER und Offset = BUTTON_ROTATE. Legt die Ausrichtung von Anzeige/Taster fest.

WertBedeutung
0BUTTON_ROTATION_NORMAL
1BUTTON_ROTATION_UPSIDEDOWN

Assign Address (Register 1013): Nur wirksam, wenn CommandType = SET_STATUS und Offset = ADDRESS_TO_BE_ASSIGNED. Weist dem/den adressierten Taster(n) eine Geräteadresse zu.

WertBedeutung
0NEXT (automatische Zuweisung der nächsten freien Adresse)
andereExplizite zuzuweisende Geräteadresse

Hub Polling Channels (Register 1100-1228): Nur wirksam, wenn CommandType = SET_PARAMETER, Offset = (keine) und Address = HUB (0). Legt fest, welche Taster-Adressen der HUB (SEH) aktiv abfragt. Es werden bis zu 128 Adressen unterstützt.

RegisterBeschreibungDatentypBereich
1100Polling Channel CountUINT160-128
1101Polling Channel 0UINT16Taster-Adresse
1102Polling Channel 1UINT16Taster-Adresse
............
1228Polling Channel 127UINT16Taster-Adresse

Polling-Kanal K befindet sich in Register 1101 + K (K = 0..127). Register 1100 enthält die Anzahl der gültigen Kanäle. Da eine einzelne Modbus-Anfrage auf ~123 Register begrenzt ist, muss eine lange Kanalliste in mehreren Function-16-Anfragen geschrieben werden, bevor der Apply-Trigger (Register 1020) gesetzt wird.

Die maximale Anzahl tatsächlich nutzbarer Polling-Adressen ist produktabhängig und kann geringer sein als die hier reservierten 128 Register.

SMC Apply/Trigger (Register 1020): Nachdem die SMC-Register beschrieben wurden, muss Register 1020 auf 1 gesetzt werden, um den Befehl an die Taster zu senden. Das Register wird automatisch auf 0 zurückgesetzt. Der SMC-Apply ist unabhängig vom LED-Apply (Register 2).


Input Registers (Function 04) – Status/Nur-Lese

RegisterBeschreibungDatentypBereich
0Firmware Version MajorUINT160-255
1Firmware Version MinorUINT160-255
2Firmware Version PatchUINT160-255
3Number of Configured StripsUINT160-5
4Strip 1 - Length (LEDs)UINT160-312
5Strip 2 - Length (LEDs)UINT160-312
6Strip 3 - Length (LEDs)UINT160-312
7Strip 4 - Length (LEDs)UINT160-312
8Strip 5 - Length (LEDs)UINT160-312
9Power Supply Limit (W×10)UINT160-65535
10Total Active LEDsUINT160-65535
11Error CodeUINT160-4

Fehlercodes:

CodeBedeutung
0Kein Fehler
1Kein Netzwerk
2Keine MQTT-Verbindung
3Keine Konfiguration
4Normaler Betrieb

SMC-Taster-Status (Input Registers)

Die Zustände der angeschlossenen SMC-Taster können über Input-Register zurückgelesen werden. Dies entspricht der über MQTT auf /Pub/Data/Smc publizierten Taster-Rückmeldung. Der SMC-Statusbereich beginnt bei Input-Register-Adresse 100.

Da Modbus keinen serverseitig initiierten Push kennt, müssen Statusänderungen durch Polling erkannt werden (siehe auch den Abschnitt Hinweise). Um nicht zyklisch den gesamten Statusblock lesen zu müssen, steht der SMC Event Counter zur Verfügung.

SMC Event Counter

RegisterBeschreibungDatentypBereich
100SMC Event CounterUINT160-65535

Der Zähler wird bei jeder SMC-Taster-Statusänderung erhöht und läuft bei 65535 über. Ein Client kann dieses einzelne Register kostengünstig abfragen und die Taster-Statusblöcke nur dann erneut lesen, wenn sich der Wert geändert hat. Die Register 101-109 sind reserviert.

Taster-Status-Register

Die Anzahl der abgebildeten Taster entspricht MAX_SMC_COUNT. Dieser Wert hängt vom Build-Target ab (z. B. 5 bei Standardvarianten, bis zu 128 bei bestimmten Geräten). Jeder Taster belegt einen Block von 4 Registern. Die Basisadresse für Taster K (K = 0 .. MAX_SMC_COUNT-1) berechnet sich wie folgt:

Taster-Basisadresse = 110 + (K * 4)

OffsetBeschreibungDatentypBereich
0Button AddressUINT160-65535
1Press CountUINT160-65535
2Press StateUINT16siehe unten
3Reserved--

Eine Button Address von 0 kennzeichnet einen unbenutzten/leeren Slot.

Press State (Offset 2):

WertBedeutung
0PRE_PRESSED_STATE
1POST_PRESSED_STATE
3LONGPRESS_STATE
TasterAdressePress CountPress State
0110111112
1114115116
2118119120
............
K110 + K×4111 + K×4112 + K×4

Verfügbare LED-Effekte

Effekt-IDNameBeschreibung
1StaticAlle LEDs leuchten in konstanter Farbe
2BlinkEin-/Aus-Blinken
3FlashKurze, helle Blitze
4Leading LinesVorwärts laufende Linien
5Leading Lines ReverseRückwärts laufende Linien
6MultipickerDurchlaufen mehrerer Farben
7PickAnimation von der Mitte nach außen
8PlaceAnimation von außen zur Mitte
200Knight RiderHin- und herlaufende Balkenanimation

Register-Zuordnung – Beispiel

Streifen 1, Segment 0 aktivieren (green, static)

Folgende Register müssen beschrieben werden (Function 16 - Write Multiple Registers):

RegisterWertBeschreibung
1001Strip 1 Active = true
1011Strip 1 Segment Count = 1
1100Segment 0: StartLED = 0
11120Segment 0: StopLED = 20
1121Segment 0: Effect = Static
113200Segment 0: Speed = 200
1140Segment 0: Color1 R = 0
115150Segment 0: Color1 G = 150
1160Segment 0: Color1 B = 0
1170Segment 0: Color2 R = 0
1180Segment 0: Color2 G = 0
1190Segment 0: Color2 B = 0
1200Segment 0: Color3 R = 0
1210Segment 0: Color3 G = 0
1220Segment 0: Color3 B = 0
21Apply/Trigger

Dies entspricht der folgenden MQTT-Nachricht:

{
"LED_STRIP_1": {
"Active": true,
"Segments": [
{
"StartLED": 0,
"StopLED": 20,
"Effect": 1,
"Speed": 200,
"Colors": [{ "R": 0, "G": 150, "B": 0 }]
}
]
}
}

SMC-Taster: PRE_BUTTON_MODE setzen (alle Taster, green, blinkender Ring)

Folgende Register müssen beschrieben werden (Function 16 - Write Multiple Registers):

RegisterWertBeschreibung
10000xFFFFAddress = ALL_SENSORS (Broadcast)
10011CommandType = SET_PARAMETER
10021Offset = PRE_BUTTON_MODE
10031Button Mode = ENABLED
10045Quantity = 5
10052Color = COLGREEN
10061Ring Effect = FLASH_RING
10201SMC Apply/Trigger

Dies entspricht der folgenden MQTT-Nachricht:

{
"Address": "ALL_SENSORS",
"CommandType": "SET_PARAMETER",
"Offset": "PRE_BUTTON_MODE",
"Payload": "ENABLED/5/COLGREEN/FLASH_RING/@@@@"
}

SMC-Taster: Spezialbefehl auslösen (PRE_PRESSED_STATE, alle Taster)

RegisterWertBeschreibung
10000xFFFFAddress = ALL_SENSORS (Broadcast)
10012CommandType = SET_STATUS
10024Offset = SPECIAL_COMMANDS
10110Special Command = PRE_PRESSED_STATE
10201SMC Apply/Trigger

Dies entspricht der folgenden MQTT-Nachricht:

{
"Address": "ALL_SENSORS",
"CommandType": "SET_STATUS",
"Offset": "SPECIAL_COMMANDS",
"Payload": "PRE_PRESSED_STATE"
}

SMC-Taster: Taster-Rotation setzen (alle Taster, kopfüber)

RegisterWertBeschreibung
10000xFFFFAddress = ALL_SENSORS (Broadcast)
10011CommandType = SET_PARAMETER
10023Offset = BUTTON_ROTATE
10121Button Rotation = BUTTON_ROTATION_UPSIDEDOWN
10201SMC Apply/Trigger

Dies entspricht der folgenden MQTT-Nachricht:

{
"Address": "ALL_SENSORS",
"CommandType": "SET_PARAMETER",
"Offset": "BUTTON_ROTATE",
"Payload": "BUTTON_ROTATION_UPSIDEDOWN"
}

SMC-Taster: Adresse zuweisen (alle Taster, Adresse 0x1000)

RegisterWertBeschreibung
10000xFFFFAddress = ALL_SENSORS (Broadcast)
10012CommandType = SET_STATUS
10025Offset = ADDRESS_TO_BE_ASSIGNED
10130x1000Assign Address = 0x1000
10201SMC Apply/Trigger

Dies entspricht der folgenden MQTT-Nachricht:

{
"Address": "ALL_SENSORS",
"CommandType": "SET_STATUS",
"Offset": "ADDRESS_TO_BE_ASSIGNED",
"Payload": "1000"
}

Setzen Sie Register 1013 auf 0, um automatisch die nächste freie Adresse zuzuweisen (MQTT-Payload "NEXT").

SMC-HUB: Polling-Kanäle konfigurieren (Taster 0x1000-0x1003 abfragen)

RegisterWertBeschreibung
10000Address = HUB
10011CommandType = SET_PARAMETER
10020Offset = (keine)
11004Polling Channel Count = 4
11010x1000Polling channel 0
11020x1001Polling channel 1
11030x1002Polling channel 2
11040x1003Polling channel 3
10201SMC Apply/Trigger

Dies entspricht der folgenden MQTT-Nachricht:

{
"Address": "HUB",
"CommandType": "SET_PARAMETER",
"Offset": "",
"Payload": "1000/1001/1002/1003"
}

Adressberechnung – Kurzreferenz

Strip N Base Address:    100 * N          (N = 1..5)
Strip N Active: 100 * N + 0
Strip N Segment Count: 100 * N + 1
Segment M Base Address: 100 * N + 10 + (M * 11) (M = 0..7)

SMC block (holding): selector 1000-1002, payload 1003-1013, Apply = 1020
SMC hub polling (holding): count 1100, channel K = 1101 + K (K = 0..127)
SMC event counter (input): 100
SMC status (input): button K base = 110 + (K * 4) (K = 0 .. MAX_SMC_COUNT-1)
StreifenActiveSeg.-AnzahlSeg 0Seg 1Seg 2Seg 3
1100101110121132143
2200201210221232243
3300301310321332343
4400401410421432443
5500501510521532543

Hinweise

  • Paralleler MQTT-/Modbus-Betrieb: Beide Schnittstellen schreiben auf dieselben LED-Streifen. Der zuletzt empfangene Befehl (ob MQTT oder Modbus) bestimmt den aktuellen Zustand.
  • Leistungsgrenze: Die Leistungsgrenze gilt global. Segmente, die die Leistungsgrenze überschreiten würden, werden nicht aktiviert (identisches Verhalten wie bei MQTT).
  • StopLED >= StartLED: Ist StopLED < StartLED, wird StopLED automatisch auf StartLED gesetzt.
  • Farben: Die Summe aus R+G+B pro Farbe ist auf maximal 180 begrenzt (Strombegrenzung pro LED).
  • Ungenutzte Farben: Setzen Sie ungenutzte Farbregister (Color 2, Color 3) auf 0/0/0.
  • Apply-Register: Änderungen an Streifen-/Segment-Registern werden erst wirksam, wenn 1 in Register 2 (Apply) geschrieben wird. Dies ermöglicht eine atomare Konfiguration mehrerer Streifen/Segmente.
  • SMC-Steuerung: Der SMC-Block (ab Register 1000) besitzt einen eigenen Apply-Trigger (Register 1020), unabhängig vom LED-Apply (Register 2). LED- und SMC-Befehle können somit getrennt ausgelöst werden.
  • SMC parallel zu MQTT: Modbus- und MQTT-SMC-Befehle erzeugen intern denselben SMC-Befehl und werden in dieselbe Sendewarteschlange eingereiht. Der zuletzt empfangene Befehl bestimmt den Taster-Zustand.
  • SMC-Adressierung: 0xFFFF adressiert alle Taster (Broadcast), 0 den HUB (SEH selbst), jeder andere Wert einen bestimmten Taster.
  • SMC-Status: Die Input-Register für den Taster-Status (ab Adresse 110) spiegeln die zuletzt empfangene Taster-Rückmeldung wider. Eine Button Address von 0 kennzeichnet einen unbenutzten Slot.
  • Benachrichtigung bei Statusänderung: Modbus verfügt über keinen serverseitig initiierten Push; der Server beantwortet nur Anfragen. Statusänderungen werden durch Polling des SMC Event Counter (Register 100) erkannt; die Taster-Statusblöcke werden bei einer Änderung erneut gelesen. Für echte Push-Benachrichtigungen nutzen Sie den parallel laufenden MQTT-Kanal (/Pub/Data/Smc).