Nachdem die Steuerung einer Nebenuhr per Shelly Plus 2 und einem Skript zur Zufriedenheit läuft, jedenfalls im vollautomatischen Betrieb, habe ich eine Audio Erweiterung implementiert. Diese Erweiterung besteht aus einem Skript für den Shelly, einem Raspberry Pi der ersten Generation mit angeschlossenem aktiven Lautsprecher und darauf arbeitendem Node-RED Flow.

Es stellt sich heraus, dass ein alter Raspberry Pi sehr gut für die Ausgabe der gewünschten Uhrklänge nutzbar ist und voraussichtlich parallel als Internet-Radio oder/und zum abspielen von lokal gespeicherten Audiodateien eingesetzt werden kann.

2023-05-02

Zum Shelly Plus 2

Die Funktionalität des Audio Skripts "audio" besteht im wesentlichen aus einer Funktion "audio", die einen Parameter im JSON Format, also ein Objekt, importiert. Diese Funktion verarbeitet den Status des ersten Skripts "clock", welches für die Uhranzeige zuständig ist und das importierte Parameter Objekt. An Hand aller dieser Informationen sendet sie eine Nachricht an den Audio-Computer, hier ein alter Rasüpberry Pi. Diese Nachricht beinhaltet

  • das gewünschte Klangthema,
  • die aktuelle Uhrzeit in Stunden und Minuten,
  • die Anzahl an Klängen zur Uhrzeit passend und
  • eine Textnachricht, welche die Uhrzeit in Prosa wiedergibt.
    Dies erlaubt bei Bedarf auch eine Sprachausgabe per text-to-speech auf einem Client.

Die Funktion "audio" wird von Schedule Jobs aufgerufen, welche auf relativ flexible Weise zusammengesetzt werden können. Vorgesehen sind hierfür zwei Jobs, einer für die Klänge zu vollen Stunden und ein zweiter für die Klänge zu jeder weiteren Viertelstunde. Selbstverständlich sind beide optional. Diese beiden Schedule Jobs können leicht mit meiner dazu erstellten Webseite https://tools.eichelsdoerfer.net/audio_config.html angelegt oder auch bei Bedarf entfernt werden. Statt der Viertelstunden Klangwiedergaben können auch andere Zeitabschnitte eingestellt werden. Wer lieber alle 20 Minuten einen Klang hören möchte, wählt als Wert zur Minutenperiode den Wert 20. Die Klangwiedergabe zur vollen Stunde ist dominant, d.h. die zwischenzeitlichen Klangwiedergaben werden zu vollen Stunden (Minutenwert=0) nicht initiiert.

Zum Raspberry Pi

Dieser ist hier der Audio-Computer. Auf ihm müssen die zum Klangthema gehörenden Audiodateien und eine zusätzliche Schema-Datei abgelelegt werden. Zur Verarbeitung aller Daten verwendet meine Implementation eine Node-RED Installation mit einem Flow. Dieser Flow arbeitet bereits wie gewünscht. Allerdings ist die Klangausgabe bisher nicht zu jedem Klangthema hinreichend zufriedenstellend. Deshalb experimentiere ich weiter. Gelöst

Der aktuelle Stand meiner Experimente verwendet den MPD (Dienst zur Audiowiedergabe) und den Kommandozeilen-Client MPC zur Steuerung des MPD. Per Node-RED wird der MPC mit Kommandos aufgerufen, welche die aktuelle Klangwiedergabe zusammensetzen und deren Abspielen per MPD starten. Dies gelingt bisher überzeugend und wird voraussichtlich als beste Lösung eingestuft.

Nebenbei lässt der MPD auch die Nutzung des Raspbery Pi als Internet Radio zu. Allerdings kenne ich noch keine Möglichkeit, beide Audio-Ausgaben parallel zu nutzen. Vielleicht wird mir noch etwas dazu einfallen. Es gibt MPC Kommandos, mit Hilfe derer die Queue (interne Playlist) gespeichert, gelöscht und geladen werden kann. Auch die zeitliche Position eines aktuell abgespielten Stückes ist erfassbar und kann nach Manual wieder angesteuert werden. Auf diese Weise sollte es möglich sein, die Ausgabe für die Uhrklangwiedergabe temporär zu unterbrechen und nach den Uhrklängen wieder aufzunehmen.

