Skip to content

Commit 3ed0913

Browse files
author
sidey79
committed
feat: Aktualisiere FHEM-Konfiguration und Dokumentation zur Integration von PySignalduino über MQTT;
1 parent 94db914 commit 3ed0913

3 files changed

Lines changed: 76 additions & 63 deletions

File tree

.devcontainer/fhem-data/FHEM/99_MyUtils.pm

100644100755
File mode changed.
Lines changed: 12 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
attr global userattr cmdIcon devStateIcon:textField-long devStateStyle icon sortby webCmd webCmdLabel:textField-long widgetOverride
2+
attr global autoload_undefined_devices 1
23
attr global autosave 0
34
attr global logfile log/fhem-%Y-%m-%d.log
45
attr global modpath .
56
attr global nofork 0
67
attr global pidfilename log/fhem.pid
8+
attr global showInternalValues 1
79
attr global statefile ./log/fhem.save
810
attr global updateInBackground 1
911
attr global verbose 3
@@ -12,6 +14,7 @@ attr global verbose 3
1214
# This file is loaded by the FHEM container via CONFIGTYPE environment variable.
1315

1416
define autocreate autocreate
17+
setuuid autocreate 696cb3f6-f33f-c986-f3b0-817e6b68814552c3
1518

1619
# 1. Define FHEMWEB instance to access FHEM via Browser (Port 8083)
1720
define WEB FHEMWEB 8083 global
@@ -33,61 +36,20 @@ setuuid eventTypes 695e9c21-f33f-c986-9ac3-190c47641a98acb9
3336
define mqtt_broker MQTT2_CLIENT mqtt:1883
3437
setuuid mqtt_broker 695e9c21-f33f-c986-e617-d7301881c4685bc6
3538
attr mqtt_broker autocreate simple
39+
attr mqtt_broker verbose 3
3640
# end::broker_config[]
3741

3842
# tag::device_config[]
3943
# 5. Define the SignalDuino MQTT Device
40-
define PySignalDuino MQTT2_DEVICE
41-
setuuid PySignalDuino 695e9c21-f33f-c986-4f81-a9f0ab37b6bcedf8
42-
attr PySignalDuino IODev mqtt_broker
43-
attr PySignalDuino readingList signalduino/v1/state/messages:.* { use FHEM::Devices::SIGNALDuino::Message;; FHEM::Devices::SIGNALDuino::Message::json2Dispatch($EVENT, $NAME);; json2nameValue($EVENT,'MSG_');; }\
44-
signalduino/v1/responses:.* { json2nameValue($EVENT, 'RESP_') }\
45-
signalduino/v1/errors:.* { json2nameValue($EVENT, 'ERR_') }
46-
# attr PySignalDuino Clients :CUL_EM:CUL_FHTTK:CUL_TCM97001:CUL_TX:CUL_WS:Dooya:FHT:FLAMINGO:FS10:FS20:Fernotron:Hideki:IT:KOPP_FC:LaCrosse:OREGON:PCA301:RFXX10REC:Revolt:SD_AS:SD_Rojaflex:SD_BELL:SD_GT:SD_Keeloq:SD_RSL:SD_UT:SD_WS07:SD_WS09:SD_WS:SD_WS_Maverick:SOMFY:Siro:SIGNALduino_un:
47-
attr PySignalDuino setList raw:textField signalduino/v1/commands/set/raw $EVTPART1 \
48-
cc1101_reg:textField signalduino/v1/commands/set/cc1101_reg $EVTPART1 \
49-
# System GET commands (noArg) \
50-
version:noArg signalduino/v1/commands/get/system/version \
51-
freeram:noArg signalduino/v1/commands/get/system/freeram \
52-
uptime:noArg signalduino/v1/commands/get/system/uptime \
53-
# Decoder state commands \
54-
decoder_state:noArg signalduino/v1/commands/get/config/decoder \
55-
decoder_ms_enable:noArg signalduino/v1/commands/set/config/decoder_ms_enable \
56-
decoder_ms_disable:noArg signalduino/v1/commands/set/config/decoder_ms_disable \
57-
decoder_mu_enable:noArg signalduino/v1/commands/set/config/decoder_mu_enable \
58-
decoder_mu_disable:noArg signalduino/v1/commands/set/config/decoder_mu_disable \
59-
decoder_mc_enable:noArg signalduino/v1/commands/set/config/decoder_mc_enable \
60-
decoder_mc_disable:noArg signalduino/v1/commands/set/config/decoder_mc_disable \
61-
# CC1101 GET commands (noArg) \
62-
cc_config:noArg signalduino/v1/commands/get/cc1101/config \
63-
cc_patable_get:noArg signalduino/v1/commands/get/cc1101/patable \
64-
cc_register:noArg signalduino/v1/commands/get/cc1101/register \
65-
cc_freq_get:noArg signalduino/v1/commands/get/cc1101/frequency \
66-
cc_bandwidth_get:noArg signalduino/v1/commands/get/cc1101/bandwidth \
67-
cc_rampl_get:noArg signalduino/v1/commands/get/cc1101/rampl \
68-
cc_sensitivity_get:noArg signalduino/v1/commands/get/cc1101/sensitivity \
69-
cc_datarate_get:noArg signalduino/v1/commands/get/cc1101/datarate \
70-
cc_settings_get:noArg signalduino/v1/commands/get/cc1101/settings \
71-
cc_deviation_get:noArg signalduino/v1/commands/get/cc1101/deviation\
72-
# CC1101 SET commands \
73-
cc_frequency_set:textField signalduino/v1/commands/set/cc1101/frequency $EVTPART1 \
74-
cc_rampl_set:select,24,27,30,33,36,38,40,42 signalduino/v1/commands/set/cc1101/rampl $EVTPART1 \
75-
cc_sensitivity_set:select,4,8,12,16 signalduino/v1/commands/set/cc1101/sensitivity $EVTPART1 \
76-
cc_patable_set:select,-30_dBm,-20_dBm,-15_dBm,-10_dBm,-5_dBm,0_dBm,5_dBm,7_dBm,10_dBm signalduino/v1/commands/set/cc1101/patable $EVTPART1 \
77-
cc_bandwidth_set:textField signalduino/v1/commands/set/cc1101/bandwidth $EVTPART1 \
78-
cc_datarate_set:textField signalduino/v1/commands/set/cc1101/datarate $EVTPART1 \
79-
cc_deviation_set:textField signalduino/v1/commands/set/cc1101/deviation $EVTPART1 \
80-
\
81-
# Maintenance commands \
82-
factory_reset:noArg signalduino/v1/commands/set/factory_reset
83-
attr PySignalDuino stateFormat state
44+
define SignalDuino_MQTT SIGNALduino mqtt
45+
setuuid SignalDuino_MQTT 696cb50e-f33f-c986-0810-0617456cfc539073
46+
attr SignalDuino_MQTT verbose 3
8447
# end::device_config[]
85-
# Map JSON payload to readings
86-
# Define setter commands
8748

