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
| Parameter | Wert |
|---|---|
| Protokoll | Modbus |
| Schnittstelle | TCP/IP |
| Geräte-ID | 1 (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
| Register | Beschreibung | Datentyp | Bereich | R/W |
|---|---|---|---|---|
| 0 | Modbus Device ID | UINT16 | 1-247 | R/W |
| 2 | Apply/Trigger | UINT16 | 0/1 | W |
| 3 | Reserved | - | - | - |
| 4 | Reserved | - | - | - |
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
| Offset | Beschreibung | Datentyp | Bereich | R/W |
|---|---|---|---|---|
| 0 | Active | UINT16 | 0/1 | R/W |
| 1 | Segment Count | UINT16 | 0-8 | R/W |
| 2-9 | Reserved | - | - | - |
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)
| Offset | Beschreibung | Datentyp | Bereich | R/W |
|---|---|---|---|---|
| 0 | StartLED | UINT16 | 0-311 | R/W |
| 1 | StopLED | UINT16 | 0-311 | R/W |
| 2 | Effect | UINT16 | siehe Effekte | R/W |
| 3 | Speed | UINT16 | 1-246 | R/W |
| 4 | Color 1 - Red | UINT16 | 0-255 | R/W |
| 5 | Color 1 - Green | UINT16 | 0-255 | R/W |
| 6 | Color 1 - Blue | UINT16 | 0-255 | R/W |
| 7 | Color 2 - Red | UINT16 | 0-255 | R/W |
| 8 | Color 2 - Green | UINT16 | 0-255 | R/W |
| 9 | Color 2 - Blue | UINT16 | 0-255 | R/W |
| 10 | Color 3 - Red | UINT16 | 0-255 | R/W |
| 11 | Color 3 - Green | UINT16 | 0-255 | R/W |
| 12 | Color 3 - Blue | UINT16 | 0-255 | R/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).
| Register | Beschreibung | Datentyp | Bereich | R/W |
|---|---|---|---|---|
| 1000 | SMC Address | UINT16 | siehe unten | R/W |
| 1001 | SMC CommandType | UINT16 | 0-2 (siehe unten) | R/W |
| 1002 | SMC Offset | UINT16 | 0-5 (siehe unten) | R/W |
| 1003 | Button Mode | UINT16 | 0-2 | R/W |
| 1004 | Quantity | UINT16 | 0-65535 | R/W |
| 1005 | Color | UINT16 | 0-7 | R/W |
| 1006 | Ring Effect | UINT16 | siehe Ring-Effekt | R/W |
| 1007 | Text char 0 | UINT16 | 0-255 (ASCII) | R/W |
| 1008 | Text char 1 | UINT16 | 0-255 (ASCII) | R/W |
| 1009 | Text char 2 | UINT16 | 0-255 (ASCII) | R/W |
| 1010 | Text char 3 | UINT16 | 0-255 (ASCII) | R/W |
| 1011 | Special Command | UINT16 | siehe Spezialbefehl | R/W |
| 1012 | Button Rotation | UINT16 | 0-1 | R/W |
| 1013 | Assign Address | UINT16 | siehe unten | R/W |
| 1014-1019 | Reserved | - | - | - |
| 1020 | SMC Apply/Trigger | UINT16 | 0/1 | W |
| 1100-1228 | Hub Polling Channels | UINT16 | siehe unten | R/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.
| Wert | Bedeutung |
|---|---|
| 0 | HUB (SEH selbst) |
| 0xFFFF | ALL_SENSORS (Broadcast an alle Taster) |
| andere | Spezifische Taster-Adresse (Geräteadresse) |
SMC CommandType (Register 1001): Spiegelt das Feld CommandType des MQTT-Protokolls.
| Wert | CommandType |
|---|---|
| 0 | - (inaktiv, nichts gesendet) |
| 1 | SET_PARAMETER |
| 2 | SET_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.
| Wert | Offset |
|---|---|
| 0 | (keine / leer) |
| 1 | PRE_BUTTON_MODE |
| 2 | POST_BUTTON_MODE |
| 3 | BUTTON_ROTATE |
| 4 | SPECIAL_COMMANDS |
| 5 | ADDRESS_TO_BE_ASSIGNED |
Gültige Kombinationen: Beim Apply bestimmen CommandType und Offset gemeinsam, welche Payload-Register ausgewertet werden.
| CommandType | Offset | Adresse | Payload-Register |
|---|---|---|---|
| SET_PARAMETER | PRE_BUTTON_MODE | beliebig | Button Mode, Quantity, Color, Ring Effect, Text (1003-1010) |
| SET_PARAMETER | POST_BUTTON_MODE | beliebig | Button Mode, Quantity, Color, Ring Effect, Text (1003-1010) |
| SET_PARAMETER | BUTTON_ROTATE | beliebig | Button Rotation (1012) |
| SET_PARAMETER | (keine) | HUB (0) | Hub Polling Channels (1100-1228) |
| SET_STATUS | SPECIAL_COMMANDS | beliebig | Special Command (1011) |
| SET_STATUS | ADDRESS_TO_BE_ASSIGNED | beliebig | Assign Address (1013) |
Button Mode (Register 1003):
| Wert | Bedeutung |
|---|---|
| 0 | DISABLED |
| 1 | ENABLED |
| 2 | LONGPRESS_ENABLED |
Color (Register 1005):
| Wert | Bedeutung | Wert | Bedeutung |
|---|---|---|---|
| 0 | COLOFF | 4 | COLYELLOW |
| 1 | COLRED | 5 | COLMAGENTA |
| 2 | COLGREEN | 6 | COLCYAN |
| 3 | COLBLUE | 7 | COLWHITE |
Ring Effect (Register 1006):
| Wert | Bedeutung | Wert | Bedeutung |
|---|---|---|---|
| 0 | SOLID_RING | 94 | ANIMATED_ARROW_UP |
| 1 | FLASH_RING | 95 | ANIMATED_ARROW_DOWN |
| 2 | CONFIRM | 96 | ANIMATED_ARROW_LEFT |
| 84 | POINT_ANIMATED_CLOCK | 97 | ANIMATED_ARROW_RIGHT |
| 85 | CIRCLE_ANIMATED_CLOCK | 102 | SOLID_ARROW_UP_LEFT |
| 86 | SOLID_ARROW_UP | 103 | SOLID_ARROW_UP_RIGHT |
| 87 | SOLID_ARROW_DOWN | 104 | SOLID_ARROW_DOWN_LEFT |
| 88 | SOLID_ARROW_LEFT | 105 | SOLID_ARROW_DOWN_RIGHT |
| 89 | SOLID_ARROW_RIGHT | 106 | FLASH_ARROW_UP_LEFT |
| 90 | FLASH_ARROW_UP | 107 | FLASH_ARROW_UP_RIGHT |
| 91 | FLASH_ARROW_DOWN | 108 | FLASH_ARROW_DOWN_LEFT |
| 92 | FLASH_ARROW_LEFT | 109 | FLASH_ARROW_DOWN_RIGHT |
| 93 | FLASH_ARROW_RIGHT |
Special Command (Register 1011): Nur wirksam, wenn CommandType = SET_STATUS und Offset = SPECIAL_COMMANDS.
| Wert | Bedeutung |
|---|---|
| 0 | PRE_PRESSED_STATE |
| 1 | POST_PRESSED_STATE |
| 2 | REBOOT |
| 4 | SHOW_CURRENT_ADDRESS |
| 5 | SELF_TRIGGER |
| 6 | LONG_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.
| Wert | Bedeutung |
|---|---|
| 0 | BUTTON_ROTATION_NORMAL |
| 1 | BUTTON_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.
| Wert | Bedeutung |
|---|---|
| 0 | NEXT (automatische Zuweisung der nächsten freien Adresse) |
| andere | Explizite 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.
| Register | Beschreibung | Datentyp | Bereich |
|---|---|---|---|
| 1100 | Polling Channel Count | UINT16 | 0-128 |
| 1101 | Polling Channel 0 | UINT16 | Taster-Adresse |
| 1102 | Polling Channel 1 | UINT16 | Taster-Adresse |
| ... | ... | ... | ... |
| 1228 | Polling Channel 127 | UINT16 | Taster-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
| Register | Beschreibung | Datentyp | Bereich |
|---|---|---|---|
| 0 | Firmware Version Major | UINT16 | 0-255 |
| 1 | Firmware Version Minor | UINT16 | 0-255 |
| 2 | Firmware Version Patch | UINT16 | 0-255 |
| 3 | Number of Configured Strips | UINT16 | 0-5 |
| 4 | Strip 1 - Length (LEDs) | UINT16 | 0-312 |
| 5 | Strip 2 - Length (LEDs) | UINT16 | 0-312 |
| 6 | Strip 3 - Length (LEDs) | UINT16 | 0-312 |
| 7 | Strip 4 - Length (LEDs) | UINT16 | 0-312 |
| 8 | Strip 5 - Length (LEDs) | UINT16 | 0-312 |
| 9 | Power Supply Limit (W×10) | UINT16 | 0-65535 |
| 10 | Total Active LEDs | UINT16 | 0-65535 |
| 11 | Error Code | UINT16 | 0-4 |
Fehlercodes:
| Code | Bedeutung |
|---|---|
| 0 | Kein Fehler |
| 1 | Kein Netzwerk |
| 2 | Keine MQTT-Verbindung |
| 3 | Keine Konfiguration |
| 4 | Normaler 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
| Register | Beschreibung | Datentyp | Bereich |
|---|---|---|---|
| 100 | SMC Event Counter | UINT16 | 0-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)
| Offset | Beschreibung | Datentyp | Bereich |
|---|---|---|---|
| 0 | Button Address | UINT16 | 0-65535 |
| 1 | Press Count | UINT16 | 0-65535 |
| 2 | Press State | UINT16 | siehe unten |
| 3 | Reserved | - | - |
Eine Button Address von 0 kennzeichnet einen unbenutzten/leeren Slot.
Press State (Offset 2):
| Wert | Bedeutung |
|---|---|
| 0 | PRE_PRESSED_STATE |
| 1 | POST_PRESSED_STATE |
| 3 | LONGPRESS_STATE |
| Taster | Adresse | Press Count | Press State |
|---|---|---|---|
| 0 | 110 | 111 | 112 |
| 1 | 114 | 115 | 116 |
| 2 | 118 | 119 | 120 |
| ... | ... | ... | ... |
| K | 110 + K×4 | 111 + K×4 | 112 + K×4 |
Verfügbare LED-Effekte
| Effekt-ID | Name | Beschreibung |
|---|---|---|
| 1 | Static | Alle LEDs leuchten in konstanter Farbe |
| 2 | Blink | Ein-/Aus-Blinken |
| 3 | Flash | Kurze, helle Blitze |
| 4 | Leading Lines | Vorwärts laufende Linien |
| 5 | Leading Lines Reverse | Rückwärts laufende Linien |
| 6 | Multipicker | Durchlaufen mehrerer Farben |
| 7 | Pick | Animation von der Mitte nach außen |
| 8 | Place | Animation von außen zur Mitte |
| 200 | Knight Rider | Hin- und herlaufende Balkenanimation |
Register-Zuordnung – Beispiel
Streifen 1, Segment 0 aktivieren (green, static)
Folgende Register müssen beschrieben werden (Function 16 - Write Multiple Registers):
| Register | Wert | Beschreibung |
|---|---|---|
| 100 | 1 | Strip 1 Active = true |
| 101 | 1 | Strip 1 Segment Count = 1 |
| 110 | 0 | Segment 0: StartLED = 0 |
| 111 | 20 | Segment 0: StopLED = 20 |
| 112 | 1 | Segment 0: Effect = Static |
| 113 | 200 | Segment 0: Speed = 200 |
| 114 | 0 | Segment 0: Color1 R = 0 |
| 115 | 150 | Segment 0: Color1 G = 150 |
| 116 | 0 | Segment 0: Color1 B = 0 |
| 117 | 0 | Segment 0: Color2 R = 0 |
| 118 | 0 | Segment 0: Color2 G = 0 |
| 119 | 0 | Segment 0: Color2 B = 0 |
| 120 | 0 | Segment 0: Color3 R = 0 |
| 121 | 0 | Segment 0: Color3 G = 0 |
| 122 | 0 | Segment 0: Color3 B = 0 |
| 2 | 1 | Apply/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):
| Register | Wert | Beschreibung |
|---|---|---|
| 1000 | 0xFFFF | Address = ALL_SENSORS (Broadcast) |
| 1001 | 1 | CommandType = SET_PARAMETER |
| 1002 | 1 | Offset = PRE_BUTTON_MODE |
| 1003 | 1 | Button Mode = ENABLED |
| 1004 | 5 | Quantity = 5 |
| 1005 | 2 | Color = COLGREEN |
| 1006 | 1 | Ring Effect = FLASH_RING |
| 1020 | 1 | SMC 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)
| Register | Wert | Beschreibung |
|---|---|---|
| 1000 | 0xFFFF | Address = ALL_SENSORS (Broadcast) |
| 1001 | 2 | CommandType = SET_STATUS |
| 1002 | 4 | Offset = SPECIAL_COMMANDS |
| 1011 | 0 | Special Command = PRE_PRESSED_STATE |
| 1020 | 1 | SMC 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)
| Register | Wert | Beschreibung |
|---|---|---|
| 1000 | 0xFFFF | Address = ALL_SENSORS (Broadcast) |
| 1001 | 1 | CommandType = SET_PARAMETER |
| 1002 | 3 | Offset = BUTTON_ROTATE |
| 1012 | 1 | Button Rotation = BUTTON_ROTATION_UPSIDEDOWN |
| 1020 | 1 | SMC 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)
| Register | Wert | Beschreibung |
|---|---|---|
| 1000 | 0xFFFF | Address = ALL_SENSORS (Broadcast) |
| 1001 | 2 | CommandType = SET_STATUS |
| 1002 | 5 | Offset = ADDRESS_TO_BE_ASSIGNED |
| 1013 | 0x1000 | Assign Address = 0x1000 |
| 1020 | 1 | SMC 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)
| Register | Wert | Beschreibung |
|---|---|---|
| 1000 | 0 | Address = HUB |
| 1001 | 1 | CommandType = SET_PARAMETER |
| 1002 | 0 | Offset = (keine) |
| 1100 | 4 | Polling Channel Count = 4 |
| 1101 | 0x1000 | Polling channel 0 |
| 1102 | 0x1001 | Polling channel 1 |
| 1103 | 0x1002 | Polling channel 2 |
| 1104 | 0x1003 | Polling channel 3 |
| 1020 | 1 | SMC 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)
| Streifen | Active | Seg.-Anzahl | Seg 0 | Seg 1 | Seg 2 | Seg 3 |
|---|---|---|---|---|---|---|
| 1 | 100 | 101 | 110 | 121 | 132 | 143 |
| 2 | 200 | 201 | 210 | 221 | 232 | 243 |
| 3 | 300 | 301 | 310 | 321 | 332 | 343 |
| 4 | 400 | 401 | 410 | 421 | 432 | 443 |
| 5 | 500 | 501 | 510 | 521 | 532 | 543 |
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
1in 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:
0xFFFFadressiert alle Taster (Broadcast),0den 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
0kennzeichnet 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).