2023-05-01 14:00:
Das temporäre Pausieren des Internet-Radios zur Uhr-Klangausgabe funktioniert bereits. Nach der Klangausgabe wird eine ggf. laufende Radiosendung fortgesetzt. An der sekundengenauen Fortsetzung beim abspielen einer sonstigen Audio-Playlist werde ich noch feilen.

Zusammenstellen eines Klangschemas

Für eine flexible Zusammenstellung eines gewünschten Klangschemas ist eine kleine Beschreibungsdatei im JSON Format erforderlich. Diese beschreibt im Zusammenwirken mit den vom Shelly gesendeten Daten, welche Klänge in welcher Zusammensetzng für das Klangthema zu verwenden sind. So besteht ein Westminster Abbey Klangthema aus einem Vorgeläute, dem die zur Uhrzeit passende Anzahl an Glockenschlägen folgt, wobei der letzte Glockenschlag deutlich länger ausklingt als die vorherigen. Mit dem Klangschema ist eine solche Folge leicht realisierbar. Ein solches Klangschema bietet einige kreative Möglichkeiten, ein Klangthema zusammenzusetzen.

Beispiel eines Klangschemas zum "Westminster"-Thema:

[
    {"o":170, "f":"Westminster.pre2.mp3", "n":1},
    {"o":41,  "f":"Westminster.gong.mp3", "d":-1},
    {"o":130, "f":"Westminster.last.mp3", "n":1}
]

Es beschreibt

  1. die wiederzugebenden Audiodateien ("f" Wert),
  2. deren Reihenfolge (in deren Aufzählung),
  3. deren jeweilige Dauer in 1/10 Sekunden ("o" Wert),
    (Diese wird für Ausgaben in einem Client-Browser und einem temporären Pausieren einer ggf. laufenden Radiowiedergabe verwendet.)
  4. die Häufigkeit des Abspielens ("n" Wert),
    (Fehlt der "n" Wert, wird die vom Shelly gelieferte Anzahl hierfür eingesetzt.)
  5. eine Abweichung (als Summand) zum "n" Wert ("d" Wert).

Empfängt der Node-RED Flow vom Shelly u.a. die Anzahl n=7 zur Uhrzeit 7 Uhr bzw. 19 Uhr passend, so werden folgende Klangdateien wiedergegeben.

1 mal "Westminster.pre2.mp3"
6 mal "Westminster.gong.mp3" - n + d = 7 +(-1) = 6
1 mal "Westminster.last.mp3" - das ist der letzte, ausklingende Glockenschlag

Erfahrungen mit der Implementation

Die ersten Versuche per Node-RED Flow führten mich zu verschiedenen Audio Play Knoten, welche mitunter nachzuinstallieren sind.

Der "ui audio out"  Knoten lässt die Klänge ausschließlich per Webseite auf einem anderen Computer ausgeben, was sehr gut gelingt, aber nicht ständig verfügbar ist. Ein Knoten "node-red-contrib-play-sound" zur lokalen Ausgabe über einen am Audio-Computer angeschlossenen Lautsprecher liefert insbesondere beim Kuckuck-Klangthema keine akzeptablen Ausgaben und wirkt bei jedem Klangthema stark verzögert.

Die Ausgabe per MPD ist für die lokale Klangausgabe bisher sehr überzeugend. Allerdings zeigte sich, dass ein Kuckuckruf vom MPD halb ausgegeben und zwei hintereinander liegende nur als ein Ruf hörbar sind. Versuche hierzu zeigten, dass bei n Kuckuckrufen in der MPD Queue (interne Playlist) n-1 dieser Rufe hörbar sind - manchmal ein halber dahinter. Dieses Wiedergabeproblem konnte ich durch Anfügen einer 1s dauernden, stillen mp3 Datei beheben. Praxis ist, wenn's funktioniert und niemand weiß wieso. wink

(Fortsetzung folgt)