8849
# Logfile for SignalDuino
89-
define FileLog_PySignalDuino FileLog ./log/PySignalDuino-%Y.log PySignalDuino
90-
setuuid FileLog_PySignalDuino 695e9c21-f33f-c986-1981-abe9a5a366b3c989
91-
attr FileLog_PySignalDuino logtype text
50+
define FileLog_SignalDuino_MQTT FileLog ./log/FileLog_SignalDuino_MQTT-%Y.log SignalDuino_MQTT
51+
setuuid FileLog_SignalDuino_MQTT 696cb3f6-f33f-c986-687a-e2f563d64a4e8bbe
52+
attr FileLog_SignalDuino_MQTT logtype text
53+
9254
define Logfile FileLog /opt/fhem/log/fhem-%Y-%m-%d.log Logfile
93-
setuuid Logfile 695e9c21-f33f-c986-cfda-4915c3e60c145721
55+
setuuid Logfile 696cb3f6-f33f-c986-3db0-979283e5714bf221

docs/architecture/proposals/fhem_mqtt_integration.adoc

Lines changed: 64 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,20 @@ Ein neues FHEM-Modul, das die MQTT-Nachrichten von PySignalDuino abonniert und i
5959
|**Notwendige Änderungen** | **FHEM:** Neues Perl-Modul (z.B. `98_PySignalDuinoBridge.pm` oder `00_PySignalDuinoBridge.pm`) muss erstellt werden, das den JSON-Payload empfängt, `preamble` und `payload` verknüpft.
6060
|===
6161

