Skip to content

Commit 8090e6c

Browse files
author
sidey79
committed
feat: Implementiere MqttSignalduino_DispatchFromJSON zur Verarbeitung von JSON-Nachrichten und aktualisiere die FHEM-Konfiguration
1 parent 23bbb26 commit 8090e6c

File tree

6 files changed

+178
-55
lines changed

6 files changed

+178
-55
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
##############################################
2+
# $Id: 99_MyUtils.pm 1932 2012-01-28 18:15:28Z martinp876 $
3+
package main;
4+
5+
use strict;
6+
use warnings;
7+
use JSON;
8+
use Data::Dumper;
9+
10+
sub MyUtils_Initialize {
11+
my ($hash) = @_;
12+
}
13+
14+
# Enter you functions below _this_ line.
15+
16+
sub MqttSignalduino_DispatchFromJSON {
17+
my ($json_str, $name) = @_;
18+
19+
if (!defined($json_str) || !defined($name)) {
20+
Log3 $name, 3, "MqttSignalduino_DispatchFromJSON: Missing arguments (JSON or Name)";
21+
return;
22+
}
23+
24+
my $hash = $defs{$name};
25+
if (!defined($hash)) {
26+
Log3 $name, 3, "MqttSignalduino_DispatchFromJSON: Device $name not found";
27+
return;
28+
}
29+
30+
my $data;
31+
eval {
32+
$data = decode_json($json_str);
33+
};
34+
if ($@) {
35+
Log3 $name, 3, "MqttSignalduino_DispatchFromJSON: JSON decode error: $@";
36+
return;
37+
}
38+
#print Dumper($data);
39+
40+
$hash->{Clients} = 'SD_WS:';
41+
$hash->{MatchList} = { '12:SD_WS' => '^W\d+x{0,1}#.*' };
42+
43+
# Extract fields based on expected JSON structure from MQTT
44+
# The full dispatch message is now constructed by combining 'preamble' (e.g., W126#) and 'state' (e.g., HexData).
45+
46+
my $rmsg = $data->{rawmsg} // undef;
47+
my $dmsg = $data->{payload} // undef;
48+
my $rssi = $data->{metadata}->{rssi} // undef;
49+
my $id = $data->{protocol}->{id} // undef;
50+
my $freqafc = $data->{metadata}->{freqafc} // undef;
51+
52+
if (!defined($dmsg)) {
53+
Log3 $name, 4, "MqttSignalduino_DispatchFromJSON: No dmsg found in JSON";
54+
return;
55+
}
56+
57+
# Update hash with latest values
58+
#$hash->{RAWMSG} = $rmsg if (defined($rmsg));
59+
#$hash->{RSSI} = $rssi if (defined($rssi));
60+
61+
# Prepare addvals similar to SIGNALduno_Dispatch
62+
my %addvals = (
63+
Protocol_ID => $id
64+
);
65+
66+
if (defined($rmsg)) {
67+
$addvals{RAWMSG} = $rmsg;
68+
}
69+
if (defined($rssi)) {
70+
$addvals{RSSI} = $rssi;
71+
}
72+
if (defined($freqafc)) {
73+
$addvals{FREQAFC} = $freqafc;
74+
}
75+
76+
Log3 $name, 5, "MqttSignalduino_DispatchFromJSON: Dispatching $dmsg";
77+
78+
# Call FHEM Dispatch function
79+
Dispatch($hash, $dmsg, \%addvals);
80+
}
81+
82+
1;

.devcontainer/fhem-data/fhem_signalduino_example.cfg

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ attr global verbose 3
1111
#
1212
# This file is loaded by the FHEM container via CONFIGTYPE environment variable.
1313

14+
define autocreate autocreate
1415

