Skip to content

Commit bf34ddb

Browse files
author
sidey79
committed
Fix: docs revised
1 parent c248431 commit bf34ddb

19 files changed

+151
-122
lines changed

.devcontainer/fhem-data/fhem_signalduino_example.cfg

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,16 @@ attr WEB stylesheetPrefix dark
2525
define eventTypes eventTypes ./log/eventTypes.txt
2626
setuuid eventTypes 695e9c21-f33f-c986-9ac3-190c47641a98acb9
2727

28+
29+
# tag::broker_config[]
2830
# 4. Define the MQTT Client (Broker Connection)
2931
# 'mqtt' is the hostname of the broker service in docker-compose.yml
3032
define mqtt_broker MQTT2_CLIENT mqtt:1883
3133
setuuid mqtt_broker 695e9c21-f33f-c986-e617-d7301881c4685bc6
3234
attr mqtt_broker autocreate simple
35+
# end::broker_config[]
3336

37+
# tag::device_config[]
3438
# 5. Define the SignalDuino MQTT Device
3539
define PySignalDuino MQTT2_DEVICE
3640
setuuid PySignalDuino 695e9c21-f33f-c986-4f81-a9f0ab37b6bcedf8
@@ -75,6 +79,7 @@ attr PySignalDuino setList raw:textField signalduino/v1/commands/set/raw $EVTPAR
7579
# Maintenance commands \
7680
factory_reset:noArg signalduino/v1/commands/set/factory_reset
7781
attr PySignalDuino stateFormat state
82+
# end::device_config[]
7883
# Map JSON payload to readings
7984
# Define setter commands
8085

.github/workflows/docs.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@ jobs:
3131
- name: run asciidoctor with Kroki extension
3232
# Registriere die Kroki-Extension (-r asciidoctor-kroki) und aktiviere sie (-a kroki=).
3333
# Mermaid-Diagramme werden mit dem Kroki-Server gerendert.
34-
run: find docs -type f -name "*.adoc" -exec asciidoctor -D build/site/html -a docinfo=shared -a toc=left -a toclevels=2 -r asciidoctor-kroki -a kroki= {} \;
34+
# Verwendung von -R docs, um die Verzeichnisstruktur unter build/site/html beizubehalten
35+
run: |
36+
shopt -s globstar
37+
asciidoctor -R docs -D build/site/html -a docinfo=shared -a toc=left -a toclevels=2 -r asciidoctor-kroki -a kroki= docs/**/*.adoc
3538
3639
- name: Setup Python for Sitemap Generation
3740
uses: actions/setup-python@v5

docs/01_user_guide/index.adoc

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,37 @@ PySignalduino folgt einer modular aufgebauten Architektur:
4242

4343
[source,plantuml]
4444
----
45-
include::../../docs/diagrams/architecture.puml[]
45+
@startuml
46+
skinparam componentStyle uml2
47+
48+
package "PySignalduino Core" {
49+
[Controller] as ctrl
50+
[Command API] as cmd
51+
[Parser Layer] as parser
52+
[Transport Layer] as transport
53+
[Protocol Lib] as proto
54+
[MQTT Client] as mqtt
55+
}
56+
57+
node "Hardware" {
58+
[SIGNALDuino] as hw
59+
}
60+
61+
cloud "Infrastructure" {
62+
[MQTT Broker] as broker
63+
}
64+
65+
ctrl -down-> transport : manages
66+
ctrl -right-> parser : feeds raw data
67+
parser -right-> proto : uses for decoding
68+
ctrl -up-> mqtt : publishes events
69+
ctrl -left-> cmd : uses
70+
cmd -down-> transport : sends commands
71+
72+
transport <--> hw : Serial / TCP
73+
mqtt <--> broker : WiFi / LAN
74+
75+
@enduml
4676
----
4777

4878
Die Hauptkomponenten sind:
@@ -78,6 +108,6 @@ Für einen schnellen Einstieg folgen Sie diesen Schritten:
78108