62-
=== Option 3: Anpassung in PySignalDuino (FHEM-Mode)
62+
=== Option 3: Direkte SIGNALduino-Integration über MQTT-Wrapper (`SD_MQTT.pm`)
63+
64+
PySignalDuino publiziert Nachrichten an den `MQTT-Broker`, und das `SIGNALduino`-Modul in FHEM abonniert diese Nachrichten direkt über eine interne Wrapper-Logik (`SD_MQTT.pm`), die `MQTT2_Dispatcher` nutzt, wodurch die Notwendigkeit eines separaten `MQTT2_DEVICE` entfällt.
65+
66+
[cols="1,3"]
67+
|===
68+
|Kriterium | Beschreibung
69+
|**Vorteile** | **Nahtlose Integration**. Fühlt sich für den Nutzer wie ein USB/Netzwerk-Signalduino an, aber über MQTT. Kein separates `MQTT2_DEVICE` oder Bridge-Modul nötig. Nutzt die bestehende Dispatch-Logik von `SIGNALduino`.
70+
|**Nachteile** | Erfordert Anpassung am `SIGNALduino`-Modul (via Wrapper).
71+
|**Implementierungsaufwand (grob)** | **Mittel**. Implementierung des Wrappers `SD_MQTT.pm` und Integration in `00_SIGNALduino.pm`.
72+
|**Notwendige Änderungen** | **FHEM:** `00_SIGNALduino.pm` muss erweitert werden, um `SD_MQTT` zu laden. Konfiguration eines `MQTT2_CLIENT` (Broker).
73+
|===
74+
75+
=== Option 3b: Anpassung in PySignalDuino (FHEM-Mode)
6376

6477
PySignalDuino wurde bereits angepasst, um die Felder `preamble` und `payload` zu senden, die zusammen dem FHEM-Dispatch-Format entsprechen.
6578

