You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: .github/workflows/docs.yml
+4-1Lines changed: 4 additions & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -31,7 +31,10 @@ jobs:
31
31
- name: run asciidoctor with Kroki extension
32
32
# Registriere die Kroki-Extension (-r asciidoctor-kroki) und aktiviere sie (-a kroki=).
33
33
# 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
Copy file name to clipboardExpand all lines: docs/01_user_guide/mqtt_api.adoc
+8-17Lines changed: 8 additions & 17 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff 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
3
5
:sectnums:
4
6
5
7
[[_mqtt_introduction]]
6
-
==Einführung
8
+
= Einführung
7
9
8
10
Die MQTT-Schnittstelle ermöglicht die Steuerung des PySignalduino-Gateways und den Empfang von dekodierten Nachrichten. Alle Befehle und Antworten verwenden das JSON-Format.
9
11
10
-
=== Topics und Struktur
12
+
== Topics und Struktur
11
13
12
14
Der **Standard-Topic** für alle MQTT-Operationen ist `signalduino/v1`.
13
15
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/
316
318
[source,fhem]
317
319
----
318
320
# 1. Verbindung zum Broker herstellen (falls noch nicht vorhanden)
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.
15
13
16
-
=== Logging
14
+
==== Logging
17
15
18
16
Für Debugging-Zwecke können Sie eine eigene Callback-Funktion registrieren:
19
17
@@ -22,11 +20,11 @@ Für Debugging-Zwecke können Sie eine eigene Callback-Funktion registrieren:
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.
28
26
29
-
==== Einrichtung und Konfiguration
27
+
===== Einrichtung und Konfiguration
30
28
31
29
Die MQTT-Verbindung wird automatisch initialisiert, wenn die Umgebungsvariable `MQTT_HOST` gesetzt ist. Folgende Umgebungsvariablen können konfiguriert werden:
32
30
@@ -44,31 +42,31 @@ Der `MqttPublisher` wird innerhalb des `SignalduinoController` verwendet und ste
* `{topic}/commands/#` – Topic für eingehende Befehle (Wildcard-Subscription)
51
49
* `{topic}/responses` – Antworten auf GET-Befehle, inkl. `get/cc1101/frequency`.
52
50
* `{topic}/errors` – Fehlerantworten.
53
51
* `{topic}/status` – Heartbeat‑ und Statusmeldungen (optional)
54
52
55
-
==== Heartbeat-Funktionalität
53
+
===== Heartbeat-Funktionalität
56
54
57
55
Der Publisher sendet regelmäßig einen Heartbeat („online“) unter `{topic}/status`, solange die Verbindung besteht.
58
56
Bei Verbindungsabbruch wird „offline“ gepublished.
59
57
60
-
==== Beispiel: Manuelle Nutzung des MqttPublisher
58
+
===== Beispiel: Manuelle Nutzung des MqttPublisher
61
59
62
60
[source,python]
63
61
----
64
62
include::../../tests/test_mqtt.py[lines=112..116]
65
63
----
66
64
67
-
=== Command Interface
65
+
==== Command Interface
68
66
69
67
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.
70
68
71
-
==== Verfügbare Befehle
69
+
===== Verfügbare Befehle
72
70
73
71
Die folgenden Befehle werden unterstützt (Auswahl):
74
72
@@ -105,13 +103,13 @@ Die folgenden Befehle werden unterstützt (Auswahl):
Befehle, die die Hardware-Konfiguration ändern (z.
111
109
B. `write_register`, `set_patable`), werden in der Regel im EEPROM des SIGNALDuino persistent gespeichert.
112
110
Die Persistenz wird durch die Firmware gewährleistet; PySignalduino sendet lediglich die entsprechenden Kommandos.
113
111
114
-
==== Nutzung über MQTT
112
+
===== Nutzung über MQTT
115
113
116
114
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`.
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).
232
228
@@ -237,37 +233,37 @@ Beispiel für verschachtelte Context-Manager:
* `TcpTransport`, `SerialTransport` – Asynchrone Transportimplementierungen für TCP bzw. serielle Verbindungen
244
240
* `DecodedMessage`, `RawFrame` – Datentypen für dekodierte Nachrichten und Rohframes
245
241
246
242
Eine vollständige API-Dokumentation kann mit `pydoc` oder mittels Sphinx generiert werden.
247
243
248
-
== Troubleshooting
244
+
=== Troubleshooting
249
245
250
246
Dieser Abschnitt beschreibt häufige Probleme und deren Lösungen.
251
247
252
-
=== MQTT-Verbindungsprobleme
248
+
==== MQTT-Verbindungsprobleme
253
249
254
250
* **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).
255
251
* **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.
256
252
* **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.
257
253
258
-
=== Asyncio-spezifische Probleme
254
+
==== Asyncio-spezifische Probleme
259
255
260
256
* **`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.
261
257
* **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.
262
258
* **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.
263
259
264
-
=== Verbindungsprobleme zum SIGNALDuino-Gerät
260
+
==== Verbindungsprobleme zum SIGNALDuino-Gerät
265
261
266
262
* **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.
267
263
* **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.
268
264
* **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.
269
265
270
-
=== Logging und Debugging
266
+
==== Logging und Debugging
271
267
272
268
Aktivieren Sie Debug-Logging, um detaillierte Informationen zu erhalten:
Die Log-Ausgabe zeigt den Status von Transport, Parser und MQTT.
280
276
281
-
=== Bekannte Probleme und Workarounds
277
+
==== Bekannte Probleme und Workarounds
282
278
283
279
* **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.
284
280
285
281
* **`aiomqtt`-Versionen:** Verwenden Sie `aiomqtt>=2.0.0`. Ältere Versionen können Inkompatibilitäten aufweisen.
286
282
* **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.
287
283
* **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.
288
284
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.
Copy file name to clipboardExpand all lines: docs/architecture/decisions/ADR-001-mqtt-get-frequency.adoc
+4-4Lines changed: 4 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,7 +6,7 @@
6
6
7
7
Angenommen.
8
8
9
-
[[context]]
9
+
[#adr-context]
10
10
== Kontext
11
11
12
12
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.
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
31
31
* Wir implementieren die Berechnung in `signalduino/commands.py` (z.B. `get_frequency()`), um die Abhängigkeit der Hardware vom Command Layer zu kapseln.
32
32
* Das Ergebnis wird auf 4 Dezimalstellen gerundet (in MHz), um eine hohe Genauigkeit bei der Anzeige zu gewährleisten.
33
33
34
-
[[consequences]]
34
+
[#adr-consequences]
35
35
== Konsequenzen
36
36
37
37
* *Positiv*: Benutzer können die eingestellte Frequenz einfach über MQTT abfragen, was die Diagnose erleichtert.
38
38
* *Positiv*: Die Verwendung der offiziellen CC1101-Formel und der 26 MHz Oszillatorfrequenz gewährleistet Korrektheit und Konsistenz.
39
39
* *Negativ*: Es müssen neue Methoden in `signalduino/hardware.py`, `signalduino/commands.py` und `signalduino/mqtt.py` implementiert werden.
40
40
* *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.
41
41
42
-
[[alternatives]]
42
+
[#adr-alternatives]
43
43
== Alternativen
44
44
45
45
* *Alternative 1: Berechnung auf der Hardware-Ebene:*
0 commit comments