79109
Ausführliche Anleitungen finden Sie in den folgenden Kapiteln.
80110

81-
include::installation.adoc[]
82-
include::usage.adoc[]
83-
include::mqtt_api.adoc[]
111+
include::installation.adoc[leveloffset=+1]
112+
include::usage.adoc[leveloffset=+1]
113+
include::mqtt_api.adoc[leveloffset=+1]

docs/01_user_guide/installation.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,4 +88,4 @@ Nach der Installation können Sie:
8888

8989
* Die xref:#_schnellstart[Schnellstart-Anleitung] befolgen.
9090
* Die xref:#_konfiguration[Konfiguration über Umgebungsvariablen] einrichten.
91-
* Die xref:#_mqtt_integration[MQTT-Integration] testen.
91+
* Die xref:#_mqtt_integration[MQTT-Integration] testen.

docs/01_user_guide/mqtt_api.adoc

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1-
= MQTT API Reference
2-
:doctype: book :icons: font :toc: left :toclevels: 2
1+
:doctype: book
2+
:icons: font
3+
:toc: left
4+
:toclevels: 2
35
:sectnums:
46

57
[[_mqtt_introduction]]
6-
== Einführung
8+
= Einführung
79

810
Die MQTT-Schnittstelle ermöglicht die Steuerung des PySignalduino-Gateways und den Empfang von dekodierten Nachrichten. Alle Befehle und Antworten verwenden das JSON-Format.
911

10-
=== Topics und Struktur
12+
== Topics und Struktur
1113

1214
Der **Standard-Topic** für alle MQTT-Operationen ist `signalduino/v1`.
1315
Dieser Wert kann über die Umgebungsvariable `MQTT_TOPIC` oder den CLI-Parameter `--mqtt-topic` angepasst werden. Wenn nur der Basis-Topic (z.B. `foo`) gesetzt wird, ist der finale Topic immer versionsspezifisch: `foo/v1`.
@@ -316,21 +318,10 @@ Eine vollständige Beispielkonfiguration finden Sie in der Datei `.devcontainer/
316318
[source,fhem]
317319
----
318320
# 1. Verbindung zum Broker herstellen (falls noch nicht vorhanden)
319-
define mqtt_broker MQTT2_CLIENT mqtt:1883
320-
attr mqtt_broker autocreate simple
321+
include::../../.devcontainer/fhem-data/fhem_signalduino_example.cfg[tags=broker_config]
321322
322323
# 2. PySignalduino Device definieren
323-
define PySignalDuino MQTT2_DEVICE
324-
attr PySignalDuino IODev mqtt_broker
325-
326-
# 3. Readings für empfangene Nachrichten extrahieren
327-
# Wandelt JSON-Payload automatisch in Readings um
328-
attr PySignalDuino readingList signalduino/v1/state/messages:.* { json2nameValue($EVENT, '', $JSONMAP) }
329-
330-
# 4. Senden von Befehlen ermöglichen
331-
attr PySignalDuino setList raw:textField signalduino/v1/commands/set/raw $EVTPART1 \
332-
cc1101_reg:textField signalduino/v1/commands/set/cc1101_reg $EVTPART1 \
333-
version:noArg signalduino/v1/commands/get/system/version
324+
include::../../.devcontainer/fhem-data/fhem_signalduino_example.cfg[tags=device_config]
334325
----
335326

336327
=== Wichtige Hinweise

docs/01_user_guide/usage.adoc

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
= Verwendung und Konfiguration
2-
3-
== Grundlegende Nutzung
1+
=== Grundlegende Nutzung
42

53
Die Hauptklasse `SDProtocols` stellt die Schnittstelle zur Protokollverarbeitung bereit.
64

@@ -9,11 +7,11 @@ Die Hauptklasse `SDProtocols` stellt die Schnittstelle zur Protokollverarbeitung
97
include::../../sd_protocols/sd_protocols.py[lines=25..47]
108
----
119

12-
== Integration
10+
=== Integration
1311

1412
PySignalduino ist als Bibliothek konzipiert, die beispielsweise in MQTT-Bridges oder Home-Automation-Skripten verwendet werden kann. Sie übernimmt die Erkennung und Dekodierung der Rohdaten.
1513

16-
=== Logging
14+
==== Logging
1715

1816
Für Debugging-Zwecke können Sie eine eigene Callback-Funktion registrieren:
1917

@@ -22,11 +20,11 @@ Für Debugging-Zwecke können Sie eine eigene Callback-Funktion registrieren:
2220
include::../../sd_protocols/sd_protocols.py[lines=162..170]
2321
----
2422

25-
=== MQTT Integration
23+
==== MQTT Integration
2624

2725
PySignalduino bietet eine integrierte MQTT-Integration über die Klasse `MqttPublisher`. Diese ermöglicht das Veröffentlichen dekodierter Nachrichten an einen MQTT-Broker und das Empfangen von Befehlen über MQTT-Topics.
2826

29-
==== Einrichtung und Konfiguration
27+
===== Einrichtung und Konfiguration
3028

3129
Die MQTT-Verbindung wird automatisch initialisiert, wenn die Umgebungsvariable `MQTT_HOST` gesetzt ist. Folgende Umgebungsvariablen können konfiguriert werden:
3230

@@ -44,31 +42,31 @@ Der `MqttPublisher` wird innerhalb des `SignalduinoController` verwendet und ste
4442
include::../../main.py[lines=55..84]
4543
----
4644

47-
==== MQTT-Topics
45+
===== MQTT-Topics
4846

4947
* `{topic}/messages` – JSON‑kodierte dekodierte Nachrichten (DecodedMessage)
5048
* `{topic}/commands/#` – Topic für eingehende Befehle (Wildcard-Subscription)
5149
* `{topic}/responses` – Antworten auf GET-Befehle, inkl. `get/cc1101/frequency`.
5250
* `{topic}/errors` – Fehlerantworten.
5351
* `{topic}/status` – Heartbeat‑ und Statusmeldungen (optional)
5452

