Installation

Damit die Installation reibungslos funktioniert habe ich hier eine kleine Anleitung erstellt.

Dieses Projekt umfasst zwei NodeJS-Projekte: Den Skillmanager (Client) und einen Skillserver.
Der Skillserver ist dabei rein optional.
Er stellt eine Möglichkeit dar, Skills zu installieren.
Ich selbst hoste eine öffentlich zugängliche Instanz des Servers hier.

Beide Applikationen können auf demselben Host installiert werden wie Rhasspy, müssen es jedoch nicht.
Lediglich der Client benötigt sowohl eine HTTP- als auch eine MQTT-Verbindung zur Rhasspy-Instanz.
Außerdem muss im Rhasspy-Profil der Punkt Intent Handling deaktiviert sein.

Client

Da das Projekt darauf ausgelegt war, dass das Skillsystem auf einem Raspberry Pi läuft, beschreibe ich hier die Installation auf eben diesem.

Installation mit einem vorkonfigurierten Image

Für eine einfache und schnelle Installation habe ich eine vorkonfigurierte Image-Datei erstellt, die auf einem Raspberry Pi mit einem ReSpeaker 4-Mic Array von Seeed Studio installiert werden kann.
Diese Datei kann hier heruntergeladen werden.
Um sie zu installieren braucht man jedoch ein Programm, welches Disk-Images auf eine SD-Karte schreiben kann.
Ich nutze dazu den Win32 Disk Imager.
Nachdem die installation abgeschlossen ist, muss man die SD-Karte über den Windows Explorer aufrufen und eine Datei mit dem Namen wpa_supplicant.config erstellen, welche folgende Informationen enthält:

country=DE
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="<SSID>"
psk="<PASSWORD>"
key_mgmt=WPA-PSK
}

<SSID> und <PASSWORD> sollten dabei durch die gewünschten WiFi-Logindaten ersetzt werden.

Nach der Installation und dem Start des Raspberry Pi sollten folgende Dienste zur verfügung stehen:

  • Port 1880: Node-Red, eine grafische Programmieroberfläche zum schnellen Testen einiger Funktionen.
  • Port 1883: Eclipse Mosquitto, ein MQTT-Broker, über den einzelne Dienste miteinander Kommunizieren.
  • Port 12100: Zigbee2MQTT, ein Smarthome-Dienst, mittels welchem Zigbee-Geräte per MQTT angesprochen werden können.
  • Port 12101: Rhasspy, der Sprachassistent, der alle Befehle erkennt und diese an mein Skillsystem übergibt.
  • Port 12102: Mein Skillsystem, das alle ankommenden Befehle verarbeitet und die einzelnen Skills verwaltet.

Neuinstallation auf Basis von Raspberry Pi OS

Zunächst braucht man eine SD-Karte mit dem Raspberry Pi OS.
Dazu installiert man sich den Raspberry Pi Imager und beschreibt die Karte mit einer geeigneten Version des OS (in meinem Fall Raspberry Pi OS Lite (32-Bit)).
Im Raspberry Pi Imager kann man noch verschiedene Einstellungen konfigurieren.
Wichtig dabei ist, dass der Standard-User pi bleibt.

Voraussetzung für die unten genannten Schritte sind eine Rhasspy-Instanz und ein MQTT-Broker (in meinem Fall ein Mosquitto-Broker). Zudem müssen die Laufzeit-Umgebung NodeJS (in meinem Fall version “v17.0.0”) und Git installiert sein.

Sind all diese Dinge installiert und Rhasspy und der MQTT-Broker sind unter den Ports 12101 bzw 1883 erreichbar, kann die eigentliche Installation des Skillmanagers beginnen.
Dazu Verbindet man sich mit dem Raspberry Pi via ssh (zum Beispiel via Windows Powershell).

Der Ausgangspunkt sollte /home/pi sein.
Von hieraus läd man sich das GitHub-Repository herunter und installiert die benötigten npm-Packages.

git clone https://github.com/fwehn/pp-voiceassistant.git
cd ./pp-voiceassistant/src/sdk
sudo npm install
cd ../client
sudo npm install

Im Verzeichnis /home/pi/pp-voiceassistant/src/client benötigt der Skillmanager noch zwei Verzeichnisse mit den Namen configs und skills.
In configs wird noch die Datei skillConfigs.json mit einem leeren Objekt ({}) angelegt und dem root-User volle berechtigung auf diese Datei gewährt.
Diese Berechtigung ist wichtig, damit der Skillmanager die Datei verändern kann.

sudo mkdir configs
sudo sh -c "echo '{}' >> /home/pi/pp-voiceassistant/src/client/configs/skillConfigs.json"
sudo chmod 777 ./configs/skillConfigs.json
sudo mkdir skills

Um den Skillmanager zu starten, muss man im Verzeichnis /home/pi/pp-voiceassistant/src/client den Befehl npm run start eingeben.
Danach sollte das Webinterface unter dem Port 12102 erreichbar sein.

Damit man den Skillmanager nicht immer manuell starten muss, habe ich einen systemd-Service erstellt.
Um diesen im Raspberry Pi zu registrieren, muss zunächst die Datei skillmanager.service in das Verzeichnis /lib/systemd/system/ kopiert und der Service aktiviert werden.
Danach sollte das System einmal neu gestartet und der Skillmanager wieder unter dem Port 12102 erreichbar sein.

sudo cp /home/pi/pp-voiceassistant/src/client/skillmanager.service /lib/systemd/system/skillmanager.service
sudo systemctl daemon-reload
sudo systemctl enable /lib/systemd/system/skillmanager.service
sudo reboot

Env-Variablen

Damit man den Client in der eigenen individuellen Umgebung nutzen kann, habe ich einige Umgebungsvariablen definiert:

  • SERVER: Adresse des Skillservers (default: https://skillserver.fwehn.de)
  • RHASSPY: Adresse der Rhasspy-Instanz (default: http://127.0.0.1:12101)
  • PORT: Port, über den das Webinterface erreichbar sein soll (default: 12102)
  • MQTTHOST: Adresse des MQTT-Brokers (default: 127.0.0.1)
  • MQTTPORT: Port, über den der MQTT-Broker erreichbar ist (default: 1883)
  • LOCALE: Sprache, auf der der Client arbeiten soll (default: de_DE)
  • ZIGBEETOPIC: Das Base-Topic von Zigbee2MQTT (default: zigbee2mqtt)

Diese lassen sich am besten in der skillmanager.service-Datei bearbeiten.
Dazu kann man den Befehl sudo nano /lib/systemd/system/skillmanager.service ausführen.

Nachdem man die Variablen auf die eigene Umgebung angepasst hat, kann man mit Strg+O die Datei speichern und mit Strg+X den Editor verlassen.
Danach sollten die Services einmal neu geladen und der Host neu gestartet werden.

sudo systemctl daemon-reload
sudo reboot

Server (Optional)

Beim Server handelt es sich um einen einfachen Dateiserver für die Skills.
Darüber kann der Client dann die einzelnen Skills installieren.

Ich selbst Hoste eine Instanz unter diesem Link, daher ist eine Installation rein optional.

Die Installation des Skillservers ist etwas einfacher, als die des Skillmanagers.
Dazu benötigt man lediglich die Dateien im Verzeichnis “src/server”.
In diesem Verzeichnis muss man dann nur noch den Befehl npm run start ausführen.

Env-Variablen

Für den Server gibt es lediglich eine Umgebungsvariable.

PORT: Port auf den der Express-Server “hört” (default: 3000)