1516
# 1. Define FHEMWEB instance to access FHEM via Browser (Port 8083)
1617
define WEB FHEMWEB 8083 global
@@ -39,9 +40,10 @@ attr mqtt_broker autocreate simple
3940
define PySignalDuino MQTT2_DEVICE
4041
setuuid PySignalDuino 695e9c21-f33f-c986-4f81-a9f0ab37b6bcedf8
4142
attr PySignalDuino IODev mqtt_broker
42-
attr PySignalDuino readingList signalduino/v1/state/messages:.* { json2nameValue($EVENT, 'MSG_',$JSONMAP) }\
43+
attr PySignalDuino readingList signalduino/v1/state/messages:.* { MqttSignalduino_DispatchFromJSON($EVENT, $NAME);; json2nameValue($EVENT,'MSG_');; }\
4344
signalduino/v1/responses:.* { json2nameValue($EVENT, 'RESP_') }\
4445
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:
4547
attr PySignalDuino setList raw:textField signalduino/v1/commands/set/raw $EVTPART1 \
4648
cc1101_reg:textField signalduino/v1/commands/set/cc1101_reg $EVTPART1 \
4749
# System GET commands (noArg) \

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ SIGNALDuino-Firmware/
88
.devcontainer/.devcontainer.env
99
.devcontainer/mosquitto/data/
1010
.devcontainer/mosquitto/log/
11+
1112
.devcontainer/fhem-data/*
13+
!.devcontainer/fhem-data/FHEM
14+
.devcontainer/fhem-data/FHEM/*
1215
!.devcontainer/fhem-data/fhem_signalduino_example.cfg
16+
!.devcontainer/fhem-data/FHEM/99_MyUtils.pm
1317

1418
.roo/mcp.json

docs/architecture/proposals/fhem_mqtt_integration.adoc

Lines changed: 60 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,34 @@
22

33
Dieses Dokument skizziert 3 Optionen zur Integration der über MQTT publizierten JSON-Nachrichten von PySignalDuino in ein FHEM-System, das traditionell String-basierte Nachrichten via `Dispatch()` erwartet.
44

5-
Das Quell-Topic ist: `signalduino/v1/state/messages` (oder ähnlich, basierend auf der Konfiguration des Basis-Topics in PySignalDuino), mit einem JSON-Payload, der mindestens `id` (Protokoll-ID) und `data` (dekodierte Hex-Payload) enthält.
5+
Das Quell-Topic ist: `signalduino/v1/state/messages` (oder ähnlich, basierend auf der Konfiguration des Basis-Topics in PySignalDuino), mit einem JSON-Payload, der `protocol_id`, `preamble` (Protokoll-Präambel, z.B. `W126#`) und `payload` (Daten-Payload) enthält.
66

77
== Lösungsoptionen
88

99
=== Option 1: MQTT2_DEVICE + Perl-Mapping (`json2nameValue` in `attr`)
1010

11-
Diese Option nutzt die Standardfunktionalität des FHEM-Moduls `MQTT2_DEVICE` in Verbindung mit einem `attr` (Attribut), um das JSON-Payload zu parsen und spezifische Readings zu erstellen.
11+
Diese Option nutzt die Standardfunktionalität des FHEM-Moduls `MQTT2_DEVICE` in Verbindung mit einer Perl-Hilfsfunktion, um das JSON-Payload zu parsen und über den zentralen `Dispatch`-Mechanismus an die logischen Module weiterzuleiten.
12+
13+
**Implementierungs-Detail (POC):**
14+
Es wurde eine Hilfsfunktion `MqttSignalduino_DispatchFromJSON($$)` in `99_MyUtils.pm` erstellt.
15+
16+
* **Funktion:** Nimmt den JSON-String (vom MQTT-Event) und den Gerätenamen entgegen.
17+
* **Logik:** Dekodiert JSON, kombiniert `preamble` (z.B. `W126#`) und `payload` (z.B. `4001...`) und ruft `Dispatch()` mit dem Geräte-Hash auf.
18+
* **FHEM-Integration:** Aufruf erfolgt z.B. über `userReadings` oder `notify`.
19+
20+
[source,perl]
21+
----
22+
# Beispielaufruf in FHEM (z.B. userReadings oder notify)
23+
{ MqttSignalduino_DispatchFromJSON($EVENT, $NAME) }
24+
----
1225

1326
[cols="1,3"]
1427
|===
1528
|Kriterium | Beschreibung
16-
|**Vorteile** | Keine neue Modul-Entwicklung in FHEM nötig. Reine Konfiguration. Nutzt FHEM-Bordmittel. Geringste Abhängigkeiten.
17-
|**Nachteile** | FHEM-interne `Dispatch()`-Logik wird umgangen. Es muss für jeden Sensortyp ein eigenes FHEM-Device angelegt werden, das die Readings direkt von MQTT liest. Die existierenden Module wie link:../../../.devcontainer/fhem-data/FHEM/14_SD_WS.pm[`14_SD_WS.pm`] (die auf `Dispatch()` warten) können nicht direkt verwendet werden.
18-
|**Implementierungsaufwand (grob)** | **Niedrig**. Konfiguration von einem `MQTT2_DEVICE` und Erstellung der `attr` mit Perl-Code zum Parsen/Dispatch.
19-
|**Notwendige Änderungen** | **FHEM:** Ein `MQTT2_DEVICE` muss abonniert und konfiguriert werden. Wichtig: Das Attribut `Clients` muss manuell gesetzt werden (z.B. `:SD_WS:SD_...`), damit `Dispatch` die Module findet. Es ist ein Perl-Code-Snippet in den Attributen erforderlich, um den `data`-String aus dem JSON-Objekt in das erwartete Format zu transformieren und dann die Readings zu setzen.
29+
|**Vorteile** | Keine volle Modul-Entwicklung nötig. Nutzt FHEM-Bordmittel (`99_MyUtils.pm`). Ermöglicht die Wiederverwendung von `Dispatch()` und bestehenden logischen Modulen.
30+
|**Nachteile** | Erfordert manuelle Installation der Funktion in `99_MyUtils.pm`. Das `MQTT2_DEVICE` muss korrekt konfiguriert sein (z.B. `Clients` Attribut).
31+
|**Implementierungsaufwand (grob)** | **Niedrig**. Erstellung der Perl-Funktion und einmalige Einrichtung.
32+
|**Notwendige Änderungen** | **FHEM:** Ein `MQTT2_DEVICE` muss konfiguriert werden. Die Funktion `MqttSignalduino_DispatchFromJSON` muss in `99_MyUtils.pm` verfügbar sein.
2033
|===
2134

2235

@@ -30,7 +43,7 @@ Diese Option nutzt `MQTT2_DEVICE` zum Empfang des JSONs und lagert die Parsing-
3043
|**Vorteile** | Sauberer Code, aber manuelle Integration nötig. Das `MQTT2_DEVICE` wird minimalistisch gehalten. Erlaubt die Wiederverwendung von `Dispatch()`.
3144
|**Nachteile** | Erfordert Installation einer `.pm`-Datei (ähnlich wie Option 2, aber kein volles Modul). Erfordert einen `notify` oder einen `userReadings`-Aufruf, um die Logik auszuführen.
3245
|**Implementierungsaufwand (grob)** | **Niedrig bis Mittel**. Erstellung einer `.pm`-Utility-Datei mit einer Pars- und Dispatch-Funktion. Konfiguration eines `MQTT2_DEVICE`.
33-
|**Notwendige Änderungen** | **FHEM:** Erstellung einer `.pm`-Datei mit einer Utility-Funktion (z.B. `SDU_DispatchJSON($$)`). Diese Funktion wird direkt in der `readingList` des `MQTT2_DEVICE` aufgerufen. Wichtig: Das Attribut `Clients` muss am `MQTT2_DEVICE` manuell gepflegt werden. **PySignalDuino:** Keine Änderungen.
46+
|**Notwendige Änderungen** | **FHEM:** Erstellung einer `.pm`-Datei mit einer Utility-Funktion (z.B. `SDU_DispatchJSON($$)`). Diese Funktion wird direkt in der `readingList` des `MQTT2_DEVICE` aufgerufen. Wichtig: Das Attribut `Clients` muss am `MQTT2_DEVICE` manuell gepflegt werden. **PySignalDuino:** Die Payload-Generierung liefert `preamble` und `payload` separat im JSON.
3447
|===
3548

3649
=== Option 2: Eigenes FHEM-Modul (PySignalDuino-Bridge)
@@ -41,22 +54,22 @@ Ein neues FHEM-Modul, das die MQTT-Nachrichten von PySignalDuino abonniert und i
4154
|===
4255
|Kriterium | Beschreibung
4356
|**Vorteile** | **Beste Kompatibilität**. Ermöglicht die Wiederverwendung aller bestehenden FHEM-Module (z.B. link:../../../.devcontainer/fhem-data/FHEM/14_SD_WS.pm[`14_SD_WS.pm`]), da die Bridge das ursprüngliche `Dispatch()`-Verhalten emuliert. Trennung von PySignalDuino-Logik (JSON) und FHEM-Logik (String-Dispatch).
44-
|**Nachteile** | Erfordert die Entwicklung, Wartung und Installation eines neuen Perl-Moduls in FHEM. Komplexität in der JSON-zu-String-Konvertierung (Mapping der Protokoll-ID auf den String-Präfix, z.B. ID 49 auf "W49#...").
57+
|**Nachteile** | Erfordert die Entwicklung, Wartung und Installation eines neuen Perl-Moduls in FHEM.
4558
|**Implementierungsaufwand (grob)** | **Mittel**. Entwicklung des Bridge-Moduls in Perl, das die MQTT-Subscription und die JSON-Parsing/Dispatch-Logik implementiert.
46-
|**Notwendige Änderungen** | **FHEM:** Neues Perl-Modul (z.B. `98_PySignalDuinoBridge.pm` oder `00_PySignalDuinoBridge.pm`) muss erstellt werden, das den JSON-Payload parst und basierend auf der Protokoll-ID den FHEM-kompatiblen String generiert (z.B. `P<ID>#<Hex>` oder `W<ID>#<Hex>`). **PySignalDuino:** Keine Änderungen.
59+
|**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.
4760
|===
4861

4962
=== Option 3: Anpassung in PySignalDuino (FHEM-Mode)
5063

51-
PySignalDuino würde eine neue Konfigurationsoption erhalten, die es ihm erlaubt, *zusätzlich* zu oder *anstelle* des Standard-JSON-Formats die traditionellen, von FHEM erwarteten Strings zu publizieren.
64+
PySignalDuino wurde bereits angepasst, um die Felder `preamble` und `payload` zu senden, die zusammen dem FHEM-Dispatch-Format entsprechen.
5265

5366
[cols="1,3"]
5467
|===
5568
|Kriterium | Beschreibung
56-
|**Vorteile** | Höchste Performance (keine Parsing/Konvertierung in FHEM). Direkte Wiederverwendung der `00_SIGNALduino.pm` (oder `MQTT2_DEVICE` mit einfacher Regex-Subscription) zur Übergabe der Strings an `Dispatch()`.
57-
|**Nachteile** | **Verletzung des Architekturprinzips** (AGENTS.md: Architecture-First Development Process). PySignalDuino sollte eine reine Bridge sein und das standardisierte JSON-Format beibehalten. Ein FHEM-spezifisches Ausgabeformat erhöht die Wartungslast und die Kopplung.
58-
|**Implementierungsaufwand (grob)** | **Mittel**. Änderung der Python-Logik (in z.B. link:../../../signalduino/mqtt.py[`signalduino/mqtt.py`]) zur String-Formatierung basierend auf der Protokoll-ID.
59-
|**Notwendige Änderungen** | **PySignalDuino:** Implementierung der FHEM-String-Konvertierungslogik. Neue Umgebungsvariable (z.B. `MQTT_FHEM_MODE=true`). **FHEM:** Es kann der vorhandene `MQTT2_DEVICE` oder eine geringfügig angepasste Version von link:../../../.devcontainer/fhem-data/FHEM/00_SIGNALduino.pm[`00_SIGNALduino.pm`] verwendet werden, um den String direkt zu abonnieren und zu dispatchen.
69+
|**Vorteile** | Flexibles Format (JSON), das sowohl FHEM als auch andere Systeme unterstützt.
70+
|**Nachteile** | **Teilweise realisiert.** PySignalDuino sendet jetzt standardmäßig das Format mit `preamble` und `payload` im JSON.
71+
|**Implementierungsaufwand (grob)** | **Erledigt**. Änderung in `signalduino/mqtt.py` ist bereits erfolgt.
72+
|**Notwendige Änderungen** | **PySignalDuino:** `signalduino/mqtt.py` sendet `preamble` (z.B. `W126#`) und `payload` (Daten) separat. **FHEM:** Kombination von `preamble` und `payload` vor dem Dispatch.
6073
|===
6174

6275
=== Option 4: Portierung der Dekodier-Logik (Client-Module) nach PySignalDuino
@@ -101,7 +114,7 @@ Um die verschiedenen Optionen besser visualisieren zu können, folgen hier Code-
101114
[source,perl]
102115
----
103116
signalduino/v1/state/messages:.* { json2nameValue($EVENT, 'sd_') }
104-
sd_data:.* { my ($id, $data) = ($EVTPART0 =~ /sd_id_(\d+) /g, $EVTPART0 =~ /sd_data_([0-9A-F]+)/g);; if($data) { Dispatch('signalduino', "P$id\#$data") } }
117+
sd_payload:.* { my $pre = ReadingsVal($NAME, "sd_preamble", ""); my $pay = ReadingsVal($NAME, "sd_payload", ""); Dispatch('signalduino', $pre . $pay) }
105118
----
106119

107120
**Flussdiagramm:**
@@ -113,11 +126,12 @@ sequenceDiagram
113126
participant F as FHEM (MQTT2_DEVICE)
114127
participant D as FHEM (Sensor Device)
115128
116-
P ->> M: Publish JSON Payload
129+
P ->> M: Publish JSON Payload (mit "preamble": "W126#", "payload": "40...")
117130
M ->> F: MQTT Message
118131
F ->> F: readingList: json2nameValue() -> Readings
119132
F ->> F: userReadings (optional): Trigger Dispatch()
120-
F ->> F: Dispatch("P<ID>#<DATA>")
133+
F ->> F: Combine preamble + payload
134+
F ->> F: Dispatch("W126#40...")
121135
F ->> D: Message an Dispatch()
122136
D ->> D: Handle Message
123137
....
@@ -132,11 +146,9 @@ sub SDU_DispatchJSON($$) {
132146
my ($hash, $json_payload) = @_;
133147
use JSON;
134148
my $data_hash = JSON::decode_json($json_payload);
135-
my $id = $data_hash->{id};
136-
my $data = $data_hash->{data};
149+
my $msg = $data_hash->{preamble} . $data_hash->{payload};
137150
138-
# Konvertierung und Dispatch
139-
my $msg = "P" . $id . "\#" . $data;
151+
# Dispatch
140152
Dispatch($hash, $msg);
141153
return 1;
142154
}
@@ -162,8 +174,7 @@ sequenceDiagram
162174
P ->> M: Publish JSON Payload
163175
M ->> F: MQTT Message
164176
F ->> U: readingList: SDU_DispatchJSON($hash, $EVENT)
165-
U ->> U: Parse JSON
166-
U ->> U: Convert to "P<ID>#<DATA>"
177+
U ->> U: Parse JSON (combine "preamble" + "payload")
167178
U ->> F: Dispatch()
168179
F ->> D: Message an Dispatch()
169180
D ->> D: Handle Message
@@ -180,10 +191,7 @@ sub Bridge_Parse($) {
180191
# ... JSON-Payload abrufen ...
181192
use JSON;
182193
my $data_hash = JSON::decode_json($json_payload);
183-
my $id = $data_hash->{id};
184-
my $data = $data_hash->{data};
185-
186-
my $msg = "P" . $id . "\#" . $data;
194+
my $msg = $data_hash->{preamble} . $data_hash->{payload};
187195
188196
# Aufruf des Standard-Dispatch
189197
return Dispatch($hash, $msg);
@@ -201,8 +209,8 @@ sequenceDiagram
201209
202210
P ->> M: Publish JSON Payload
203211
M ->> B: MQTT Message (Subscription)
204-
B ->> B: Internal Parse/Convert Logic
205-
B ->> D: Dispatch("P<ID>#<DATA>")
212+
B ->> B: Internal Parse (combine "preamble" + "payload")
213+
B ->> D: Dispatch("W126#40...")
206214
D ->> D: Handle Message
207215
....
208216

@@ -211,15 +219,17 @@ sequenceDiagram
211219
**PySignalDuino-Code (in link:../../../signalduino/mqtt.py[`signalduino/mqtt.py`]):**
212220
[source,python]
213221
----
214-
# Wenn FHEM-Mode aktiv:
215-
fhem_string = f"P{protocol_id}#{hex_data}"
216-
mqtt_client.publish(fhem_topic, fhem_string)
222+
# Implementiert: Preamble und Payload separat
223+
# if self._protocol_handler:
224+
# preamble = self._protocol_handler.check_property(message.protocol_id, 'preamble', '')
225+
# message_dict["preamble"] = preamble
226+
# message_dict["payload"] = message.payload.upper()
217227
----
218228

219229
**FHEM-Konfiguration (MQTT2_DEVICE `readingList`):**
220230
[source,perl]
221231
----
222-
signalduino/v1/state/messages:.* { Dispatch('signalduino', $EVENT) }
232+
signalduino/v1/state/messages:.* { my $h=JSON::decode_json($EVENT); Dispatch('signalduino', $h->{preamble} . $h->{payload}) }
223233
----
224234

225235
**Flussdiagramm:**
@@ -231,10 +241,10 @@ sequenceDiagram
231241
participant F as FHEM (MQTT2_DEVICE)
232242
participant D as FHEM (Sensor Device)
233243
234-
P ->> P: Convert to "P<ID>#<DATA>" String
235-
P ->> M: Publish FHEM String Payload
244+
P ->> P: Separate Preamble and Payload
245+
P ->> M: Publish JSON Payload
236246
M ->> F: MQTT Message
237-
F ->> D: readingList: Dispatch('signalduino', $EVENT)
247+
F ->> D: readingList: Dispatch('signalduino', preamble + payload)
238248
D ->> D: Handle Message
239249
....
240250

@@ -256,8 +266,9 @@ def decode_protocol_49(hex_data):
256266
# Im MQTT-Publisher:
257267
decoded_values = decode_protocol_49(data)
258268
payload = {
259-
"id": 49,
260-
"data": data,
269+
"protocol_id": "49",
270+
"preamble": "P49#",
271+
"payload": data,
261272
"values": decoded_values # Neues Feld mit interpretierten Werten
262273
}
263274
mqtt_client.publish(topic, json.dumps(payload))
@@ -273,7 +284,7 @@ Dies erzeugt Readings wie `values_temperature` und `values_battery` direkt am De
273284

274285
**Flussdiagramm:**
275286
[mermaid]
276-
....
287+
----
277288
sequenceDiagram
278289
participant P as PySignalDuino
279290
participant M as MQTT Broker
@@ -290,7 +301,7 @@ sequenceDiagram
290301
M ->> H: MQTT Message
291302
H ->> H: Auto Discovery / Sensor Update
292303
end
293-
....
304+
----
294305

295306
== Detaillierte Bewertung
296307

@@ -318,23 +329,22 @@ sequenceDiagram
318329

319330
* Dies sollte das strategische Ziel sein, um PySignalDuino zu einem echten, universellen IoT-Gateway zu machen.
320331
* Es wird empfohlen, dies **schrittweise** für die populärsten Protokolle (z.B. IT, WS) umzusetzen, während die anderen Protokolle weiterhin über Option 2 (Bridge) an FHEM übergeben werden.
321-
* Dies ermöglicht einen sanften Übergang: PySignalDuino liefert `data` (für die Bridge) UND `values` (wenn der Decoder schon portiert ist).
332+
* Dies ermöglicht einen sanften Übergang: PySignalDuino liefert `payload` (für die Bridge) UND `values` (wenn der Decoder schon portiert ist).
322333

323334
=== Implementierungs-ToDos für Option 2 (Bridge-Modul)
324335

325-
1. **Erstellung des Bridge-Moduls:** Erstellen des FHEM Perl-Moduls (z.B. `98_PySignalDuinoBridge.pm` oder `00_PySignalDuinoBridge.pm`).
326-
2. **MQTT-Abonnement:** Implementierung der Logik zur Subscription des Topics `signalduino/v1/state/messages` (oder konfiguriertem Topic).
327-
3. **JSON-Parsing:** Implementierung der Perl-Logik zum Parsen des JSON-Payloads (z.g. mit `JSON::decode_json`).
328-
4. **String-Konvertierung:** Implementierung der Logik, die `protocol_id` und `data` aus dem JSON-Objekt nimmt und den traditionellen String (z.B. `P<ID>#<Hex>` oder `W<ID>#<Hex>`) generiert.
329-
5. **Dispatching:** Aufruf von `Dispatch(<msg>)` innerhalb des Moduls, um die Nachricht an das FHEM-System weiterzugeben.
330-
6. **Konfiguration und Tests:** Dokumentation und Test der FHEM-Konfiguration (Definieren der Bridge).
336+
. **Erstellung des Bridge-Moduls:** Erstellen des FHEM Perl-Moduls (z.B. `98_PySignalDuinoBridge.pm` oder `00_PySignalDuinoBridge.pm`).
337+
. **MQTT-Abonnement:** Implementierung der Logik zur Subscription des Topics `signalduino/v1/state/messages` (oder konfiguriertem Topic).
338+
. **JSON-Parsing:** Implementierung der Perl-Logik zum Parsen des JSON-Payloads (z.g. mit `JSON::decode_json`).
339+
. **Dispatching:** Extraktion von `payload` aus dem JSON und Aufruf von `Dispatch(<msg>)`, um die Nachricht an das FHEM-System weiterzugeben.
340+
. **Konfiguration und Tests:** Dokumentation und Test der FHEM-Konfiguration (Definieren der Bridge).
331341

332342
== Geplanter Arbeitsablauf
333343

334-
1. **Phase 1 (Design/Planung):** Abschluss der Architekturanalyse und Erstellung des Plans (Abgeschlossen mit diesem Dokument).
335-
2. **Phase 2 (Implementierung):**
344+
. **Phase 1 (Design/Planung):** Abschluss der Architekturanalyse und Erstellung des Plans (Abgeschlossen mit diesem Dokument).
345+
. **Phase 2 (Implementierung):**
336346
* Erstellung des FHEM-Bridge-Moduls.
337347
* Einrichtung der FHEM-Konfiguration für das Modul.
338-
3. **Phase 3 (Validierung):** Testen der End-to-End-Kette (PySignalDuino publiziert JSON -> Bridge parst -> Bridge dismatched String -> FHEM Sensor-Device reagiert).
348+
. **Phase 3 (Validierung):** Testen der End-to-End-Kette (PySignalDuino publiziert JSON -> Bridge parst -> Bridge dismatched String -> FHEM Sensor-Device reagiert).
339349

340350
**Nächster Schritt:** Wechsel in den Code-Modus, um das FHEM-Bridge-Modul zu implementieren (oder mit der Implementierung zu beginnen).

0 commit comments

Comments
 (0)