55-
==== Heartbeat-Funktionalität
53+
===== Heartbeat-Funktionalität
5654

5755
Der Publisher sendet regelmäßig einen Heartbeat („online“) unter `{topic}/status`, solange die Verbindung besteht.
5856
Bei Verbindungsabbruch wird „offline“ gepublished.
5957

60-
==== Beispiel: Manuelle Nutzung des MqttPublisher
58+
===== Beispiel: Manuelle Nutzung des MqttPublisher
6159

6260
[source,python]
6361
----
6462
include::../../tests/test_mqtt.py[lines=112..116]
6563
----
6664

67-
=== Command Interface
65+
==== Command Interface
6866

6967
PySignalduino stellt eine umfangreiche Befehls-API zur Steuerung des SIGNALDuino-Firmware-Geräts bereit. Die Klasse `SignalduinoCommands` kapselt alle verfügbaren seriellen Befehle und bietet eine asynchrone Schnittstelle.
7068

71-
==== Verfügbare Befehle
69+
===== Verfügbare Befehle
7270

7371
Die folgenden Befehle werden unterstützt (Auswahl):
7472

@@ -105,13 +103,13 @@ Die folgenden Befehle werden unterstützt (Auswahl):
105103
* `send_xfsk(params)` – xFSK senden (SN...)
106104
* `send_message(message)` – Vorkodierte Nachricht senden
107105

108-
==== Persistenz-Funktionalität
106+
===== Persistenz-Funktionalität
109107

110108
Befehle, die die Hardware-Konfiguration ändern (z.
111109
B. `write_register`, `set_patable`), werden in der Regel im EEPROM des SIGNALDuino persistent gespeichert.
112110
Die Persistenz wird durch die Firmware gewährleistet; PySignalduino sendet lediglich die entsprechenden Kommandos.
113111

114-
==== Nutzung über MQTT
112+
===== Nutzung über MQTT
115113