@@ -93,13 +106,13 @@ PySignalDuino publiziert die demodulierten Nachrichten in einem standardisierten
93106
[cols="1,1,1,2"]
94107
|===
95108
|Option | PySignalDuino-Payload | FHEM-spezifische Konsequenzen | Systemübergreifende Eignung (HA/Node-RED)
96-
|**1, 1b, 2** | Standardisiertes JSON | Konvertierung/Parsing in FHEM notwendig. | **Gut.** Diese Systeme können JSON nativ und effizient parsen, benötigen aber eigene Logik (Templates/Scripts) zur Interpretation der Rohdaten, wenn FHEM dies nicht übernimmt.
97-
|**3** | FHEM-spezifischer String (z.B. P49#...) | Direkte Integration in FHEM möglich. | **Schlecht.** HA/Node-RED müssten proprietäre FHEM-Strings parsen oder PySignalDuino müsste doppelt senden (JSON + String), was Bandbreite/Performance kostet.
109+
|**1, 1b, 2, 3** | Standardisiertes JSON | Konvertierung/Parsing in FHEM notwendig. | **Gut.** Diese Systeme können JSON nativ und effizient parsen, benötigen aber eigene Logik (Templates/Scripts) zur Interpretation der Rohdaten, wenn FHEM dies nicht übernimmt.
110+
|**3b** | FHEM-spezifischer String (z.B. P49#...) | Direkte Integration in FHEM möglich. | **Schlecht.** HA/Node-RED müssten proprietäre FHEM-Strings parsen oder PySignalDuino müsste doppelt senden (JSON + String), was Bandbreite/Performance kostet.
98111
|**4** | Dekodiertes JSON (Werte) | Keine Dispatch-Logik nötig; direkte Nutzung der Readings. | **Exzellent.** Der "Gold Standard". MQTT-Nachrichten sind selbsterklärend und sofort nutzbar. Ermöglicht Plug & Play.
99112
|===
100113

101114
**Fazit:**
102-
* Varianten, die das standardisierte JSON von PySignalDuino beibehalten (Option 1, 1b, 2), sind für eine Koexistenz gut geeignet.
115+
* Varianten, die das standardisierte JSON von PySignalDuino beibehalten (Option 1, 1b, 2, 3), sind für eine Koexistenz gut geeignet.
103116
* **Option 4** ist der klare Gewinner für moderne IoT-Landschaften (HA, Node-RED), erfordert aber den größten Aufwand in PySignalDuino.
104117

105118

@@ -214,7 +227,45 @@ sequenceDiagram
214227
D ->> D: Handle Message
215228
....
216229

217-
=== Option 3: Anpassung in PySignalDuino (FHEM-Mode)
230+
=== Option 3: Direkte SIGNALduino-Integration über MQTT-Wrapper (`SD_MQTT.pm`)
231+
232+
**FHEM-Konfiguration:**
233+
[source,fhem]
234+
----
235+
# tag::broker_config[]
236+
# 4. Define the MQTT Client (Broker Connection)
237+
# 'mqtt' is the hostname of the broker service in docker-compose.yml
238+
define mqtt_broker MQTT2_CLIENT mqtt:1883
239+
setuuid mqtt_broker 695e9c21-f33f-c986-e617-d7301881c4685bc6
240+
attr mqtt_broker autocreate simple
241+
attr mqtt_broker verbose 3
242+
# end::broker_config[]
243+
244+
# tag::device_config[]
245+
# 5. Define the SignalDuino MQTT Device
246+
define SignalDuino_MQTT SIGNALduino mqtt
247+
setuuid SignalDuino_MQTT 696cb50e-f33f-c986-0810-0617456cfc539073
248+
attr SignalDuino_MQTT verbose 3
249+
# end::device_config[]
250+
----
251+
252+
**Flussdiagramm:**
253+
[mermaid]
254+
....
255+
sequenceDiagram
256+
participant P as PySignalDuino
257+
participant M as MQTT Broker
258+
participant S as SIGNALduino (SD_MQTT)
259+
participant D as Dispatcher
260+
261+
P ->> M: Publish JSON Payload
262+
M ->> S: MQTT Message (via IO/Select)
263+
S ->> S: SD_MQTT::Read() -> Parse JSON
264+
S ->> D: Dispatch(msg)
265+
D ->> D: Handle Message (Logical Modules)
266+
....
267+
268+
=== Option 3b: Anpassung in PySignalDuino (FHEM-Mode)
218269

219270
**PySignalDuino-Code (in link:../../../signalduino/mqtt.py[`signalduino/mqtt.py`]):**
220271
[source,python]
@@ -305,15 +356,15 @@ sequenceDiagram
305356

306357
== Detaillierte Bewertung
307358

308-
[cols="1,1,1,1,1"]
359+
[cols="1,1,1,1,1,1,1"]
309360
|===
310-
|Feature | Option 1 (Mapping) | Option 1b (Utils) | Option 2 (Bridge-Modul) | Option 4 (Portierung)
311-
|**Architektur** | "Bastel"-Lösung, unübersichtlich in Attributen | Sauberer Code, aber manuelle Integration nötig | Volle, standardkonforme FHEM-Integration | "Gold Standard", komplette Entkopplung
312-
|**Dispatch-Fähigkeit** | **Kritisch:** Erfordert manuelles `Clients`-Attribut (fehleranfällig) | **Kritisch:** Erfordert manuelles `Clients`-Attribut | **Automatisch:** Integriert im Modul | Nicht nötig (Werte kommen direkt)
313-
|**Konfigurationsaufwand** | Hoch (komplexe Regex im Attribut) | Mittel (Datei + Attribut) | Niedrig (ein `define`) | Sehr Niedrig (Auto-Create Readings)
314-
|**Wartbarkeit** | Schlecht | Gut (Code ist versionierbar) | Sehr gut (gekapseltes Modul) | Sehr gut (zentral in Python)
315-
|**Systemübergreifend** | Neutral (JSON bleibt erhalten) | Neutral (JSON bleibt erhalten) | Neutral (JSON bleibt erhalten) | **Exzellent** (Universal nutzbar)
316-
|**Entwicklungsaufwand** | Niedrig | Mittel | Mittel | **Sehr Hoch**
361+
|Feature | Option 1 (Mapping) | Option 1b (Utils) | Option 2 (Bridge-Modul) | Option 3 (Wrapper) | Option 3b (Anpassung) | Option 4 (Portierung)
362+
|**Architektur** | "Bastel"-Lösung, unübersichtlich in Attributen | Sauberer Code, aber manuelle Integration nötig | Volle, standardkonforme FHEM-Integration | Wrapper-Integration in Standard-Modul | JSON-Payload-Nutzung | "Gold Standard", komplette Entkopplung
363+
|**Dispatch-Fähigkeit** | **Kritisch:** Erfordert manuelles `Clients`-Attribut (fehleranfällig) | **Kritisch:** Erfordert manuelles `Clients`-Attribut | **Automatisch:** Integriert im Modul | **Automatisch:** Integriert via Wrapper | **Kritisch:** Erfordert manuelles `Clients`-Attribut | Nicht nötig (Werte kommen direkt)
364+
|**Konfigurationsaufwand** | Hoch (komplexe Regex im Attribut) | Mittel (Datei + Attribut) | Niedrig (ein `define`) | Niedrig (zwei `define`s) | Hoch (komplexe Regex/Funktion) | Sehr Niedrig (Auto-Create Readings)
365+
|**Wartbarkeit** | Schlecht | Gut (Code ist versionierbar) | Sehr gut (gekapseltes Modul) | Gut (Wrapper kapselt Logik) | Schlecht | Sehr gut (zentral in Python)
366+
|**Systemübergreifend** | Neutral (JSON bleibt erhalten) | Neutral (JSON bleibt erhalten) | Neutral (JSON bleibt erhalten) | Neutral (JSON bleibt erhalten) | Neutral (JSON bleibt erhalten) | **Exzellent** (Universal nutzbar)
367+
|**Entwicklungsaufwand** | Niedrig | Mittel | Mittel | Mittel | Niedrig (Erledigt) | **Sehr Hoch**
317368
|===
318369

319370
== Empfehlung

0 commit comments

Comments
 (0)