116114
Wenn MQTT aktiviert ist, können Befehle über das Topic `{base_topic}/commands/{command}` gesendet werden. Die Basis für Antworten ist `{base_topic}/responses` (Erfolg) oder `{base_topic}/errors` (Fehler). Das `base_topic` ist standardmäßig `signalduino/v1`.
117115

@@ -186,27 +184,25 @@ mosquitto_pub -h localhost -t "signalduino/v1/commands/get/system/version" -m '{
186184
# Antwort empfängst du auf signalduino/v1/responses
187185
----
188186

189-
==== Code-Beispiel: Direkte Nutzung der Command-API
190-
191-
==== Code-Beispiel: Direkte Nutzung der Command-API
187+
===== Code-Beispiel: Direkte Nutzung der Command-API
192188

193189
[source,python]
194190
----
195191
include::../../tests/test_controller.py[lines=120..130]
196192
----
197193

198-
==== Beispiel: Asynchrone Context-Manager Nutzung
194+
===== Beispiel: Asynchrone Context-Manager Nutzung
199195

200196
[source,python]
201197
----
202198
include::../../main.py[lines=55..84]
203199
----
204200

205-
== API-Referenz (Auszug)
201+
=== API-Referenz (Auszug)
206202

207203
Die folgenden Klassen und Schnittstellen sind für die Integration besonders relevant:
208204

209-
=== MqttPublisher
205+
==== MqttPublisher
210206

211207
Die Klasse `signalduino.mqtt.MqttPublisher` bietet eine asynchrone Context-Manager-Schnittstelle zur Kommunikation mit einem MQTT-Broker.
212208

@@ -218,15 +214,15 @@ Die Klasse `signalduino.mqtt.MqttPublisher` bietet eine asynchrone Context-Manag
218214

219215
* **Context-Manager:** `async with MqttPublisher() as publisher:`
220216

221-
=== SignalduinoCommands
217+
==== SignalduinoCommands
222218

223219
Die Klasse `signalduino.commands.SignalduinoCommands` kapselt alle seriellen Befehle für die SIGNALDuino-Firmware.
224220

225221
* **Initialisierung:** Erfordert eine asynchrone Sendefunktion (wird normalerweise vom `SignalduinoController` bereitgestellt)
226222
* **Alle Methoden sind asynchron** (`async def`) und geben entweder `str` (Antwort) zurück oder `None` (keine Antwort erwartet)
227223
* **Umfang:** Systembefehle, Konfiguration, Senden von Nachrichten (siehe Abschnitt „Command Interface“)
228224

229-
=== Asynchrone Context-Manager-Schnittstelle
225+
==== Asynchrone Context-Manager-Schnittstelle
230226

231227
Sowohl `SignalduinoController` als auch `MqttPublisher` und die Transportklassen (`TcpTransport`, `SerialTransport`) implementieren das asynchrone Context-Manager-Protokoll (`__aenter__`/`__aexit__`). Dies gewährleistet eine sichere Ressourcenverwaltung (Verbindungsauf‑/abbau, Hintergrundtasks).
232228

@@ -237,37 +233,37 @@ Beispiel für verschachtelte Context-Manager:
237233
include::../../main.py[lines=55..84]
238234
----
239235

240-
=== Weitere Klassen
236+
==== Weitere Klassen
241237

242238
* `SignalduinoController` – Zentrale Steuerungsklasse, koordiniert Transport, Parser, MQTT und Befehle
243239
* `TcpTransport`, `SerialTransport` – Asynchrone Transportimplementierungen für TCP bzw. serielle Verbindungen
244240
* `DecodedMessage`, `RawFrame` – Datentypen für dekodierte Nachrichten und Rohframes
245241

246242
Eine vollständige API-Dokumentation kann mit `pydoc` oder mittels Sphinx generiert werden.
247243

248-
== Troubleshooting
244+
=== Troubleshooting
249245

250246
Dieser Abschnitt beschreibt häufige Probleme und deren Lösungen.
251247

252-
=== MQTT-Verbindungsprobleme
248+
==== MQTT-Verbindungsprobleme
253249

254250
* **Keine Verbindung zum Broker:** Stellen Sie sicher, dass die Umgebungsvariablen `MQTT_HOST` und `MQTT_PORT` korrekt gesetzt sind. Der Broker muss erreichbar sein und keine Authentifizierung erfordern (oder Benutzername/Passwort müssen gesetzt sein).
255251
* **Verbindung bricht ab:** Überprüfen Sie die Netzwerkverbindung und Broker-Konfiguration. Der MQTT-Client (`aiomqtt`) versucht automatisch, die Verbindung wiederherzustellen. Falls die Verbindung dauerhaft abbricht, prüfen Sie Firewall-Einstellungen und Broker-Logs.
256252
* **MQTT-Nachrichten werden nicht empfangen:** Stellen Sie sicher, dass das Topic `{topic}/commands/#` abonniert ist. Der Command-Listener startet automatisch, wenn MQTT aktiviert ist. Überprüfen Sie die Log-Ausgabe auf Fehler.
257253

258-
=== Asyncio-spezifische Probleme
254+
==== Asyncio-spezifische Probleme
259255

260256
* **`RuntimeError: no running event loop`:** Tritt auf, wenn asyncio-Funktionen außerhalb eines laufenden Event-Loops aufgerufen werden. Stellen Sie sicher, dass Ihr Code innerhalb einer asyncio-Coroutine läuft und `asyncio.run()` verwendet wird. Verwenden Sie `async with` für Context-Manager.
261257
* **Tasks hängen oder werden nicht abgebrochen:** Alle Hintergrundtasks sollten auf das `_stop_event` reagieren. Bei manuell erstellten Tasks müssen Sie `asyncio.CancelledError` abfangen und Ressourcen freigeben.
262258
* **Deadlocks in Queues:** Wenn eine Queue voll ist und kein Consumer mehr liest, kann `await queue.put()` blockieren. Stellen Sie sicher, dass die Consumer-Tasks laufen und die Queue nicht überfüllt wird. Verwenden Sie `asyncio.wait_for` mit Timeout.
263259

264-
=== Verbindungsprobleme zum SIGNALDuino-Gerät
260+
==== Verbindungsprobleme zum SIGNALDuino-Gerät
265261

266262
* **Keine Antwort auf Befehle:** Überprüfen Sie die serielle oder TCP-Verbindung. Stellen Sie sicher, dass das Gerät eingeschaltet ist und die korrekte Baudrate (115200) verwendet wird. Testen Sie mit einem Terminal-Programm, ob das Gerät auf `V` (Version) antwortet.
267263
* **Timeout-Errors:** Die Standard-Timeout für Befehle beträgt 2 Sekunden. Bei langsamen Verbindungen kann dies erhöht werden. Falls Timeouts trotzdem auftreten, könnte die Verbindung instabil sein.
268264
* **Parser erkennt keine Protokolle:** Überprüfen Sie, ob die Rohdaten im erwarteten Format ankommen (z.B. `+MU;...`). Stellen Sie sicher, dass die Protokolldefinitionen (`protocols.json`) geladen werden und das Protokoll aktiviert ist.
269265

270-
=== Logging und Debugging
266+
==== Logging und Debugging
271267

272268
Aktivieren Sie Debug-Logging, um detaillierte Informationen zu erhalten:
273269

@@ -278,12 +274,12 @@ include::../../main.py[lines=21..30]
278274

279275
Die Log-Ausgabe zeigt den Status von Transport, Parser und MQTT.
280276

281-
=== Bekannte Probleme und Workarounds
277+
==== Bekannte Probleme und Workarounds
282278

283279
* **Entwicklungsstatus**: Da PySignalduino noch in aktiver Entwicklung ist, können sich Verhalten und API zwischen Commits ändern. Bei unerwartetem Verhalten prüfen Sie bitte die aktuelle Codebasis und melden Sie Issues auf GitHub.
284280

285281
* **`aiomqtt`-Versionen:** Verwenden Sie `aiomqtt>=2.0.0`. Ältere Versionen können Inkompatibilitäten aufweisen.
286282
* **Windows und asyncio:** Unter Windows kann es bei seriellen Verbindungen zu Problemen mit asyncio kommen. Verwenden Sie `asyncio.ProactorEventLoop` oder weichen Sie auf TCP-Transport aus.
287283
* **Memory Leaks:** Bei langem Betrieb können asyncio-Tasks Speicher verbrauchen. Stellen Sie sicher, dass abgeschlossene Tasks garbage-collected werden. Verwenden Sie `asyncio.create_task` mit Referenzen, um Tasks später abbrechen zu können.
288284

289-
Bei weiteren Problemen öffnen Sie bitte ein Issue auf GitHub mit den relevanten Logs und Konfigurationsdetails.
285+
Bei weiteren Problemen öffnen Sie bitte ein Issue auf GitHub mit den relevanten Logs und Konfigurationsdetails.

docs/02_developer_guide/architecture.adoc

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
= Architektur
2-
31
== Übersicht
42

53
PySignalduino ist modular aufgebaut und trennt die Protokolldefinitionen (JSON) strikt von der Verarbeitungslogik (Python).

docs/02_developer_guide/contribution.adoc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
= Beitrag leisten (Contributing)
21

32
[NOTE]
43
====

docs/03_protocol_reference/protocol_details.adoc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
= Protokolldetails
21

32
PySignalduino unterstützt eine Vielzahl von Funkprotokollen im 433 MHz und 868 MHz Bereich.
43

docs/architecture/decisions/ADR-001-mqtt-get-frequency.adoc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
Angenommen.
88

9-
[[context]]
9+
[#adr-context]
1010
== Kontext
1111

1212
Das PySignalduino-Projekt benötigt eine Methode, um die aktuell im CC1101-Transceiver eingestellte Funkfrequenz über das MQTT-Interface abzufragen, hauptsächlich für Diagnose- und Statuszwecke.
@@ -19,7 +19,7 @@ $$f_{RF} = \frac{F_{XOSC}}{2^{16}} \times F_{REG}$$
1919
Bei $F_{XOSC} = 26 \, \text{MHz}$ ergibt sich:
2020
$$f_{RF} = \frac{26}{65536} \times F_{REG} \, \text{MHz}$$
2121

22-
[[decision]]
22+
[#adr-decision]
2323
== Entscheidung
2424

2525
Wir implementieren den `get/frequency` Befehl als Teil der `MqttHandler`- und `Commands`-Klassen.
@@ -31,15 +31,15 @@ Wir implementieren den `get/frequency` Befehl als Teil der `MqttHandler`- und `C
3131
* Wir implementieren die Berechnung in `signalduino/commands.py` (z.B. `get_frequency()`), um die Abhängigkeit der Hardware vom Command Layer zu kapseln.
3232
* Das Ergebnis wird auf 4 Dezimalstellen gerundet (in MHz), um eine hohe Genauigkeit bei der Anzeige zu gewährleisten.
3333

34-
[[consequences]]
34+
[#adr-consequences]
3535
== Konsequenzen
3636

3737
* *Positiv*: Benutzer können die eingestellte Frequenz einfach über MQTT abfragen, was die Diagnose erleichtert.
3838
* *Positiv*: Die Verwendung der offiziellen CC1101-Formel und der 26 MHz Oszillatorfrequenz gewährleistet Korrektheit und Konsistenz.
3939
* *Negativ*: Es müssen neue Methoden in `signalduino/hardware.py`, `signalduino/commands.py` und `signalduino/mqtt.py` implementiert werden.
4040
* *Negativ*: Die Hardware-Klasse muss um die Logik zum Lesen der drei Register erweitert werden, möglicherweise durch eine neue Abstraktionsebene, falls dies in Zukunft für andere Dreifachregister notwendig wird.
4141

42-
[[alternatives]]
42+
[#adr-alternatives]
4343
== Alternativen
4444

4545
* *Alternative 1: Berechnung auf der Hardware-Ebene:*

0 commit comments

Comments
 (0)