RHASSPY: Unterschied zwischen den Versionen
Drhirn (Diskussion | Beiträge) K (→Intents) |
(engl. commandref teilw. übersetzt) |
||
Zeile 7: | Zeile 7: | ||
|ModFTopic=119447 | |ModFTopic=119447 | ||
|ModTechName=10_RHASSPY.pm | |ModTechName=10_RHASSPY.pm | ||
|ModOwner= | |ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]]), drhirn ({{Link2FU|15727|Forum}}/[[Benutzer Diskussion:Drhirn|Wiki]]) | ||
}} | }} | ||
[https://github.com/rhasspy/rhasspy Rhasspy] ist eine Open Source-Lösung für Spracherkennung und Sprachsteuerung. Es handelt sich dabei um eine Sammlung von Scripten, die unter einer einheitlichen Bedienoberfläche zusammengefasst sind, die sehr flexibel genutzt und erweitert werden kann. Die Besonderheit an Rhasspy ist, dass es nach der Installation komplett offline betrieben wird. Es werden also keine Daten an einen Server im Internet geschickt, und für den Betrieb nur für FHEM werden nur moderate Hardwareanforderungen gestellt - ein aktueller Raspberry Pi ab Modell 3B+ sollte in der Regel genügen. | [https://github.com/rhasspy/rhasspy Rhasspy] ist eine Open Source-Lösung für Spracherkennung und Sprachsteuerung. Es handelt sich dabei um eine Sammlung von Scripten, die unter einer einheitlichen Bedienoberfläche zusammengefasst sind, die sehr flexibel genutzt und erweitert werden kann. Die Besonderheit an Rhasspy ist, dass es nach der Installation komplett offline betrieben wird. Es werden also keine Daten an einen Server im Internet geschickt, und für den Betrieb nur für FHEM werden nur moderate Hardwareanforderungen gestellt - ein aktueller Raspberry Pi ab Modell 3B+ sollte in der Regel genügen. | ||
Die Anbindung weiterer Räume ist über sogenannte "Satelliten" möglich. Dies kann z.B. ein Pi Zero mit Mikro und Lautsprecher sein, ein ESP32 mit entsprechender Hardware oder ein Mobiltelefon mit Android und der entsprechenden App. | Die Anbindung weiterer Räume ist über sogenannte "Satelliten" möglich. Dies kann z.B. ein Pi Zero mit Mikro und Lautsprecher sein, ein ESP32 mit entsprechender Hardware oder ein Mobiltelefon mit Android und der entsprechenden App. | ||
Rhasspy besteht aus vielen unterschiedlichen Modulen (Hot-Word Erkennung, Text-to-Speech, Speech-to-Text, Intent Erkennung, etc.). Alle diese Module kommunizieren miteinander über das [[MQTT|MQTT]]-Protokoll. | Rhasspy besteht aus vielen unterschiedlichen Modulen (Hot-Word Erkennung, Text-to-Speech, Speech-to-Text, Intent Erkennung, etc.). Alle diese Module kommunizieren miteinander über das [[MQTT|MQTT]]-Protokoll. | ||
Zeile 26: | Zeile 28: | ||
{{Hinweis|Dialoge werden in RHASSPY verwaltet wie [https://rhasspy.readthedocs.io/en/latest/reference/#dialogue-manager hier] beschrieben. Dialoge werden also nicht funktionieren, sobald für das Dialogue-Management etwas anderes als ''RHASSPY'' eingestellt ist}} | {{Hinweis|Dialoge werden in RHASSPY verwaltet wie [https://rhasspy.readthedocs.io/en/latest/reference/#dialogue-manager hier] beschrieben. Dialoge werden also nicht funktionieren, sobald für das Dialogue-Management etwas anderes als ''RHASSPY'' eingestellt ist}} | ||
== Erste Schritte == | == Erste Schritte == | ||
Für Einsteiger in das Thema Rhasspy bzw. RHASSPY gibt es eine Schnellstart-Anleitung, welche die ersten grundlegenden Schritte einfach erklärt: [[RHASSPY/Schnellstart]] | Für Einsteiger in das Thema Rhasspy bzw. RHASSPY gibt es eine Schnellstart-Anleitung, welche die ersten grundlegenden Schritte einfach erklärt: [[RHASSPY/Schnellstart]] | ||
Es ist auf jeden Fall empfehlenswert, die Schnellstart-Anleitung zuerst durchzulesen, bevor man sich auf dieser Seite weiter in das Thema vertieft. | Es ist auf jeden Fall empfehlenswert, die Schnellstart-Anleitung zuerst durchzulesen, bevor man sich auf dieser Seite weiter in das Thema vertieft. | ||
== Installation des RHASSPY Moduls == | == Installation des RHASSPY Moduls == | ||
Das Modul ist derzeit nicht in der "offiziellen" FHEM Distribution enthalten und muss daher manuell installiert werden. Dafür gibt es zwei Möglichkeiten. | Das Modul ist derzeit nicht in der "offiziellen" FHEM Distribution enthalten und muss daher manuell installiert werden. Dafür gibt es zwei Möglichkeiten. | ||
=== FHEM SVN === | === FHEM SVN === | ||
Im Subversion Repository, kurz SVN von FHEM ist die jeweils aktuelle "stable" Version des Moduls im ''contrib''-Zweig zu finden. Diese kann mit folgendem Befehl, der im FHEM Befehls-Eingabefeld einzugeben ist, heruntergeladen werden: | Im Subversion Repository, kurz SVN von FHEM ist die jeweils aktuelle "stable" Version des Moduls im ''contrib''-Zweig zu finden. Diese kann mit folgendem Befehl, der im FHEM Befehls-Eingabefeld einzugeben ist, heruntergeladen werden: | ||
<syntaxhighlight lang="text">{ Svn_GetFile('contrib/RHASSPY/10_RHASSPY.pm', 'FHEM/10_RHASSPY.pm') }</syntaxhighlight> | <syntaxhighlight lang="text">{ Svn_GetFile('contrib/RHASSPY/10_RHASSPY.pm', 'FHEM/10_RHASSPY.pm') }</syntaxhighlight> | ||
Genauere Informationen zu dieser Vorgangsweise finden sich unter [[Update#Einzelne_Dateien_aus_dem_SVN_holen]]. Nach Installation des Moduls muss FHEM neu gestartet werden. | Genauere Informationen zu dieser Vorgangsweise finden sich unter [[Update#Einzelne_Dateien_aus_dem_SVN_holen]]. Nach Installation des Moduls muss FHEM neu gestartet werden. | ||
=== FHEM Update und GitHub === | === FHEM Update und GitHub === | ||
Zeile 282: | Zeile 291: | ||
:Kann verwendet werden, um benutzerdefinierte Aktionen auszuführen, sobald ein bestimmtes Hotword erkannt wurde. Dazu sind keine speziellen Konfigurationsschritte in anderen FHEM Devices notwendig. | :Kann verwendet werden, um benutzerdefinierte Aktionen auszuführen, sobald ein bestimmtes Hotword erkannt wurde. Dazu sind keine speziellen Konfigurationsschritte in anderen FHEM Devices notwendig. | ||
:Wenn mittels Attribut oder DEF aktiviert, wird ein Reading ''hotword'' erstellt und mit dem erkannten Hotword und der siteId befüllt um ein Event-Handling zu ermöglichen. | :Wenn mittels Attribut oder DEF aktiviert, wird ein Reading ''hotword'' erstellt und mit dem erkannten Hotword und der siteId befüllt um ein Event-Handling zu ermöglichen. | ||
: | :'''Hinweis:''' Da bei den hotword messages für alle Teilnehmer dieselbe Topic-Structur verwendet wird, kann RHASSPY nicht unterscheiden, ob eine solche für diese Instanz relevant ist. Falls entsprechende Unterscheidungen gemacht werden sollen, muss dies vom User entsprechend konfiguriert werden, z.B. indem die subscriptions (am MQTT2_CLIENT) eingeschränkt werden oder indem nur jeweils andere hotword-Einträge für jede RHASSPY-Instanz genutzt werden. | ||
:Ein Hotword pro Zeile, Syntax entweder einfach oder erweitert | :Ein Hotword pro Zeile, Syntax entweder einfach oder erweitert | ||
Zeile 315: | Zeile 324: | ||
:Es kann aber auch ein HASH oder ARRAY übergeben werden. | :Es kann aber auch ein HASH oder ARRAY übergeben werden. | ||
:Im Falle eines ARRAYs wird das erste Element als ''response'' interpretiert und kann ein reiner Text sein, womit der Dialog beendet wird. Ist das erste Element ein HASH wird die Dialog-Session fortgesetzt. Eine offene Dialog-Session wird per Default nach 20 Sekunden beendet. Diese Zeitspanne kann aber auch geändert werden, in dem im ARRAY als zweiter Wert eine Zahl übergeben wird. Das zweite Element kann aber auch eine komma-getrennte Liste an Geräten sein, die geändert (geschalten) wurden. Das dient dazu, damit die Geräte auch Events liefern, was ansonsten nicht der Fall wäre. Siehe dazu den "d"-Parameter beim Attribut [[#attr-rhasspyshortcuts|rhasspyShortcuts]]. | :Im Falle eines ARRAYs wird das erste Element als ''response'' interpretiert und kann ein reiner Text sein, womit der Dialog beendet wird. Ist das erste Element ein HASH wird die Dialog-Session fortgesetzt. Eine offene Dialog-Session wird per Default nach 20 Sekunden beendet. Diese Zeitspanne kann aber auch geändert werden, in dem im ARRAY als zweiter Wert eine Zahl übergeben wird. Das zweite Element kann aber auch eine komma-getrennte Liste an Geräten sein, die geändert (geschalten) wurden. Das dient dazu, damit die Geräte auch Events liefern, was ansonsten nicht der Fall wäre. Siehe dazu den "d"-Parameter beim Attribut [[#attr-rhasspyshortcuts|rhasspyShortcuts]]. | ||
: | :Wird eine HASH-Datenstruktur (ggf. in $response innerhalb einer ARRAY-Struktur), um einen laufenden Dialog fortzusetzen, muss sichergestellt werden, dass alle erforderlichen Datenelemente enthalten sind, insbesondere ''intentFilter'', falls die für den weiteren Dialog relevanten Intents eingeschränkt (oder erweitert) werden sollen. Dabei sollte möglichst der Intent ''CancelAction'' aktiv gehalten werden, damit der User die Option hat, den Dialog jederzeit aktiv zu beenden. | ||
:Siehe dazu auch den Abschnitt [[#Eigene Intents erstellen]]. | :Siehe dazu auch den Abschnitt [[#Eigene Intents erstellen]]. | ||
Zeile 345: | Zeile 354: | ||
::*<code>c</code> => Entweder Zahl oder Text. Wenn Zahl, wird sie als Timeout für den Abbruch des Dialogs behandelt. Wenn Text wird dieser als Sprachausgabe zur Bestätigung verwendet. | ::*<code>c</code> => Entweder Zahl oder Text. Wenn Zahl, wird sie als Timeout für den Abbruch des Dialogs behandelt. Wenn Text wird dieser als Sprachausgabe zur Bestätigung verwendet. | ||
::*<code>ct</code> => Numerischer Wert für das Timeout des Dialogs in Sekunden. Default ist <code>15</code>. | ::*<code>ct</code> => Numerischer Wert für das Timeout des Dialogs in Sekunden. Default ist <code>15</code>. | ||
::Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen. | ::Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen. | ||
Zeile 355: | Zeile 364: | ||
::Wird verwendet um den Timer anzuweisen mit z.B. "gestellt auf 30 Minuten" oder "gestellt auf 10:30" zu antworten | ::Wird verwendet um den Timer anzuweisen mit z.B. "gestellt auf 30 Minuten" oder "gestellt auf 10:30" zu antworten | ||
::<code>timerLimits=90,300,3000,2*HOURSECONDS,50</code> | ::<code>timerLimits=90,300,3000,2*HOURSECONDS,50</code> | ||
::Hierbei müssen fünf Werte gesetzt werden, die den Zeitgrenzen für Stufen in der Antwortstruktur ''timerSet'' entsprechen. | |||
::Hierbei müssen fünf Werte gesetzt werden, | |||
::Obiges Beispiel also würde dazu führen, unter einer eingestellten Zeit von 90 Sekunden mit der Sekundenangabe geantwortet wird. In Minuten und Sekunden solange der Timer kürzer als 300 Sekunden ist. Usw. Der letzte Wert ist das Limit in Sekunden, wenn der Timer im "Uhrzeit"-Format gestellt ist. | ::Obiges Beispiel also würde dazu führen, unter einer eingestellten Zeit von 90 Sekunden mit der Sekundenangabe geantwortet wird. In Minuten und Sekunden solange der Timer kürzer als 300 Sekunden ist. Usw. Der letzte Wert ist das Limit in Sekunden, wenn der Timer im "Uhrzeit"-Format gestellt ist. | ||
:*<code id="attr-rhasspytweaks-timersounds">timerSounds</code> | :*<code id="attr-rhasspytweaks-timersounds">timerSounds</code> | ||
Zeile 399: | Zeile 406: | ||
:*<code id="attr-rhasspytweaks-confirmintentresponses>confirmIntentResponses</code> | :*<code id="attr-rhasspytweaks-confirmintentresponses>confirmIntentResponses</code> | ||
::Üblicherweise ist die Bestätigungs-Frage ein "Echo" des ursprünglich gesprochenen Befehls. Dies kann für jeden Intent geändert werden, | ::Üblicherweise ist die Bestätigungs-Frage ein "Echo" des ursprünglich gesprochenen Befehls. Dies kann für jeden Intent geändert werden, | ||
::Dies kann für jeden Intent individuell angepaßt werden, wobei die Variablen $target, ($rawInput) und $Value verwendet werden können. | |||
:: | |||
::'''Beispiel:''' | ::'''Beispiel:''' | ||
::<code>confirmIntentResponses=SetOnOffGroup=" | ::<code>confirmIntentResponses=SetOnOffGroup="wirklich die Gruppe $target $Value schalten" SetOnOff="bestätige dass $target $Value geschaltet werden soll"</code> | ||
::<code>$Value</code> | ::<code>$Value</code> wird dabei mit den defaults aus dem ''words'' key in der languageFile übersetz (falls vorhanden). Weitere Optionen für Ersetzungen von <code>$Value</code> sind für einzelne Devices über den [[#attr-rhasspyspecials-confirmvaluemap|confirmValueMap]] key im Attribut ''rhasspySpecials'' verfügbar. | ||
:*<code id="attr-rhasspytweaks-intentfilter">intentFilter</code> | :*<code id="attr-rhasspytweaks-intentfilter">intentFilter</code> | ||
::Rhasspy aktiviert bei jedem Neustart alle ihm bekannten Intents. Da manche der von FHEM genutzten Intents nur in bestimmten Situationen (v.a. innerhalb offener Dialoge) benötigt werden, deaktiviert RHASSPY diese (derzeit: ConfirmAction, CancelAction, ChoiceRoom und ChoiceDevice beim Start, sowie jedes Mal, wenn erkannt wird, dass das Standardfiltering nicht wie erwartet funktioniert (was v.a. bei einem zwischenzeitlichen Rhasspy-Neustart der Fall sein kann). Über diesen Tweak können weitere Intents mit in diese automatisierte (De-) Aktivierung mit einbezogen werden. Entweder ist dabei einfach der Name (ohne die Zusätze aus ''language'' und ''fhemId'' anzugeben, oder eine explizite Anweisung zum ein- und Ausschalten (in der Form <code>intentname=true</code>). Die 4 vorgenannten Standard-Intents können nicht über diesen Weg aktiviert werden. Details zur intern genutzten Rhasspy-Funktionalität sind in der [https://rhasspy.readthedocs.io/en/latest/reference/#dialogue-manager Rhasspy-Dokumentation] zu finden. | |||
:: | |||
:*<code id="attr-rhasspytweaks-ignorekeywords">ignoreKeywords</code> | :*<code id="attr-rhasspytweaks-ignorekeywords">ignoreKeywords</code> | ||
::Da in manchen der von RHASSPY automatisch ausgewerteten Attribute häufig auch eher technisch motivierte Angaben zu finden sind, kann über diesen Schlüssel verhindert werden, dass derartige Angaben bei der slot-Erstellung übergangen werden. Dies betrifft z.B. häufig anzutreffende ''room''-Werte wie ''MQTT'', ''alexa'', ''homebridge'' oder ''googleassistant''. Die hier angegebenen key-value-Paare werden als Negativ-Filter für die angegebenen Werte verwendet (derzeit nur für ''rooms'' und ''group''). ''value'' wird dabei als (case-insensitive) regex behandelt, verglichen wird auf exakten match (es müssen also ggf. vorne bzw. hinten ''.*'' angefügt werden). | |||
:: | ::Dieses '''Beispiel''' filtert daher die o.g. Räume aus und dazu noch die strukturierten Unterräume unterhalb ''Steuerung'': | ||
::'''Beispiel | ::<code>ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.*</code> | ||
::<code>ignoreKeywords= | |||
==Readings / Events== | ==Readings / Events== | ||
Zeile 691: | Zeile 692: | ||
'''Wichtig:''' Bei Tags (Value, Room, Device, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen. | '''Wichtig:''' Bei Tags (Value, Room, Device, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen. | ||
=== SetOnOff === | === SetOnOff === |
Version vom 3. Dezember 2021, 09:47 Uhr
An dieser Seite wird momentan noch gearbeitet. |
RHASSPY | |
---|---|
Zweck / Funktion | |
Anbindung von FHEM an den Rhasspy Sprachassistenten | |
Allgemein | |
Typ | Contrib |
Details | |
Dokumentation | Thema |
Support (Forum) | Frontends/Sprachsteuerung |
Modulname | 10_RHASSPY.pm |
Ersteller | Beta-User (Forum /Wiki), drhirn (Forum /Wiki) |
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref! |
Rhasspy ist eine Open Source-Lösung für Spracherkennung und Sprachsteuerung. Es handelt sich dabei um eine Sammlung von Scripten, die unter einer einheitlichen Bedienoberfläche zusammengefasst sind, die sehr flexibel genutzt und erweitert werden kann. Die Besonderheit an Rhasspy ist, dass es nach der Installation komplett offline betrieben wird. Es werden also keine Daten an einen Server im Internet geschickt, und für den Betrieb nur für FHEM werden nur moderate Hardwareanforderungen gestellt - ein aktueller Raspberry Pi ab Modell 3B+ sollte in der Regel genügen.
Die Anbindung weiterer Räume ist über sogenannte "Satelliten" möglich. Dies kann z.B. ein Pi Zero mit Mikro und Lautsprecher sein, ein ESP32 mit entsprechender Hardware oder ein Mobiltelefon mit Android und der entsprechenden App.
Rhasspy besteht aus vielen unterschiedlichen Modulen (Hot-Word Erkennung, Text-to-Speech, Speech-to-Text, Intent Erkennung, etc.). Alle diese Module kommunizieren miteinander über das MQTT-Protokoll.
Das Modul RHASSPY prüft Teile des MQTT-Traffics, konvertiert diese JSON-Nachrichten in FHEM-Befehle und sendet Nachrichten zurück an Rhasspy um z.B. Antworten über Text-to-Speech auszugeben.
RHASSPY verwendet das 00_MQTT2_CLIENT.pm Modul um Nachrichten zu empfangen und zu senden. Daher ist es notwendig, ein MQTT2_CLIENT Device zu erstellen, bevor RHASSPY verwendet werden kann.
Hervorgegangen ist RHASSPY aus dem Snips-Modul, nachdem Snips an Sonos verkauft und anschließend eingestellt wurde. Danke also an Thyraz, der die grundlegenden Arbeiten erledigt hat!
- RHASSPY bezieht sich auf das FHEM-Modul oder das FHEM-Device
- Rhasspy bezeichnet die (zentrale) Installation bzw. das Web-Interface, unter dem die Scriptsammlung verwaltet werden kann.
Erste Schritte
Für Einsteiger in das Thema Rhasspy bzw. RHASSPY gibt es eine Schnellstart-Anleitung, welche die ersten grundlegenden Schritte einfach erklärt: RHASSPY/Schnellstart
Es ist auf jeden Fall empfehlenswert, die Schnellstart-Anleitung zuerst durchzulesen, bevor man sich auf dieser Seite weiter in das Thema vertieft.
Installation des RHASSPY Moduls
Das Modul ist derzeit nicht in der "offiziellen" FHEM Distribution enthalten und muss daher manuell installiert werden. Dafür gibt es zwei Möglichkeiten.
FHEM SVN
Im Subversion Repository, kurz SVN von FHEM ist die jeweils aktuelle "stable" Version des Moduls im contrib-Zweig zu finden. Diese kann mit folgendem Befehl, der im FHEM Befehls-Eingabefeld einzugeben ist, heruntergeladen werden:
{ Svn_GetFile('contrib/RHASSPY/10_RHASSPY.pm', 'FHEM/10_RHASSPY.pm') }
Genauere Informationen zu dieser Vorgangsweise finden sich unter Update#Einzelne_Dateien_aus_dem_SVN_holen. Nach Installation des Moduls muss FHEM neu gestartet werden.
FHEM Update und GitHub
Im GitHub-Repository des Moduls gibt es zwei Branches main und dev. In main ist die stabile Version des Moduls, in dev die jeweils aktuelle Entwicklungsversion. Aus Gründen der Stabilität ist natürlich die aus main zu bevorzugen.
Um das Modul zu installieren bzw. zu aktualisieren, kann der update-Mechanismus von FHEM genutzt werden. Dazu muss das Repository in der Liste der vom update-Befehl verarbeiteten Repositorien aufgenommen werden:
update add https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt
Anschließend kann mit folgendem Befehl das Modul installiert oder aktualisiert werden:
update all https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt
Wählt man diesen Weg, wird das Modul auch automatisch aktualisiert, wenn ein Update von FHEM durchgeführt wird. Möchte man die Entwicklungsversion verwenden, muss in den beiden Befehlen main durch dev ersetzt werden.
Weitere Informationen zu dieser Vorgangsweise in der stehen in der CommandRef oder im FHEM-Wiki.
Nach Installation des Moduls muss FHEM neu gestartet werden.
Einrichtung MQTT2_CLIENT
Rhasspy kommuniziert hauptsächlich über das MQTT-Protokoll. Und zwar sowohl Rhasspy-intern, wie auch mit FHEM. Da dies auch für die übertragene Sprache und Audio-Dateien gilt und es daher zu sehr viel MQTT-Verkehr kommt, sollte der Rhasspy-interne MQTT-Server verwendet werden. Daher ist die Einrichtung eines MQTT2_CLIENT-Devices notwendig, um die für FHEM relevanten Daten zu beziehen.
Zuerst muss ein MQTT2_CLIENT Device erstellt werden, welches sich mit dem MQTT-Server (Mosquitto) von Rhasspy verbindet:
define <deviceName> MQTT2_CLIENT <ip-oder-hostname-des-mqtt-servers>:<port>
Anschließend wird die clientOrder gesetzt, um die richtige Benachrichtigungsreihenfolge einzustellen. Wird das MQTT2_CLIENT Device nur für RHASSPY verwendet, reicht hier die Angabe RHASSPY
. Ansonsten müssen noch alle anderen Devices (z.B. MQTT_GENERIC_BRIDGE
, MQTT2_DEVICE
) angegeben werden.
attr <deviceName> clientOrder RHASSPY [device2] [device3]
Um die Topics einzuschränken, die das Device abonniert, müssen diese angegeben werden. Wird der MQTT-Server nur für RHASSPY verwendet, reicht die Angabe setByTheProgram
. Ansonsten müssen alle für RHASSPY notwendigen Topics eingefügt werden.
attr <deviceName> subscriptions setByTheProgram
bzw.
attr <deviceName> subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected
- Beispiele
- Rhasspy-interner MQTT-Server wird mit seinem Standard-Port verwendet. Rhasspy läuft auf der selben Maschine wie FHEM. MQTT2_CLIENT wird nur für RHASSPY verwendet.
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183
attr rhasspyMQTT2 clientOrder RHASSPY
attr rhasspyMQTT2 subscriptions setByTheProgram
- Rhasspy läuft auf einem eigenen Server und verwendet einen externen MQTT Server mit eigener Port-Einstellung. MQTT2_CLIENT wird für RHASSPY, aber auch MQTT_GENERIC_BRIDGE und MQTT2_DEVICE verwendet.
defmod rhasspyMQTT2 MQTT2_CLIENT 192.168.1.122:1884
attr rhasspyMQTT2 clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE
attr rhasspyMQTT2 subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected [zusätzliche Subscriptions für andere MQTT-Module]
Definition von RHASSPY (DEF)
define <name> RHASSPY <baseUrl> <devspec> <defaultRoom> <language> <fhemId> <prefix> <useGenericAttrs> <handleHotword> <encoding>
Alle Parameter sind optional. Die meisten werden im Normalfall gar nicht benötigt (z.B. fhemId
, prefix
). Sollten sie aber verwendet und später geändert werden, kann es zu unvorhergesehenem Verhalten kommen. Speziell beim Einstieg in das Thema RHASSPY sollten nicht mehr, als die ersten drei verwendet werden. Ausgenommen eventuell noch language
, möchte man eine andere Sprache als Englisch oder Deutsch verwenden.
baseUrl
- Die URL zum Rhasspy-Webservice. Sollten eine Base und mehrere Satelliten verwendet werden, die URL zur Base. Bitte sicherstellen, dass die Adresse richtig ist (IP und Port)! Default ist
baseUrl=http://127.0.0.1:12101
. devspec
- devspec der Geräte, die mit Rhasspy gesteuert werden sollen. Wenn der genericDeviceType-Support aktiviert ist, ist der Default
devspec=genericDeviceType=.+
, sonst wirddevspec=room=Rhasspy
verwendet. Ohne ein passendes Match in der devspec wird kein Gerät mit dem Modul interagieren, egal, ob sonst irgendwelche RHASSPY-spezifischen Attribute beim Gerät gesetzt sind. Genauere Informationen, wie z.B. eine Liste von Geräten oder Kombinationen aus Geräten und Räumen (z.B.devspec=room=livingroom,room=bathroom,bedroomlamp
) verwendet werden können, finden sich in der CommandRef. defaultRoom
- Der Name des Standard-Raumes, der verwendet wird, wenn im Sprachkommando kein Raum enthalten ist und auch kein passender für das Device gefunden werden kann. Default ist
defaultRoom=default
. language
- Sprache, in der mit Rhasspy gesprochen wird. Der Standard-Wert hängt vom global-Device ab. Dieser ist standardmäßig
language=en
. fhemId
- Wird verwendet um auf MQTT-Seite zwischen mehreren Installationen des RHASSPY-Moduls zu unterscheiden. Ist auch ein Teil des Topic-Trees, auf den die jeweilige RHASSPY-Instanz hört. Default ist
fhemId=fhem
. prefix
- Wird verwendet um auf FHEM-Seite zwischen mehreren Installationen des RHASSPY-Moduls zu unterscheiden. Praktisch, wenn man mehrere Instanzen von RHASSPY auf einer FHEM Installation laufen hat und z.B. verschiedene Bezeichner für Gruppen und Räume haben möchte (z.B. unterschiedliche Sprachen). Default ist
prefix=rhasspy
. useGenericAttrs
- Üblicherweise verwendet RHASSPY - wie auch einige andere FHEM Module für Sprachassistenten - das Attribut genericDeviceType um Schaltmöglichkeiten von Geräten automatisch zu erkennen. Dieser Parameter fügt das Attribut genericDeviceType zur globalen Attributliste hinzu. Der Wert 0 verhindert dieses hinzufügen. Default ist
useGenericAttrs=1
. encoding
- Sollte es Probleme mit Umlauten geben, kann das Character-Encoding geändert werden. Default ist
encoding=utf8
. handleHotword
- Triggert das Reading hotword, wenn ein Hotword erkannt wurde (und erstellt das Reading, falls noch nicht vorhanden). Weitere Informationen dazu stehen beim Attribut rhasspyHotwords. Default ist
handleHotword=0
attr <deviceName> IODev <m2client>
.
- Beispiele
Läuft Rhasspy auf der selben Maschine wie FHEM, die Sprache ist im global-Device bereits richtig eingestellt und der Standardraum entspricht der siteID, die in Rhasspy vergeben wurde:
define Rhasspy RHASSPY
Läuft Rhasspy auf einem anderen System wie FHEM, der Standard-Raum enspricht nicht dem, was Rhasspy liefert, die Sprache soll auch anders sein und es sollen sowohl Geräte mit vorhandenem genericDeviceType Attribut, als auch die Geräte device_a1 und device_xy gesteuert werden:
define Rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 defaultRoom="Büro Lisa" language=de devspec=genericDeviceType=.+,device_a1,device_xy handleHotword=1
Set-Befehle (SET)
customSlot
- Erstellt einen neue - oder überschreibt einen alten - Slot in Rhasspy
slotname
undslotdata
sind verpflichtendoverwrite
ist optional. Default istoverwrite=true
. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.training
ist optional. Default isttraining=true
. Das Setzen eines anderen Wertes verhindert ein Training von Rhasspy nach dem Speichern des Slots.
- Beispiele:
set <rhasspyDevice> customSlot mySlot a,b,c overwrite training
set <rhasspyDevice> customSlot slotname=mySlot slotdata=a,b,c overwrite=false
fetchSiteIds
- Liest alle in Rhasspy vorhandenen siteIDs aus und speichert sie im Reading siteIds. Wird z.B. verwendet, um festzustellen, auf welchem Satelliten der User über das Ende eines Timers benachrichtigt werden soll.
- Muss immer ausgeführt werden, wenn eine neue siteId in Rhasspy hinzugefügt wird (neuer Satellit z.B.).
- Beispiel:
set <rhasspyDevice> fetchSiteIds
play
- Sendet eine WAV Datei an Rhasspy.
siteId
und <path> sind verpflichtend!- Optional kann die Anzahl der Wiederholungen (Default: 1) und die Dauer der Pause zwischen den jeweiligen Wiederholungen (Default: 15) angeben werden.
- Beispiele:'
set <rhasspyDevice> play siteId="default" path="/opt/fhem/test.wav"
set <rhasspyDevice> play siteId="default" path="./test.wav" repeats=3 wait=20
speak
- Sendet einen Text an das TTS-Sytem, welches ihn dann als Sprache ausgibt.
- Beide Argumente
siteId
undtext
sind verpflichtend! - Beispiel:
set <rhasspyDevice> speak siteId="wohnzimmer" text="This is a test"
textCommand
- Sendet ein Text-Kommando an Rhasspy.
- Example:
set <rhasspyDevice> textCommand schalte das licht ein
trainRhasspy
- Startet das Training von Rhasspy.
- Beispiel:
set <rhasspyDevice> trainRhasspy
update
-
devicemap
- Wenn an der Konfiguration von RHASSPY oder an den von ihm gesteuerten Geräten etwas geändert wurde, muss dieser Befehl ausgeführt werden, um die Datenstruktur von RHASSPY zu aktualisieren, Rhasspy von den Änderungen zu informieren (Slots z.B.), ein Training zu starten, etc.
- Beispiel:'
set <rhasspyDevice> update devicemap
devicemap_only
- Aktualisiert die Datenstruktur von RHASSPY. Es werden weder Slots in Rhasspy geändert, noch das Training gestartet.
- Beispiel:
set <rhasspyDevice> update devicemap_only
slots
- Aktualisiert (bzw. erstellt) alle Slots in Rhasspy mit den aktuellen Geräten, Räumen, usw.
- Erstellte/Aktualisierte Slots sind z.B.:
- de.fhem.AllKeywords
- de.fhem.Device
- de.fhem.Device-genericDeviceType
- de.fhem.Group
- de.fhem.Room
- de.fhem.MediaChannels
- de.fhem.Color
- de.fhem.NumericType
- (Hinweis: Die ersten beiden Teile de und fhem hängen von der DEF des RHASSPY-Devices ab)
- Beispiel:
set <rhasspyDevice> update slots
slots_no_training
- Wie
slots
, aber ohne Training nach dem Update. - Beispiel:
set <rhasspyDevice> update slots_no_training
language
- Liest das das Sprach-File (languageFile) neu ein.
- Muss immer ausgeführt werden, wenn in diesem File oder dem Attribut languageFile etwas geändert wurde!
- Beispiel:
set <rhasspyDevice> update language
intent_filter
- Setzt die Intent Filter, die vom Rhasspy Dialogue Manger verwendet werden zurück. Details dazu bei intentFilter im rhasspyTweaks-Attribut.
- Beispiel:
set <rhasspyDevice> update intent_filter
all
- Aktualisiert die Devicemap und das languageFile
- Beispiel:
set <rhasspyDevice> update all
volume
-
- Stellt die Lautstärke der gewünschten siteId auf einen Wert zwischen 0 and 1 (float).
- Beide Argumente
siteId
volume
sind verpflichtend. - Beispiel:
set <rhasspyDevice> siteId="default" volume="0.5"
update devicemap
ausgeführt werden muss!
Attribute (ATTR)
Um RHASSPY zum Laufen zu bringen, müssen unterschiedliche Attribute gesetzt werden. Dabei gibt es
- Attribute, die im RHASSPY-Device selbst gesetzt werden müssen und
- Attribute, die in den Devices gesetzt werden müssen, die von RHASSPY kontrolliert werden sollen.
Letztere werden im Abschnitt #FHEM-Devices für die Verwendung mit Rhasspy konfigurieren behandelt.
In diesem Abschnitt werden die Attribute behandelt, die auf das RHASSPY-Device selbst wirken.
IODev
- Das MQTT2_CLIENT Device, welches die MQTT-Nachrichten für RHASSPY liefert.
- Beispiel:
attr <rhasspyDevice> IODev rhasspyMQTT2
forceNext
- Wenn dieses Attribut auf 1 gesetzt ist, leitet RHASSPY eingehende MQTT-Nachrichten an andere MQTT2-IO-Client Module wie MQTT2_DEVICE weiter, auch wenn das Topic zu einem von RHASSPY abonnierten passt.
- Standardmäßig werden diese Nachrichten nicht weitergeleitet um eine bessere Kompatibilität mit dem autocreate-Feature des MQTT2_DEVICE sicher zu stellen.
- Siehe dazu das clientOrder-Attribut in der CommandRef zum MQTT2_CLIENT Device.
- Das Setzen dieses Attributs in einer RHASSPY-Instanz kann auch andere eventuell vorhandene RHASSPY-Instanzen beinflussen.
- Default ist
0
- Beispiel:
attr <rhasspyDevice> forceNext 1
languageFile
- Pfad zur Sprach-Datei
- Ist dieses Argument nicht gesetzt, wird ein Standard-Set an englischen Sätzen für die Sprachantworten verwendet.
- Die Datei selbst muss ein gültiges JSON-File sein, dass sich nach der Struktur aus den englischen Standardwerten richtet.
- Eine deutsche Beispiel-Datei ist in SVN und GitHub vorhanden. Man kann aber einfach ein Dump der englischen Struktur machen (replace RHASSPY by your device's name:
{toJSON($defs{RHASSPY}->{helper}{lng})}
, das Ergebnis dann bearbeiten und es als eigenes languageFile verwenden. - Im Standard-Set sind auch einige Variablen enthalten. Auch die können im eigenen File verwendet werden.
- languageFile erlaubt auch eine Kombination aus vorhandenen und eigenen Sätzen. Dazu können die eigenen Sätzen einfach im Sub-Tree user abgelegt werden.
- Beispiel: (vorausgesetzt, die Sprach-Datei ist im selben Verzeichnis wie fhem.pl):
attr <rhasspyDevice> languageFile ./rhasspy-de.cfg
response
- Hinweis:: Die Verwendung dieses Attributs ist nicht mehr empfohlen. Bessere Alternative ist die Sprach-Datei.
rhasspyHotwords
- Kann verwendet werden, um benutzerdefinierte Aktionen auszuführen, sobald ein bestimmtes Hotword erkannt wurde. Dazu sind keine speziellen Konfigurationsschritte in anderen FHEM Devices notwendig.
- Wenn mittels Attribut oder DEF aktiviert, wird ein Reading hotword erstellt und mit dem erkannten Hotword und der siteId befüllt um ein Event-Handling zu ermöglichen.
- Hinweis: Da bei den hotword messages für alle Teilnehmer dieselbe Topic-Structur verwendet wird, kann RHASSPY nicht unterscheiden, ob eine solche für diese Instanz relevant ist. Falls entsprechende Unterscheidungen gemacht werden sollen, muss dies vom User entsprechend konfiguriert werden, z.B. indem die subscriptions (am MQTT2_CLIENT) eingeschränkt werden oder indem nur jeweils andere hotword-Einträge für jede RHASSPY-Instanz genutzt werden.
- Ein Hotword pro Zeile, Syntax entweder einfach oder erweitert
- Beispiele:
bumblebee_linux = set amplifier2 mute on
porcupine_linux = livingroom="set amplifier mute on" default={Log3($DEVICE,3,"device $DEVICE - room $ROOM - value $VALUE")}
- Im ersten Beispiel wird der Befehl immer ausgeführt, wenn das Hotword bumblebee_linux erkannt wurde.
- Im zweiten nur, wenn das Hotword porcupine_linux in der siteId livingroom erkannt wurde.
- $DEVICE wird ausgewertet als der Name des RHASSPY Devices, $ROOM als siteId und $VALUE als das verwendete Hotword.
rhasspyIntents
- Definiert einen benutzerdefinierten Intent.
- Ein Intent pro Zeile.
- Beispiel:
attr <rhasspyDevice> rhasspyIntents SetCustomIntentsTest=SetCustomIntentsTest(siteId,Type)
- in Kombination mit folgendem myUtils-Code
sub SetCustomIntentsTest { my $room = shift; my $type = shift; Log3('rhasspy',3 , "RHASSPY: Room $room, Type $type"); return "RHASSPY: Room $room, Type $type"; }
- schreibt einen Log-Eintrag nach jedem Aufruf dieses Intents.
- Die folgenden Argumente können dabei übergeben werden:
- NAME => Name des RHASSPY-Devices
- DATA => komplette JSON-$data (wie intern geparsed), in JSON kodiert
- siteId, Device etc. => jedes Element, das in JSON-$data existiert
- Wird von der Funktion ein einfacher Text zurück geliefert, wird dieser als response angesehen. Wenn der Rückgabewert nicht definiert ist, wird die Standard-response verwendet.
- Es kann aber auch ein HASH oder ARRAY übergeben werden.
- Im Falle eines ARRAYs wird das erste Element als response interpretiert und kann ein reiner Text sein, womit der Dialog beendet wird. Ist das erste Element ein HASH wird die Dialog-Session fortgesetzt. Eine offene Dialog-Session wird per Default nach 20 Sekunden beendet. Diese Zeitspanne kann aber auch geändert werden, in dem im ARRAY als zweiter Wert eine Zahl übergeben wird. Das zweite Element kann aber auch eine komma-getrennte Liste an Geräten sein, die geändert (geschalten) wurden. Das dient dazu, damit die Geräte auch Events liefern, was ansonsten nicht der Fall wäre. Siehe dazu den "d"-Parameter beim Attribut rhasspyShortcuts.
- Wird eine HASH-Datenstruktur (ggf. in $response innerhalb einer ARRAY-Struktur), um einen laufenden Dialog fortzusetzen, muss sichergestellt werden, dass alle erforderlichen Datenelemente enthalten sind, insbesondere intentFilter, falls die für den weiteren Dialog relevanten Intents eingeschränkt (oder erweitert) werden sollen. Dabei sollte möglichst der Intent CancelAction aktiv gehalten werden, damit der User die Option hat, den Dialog jederzeit aktiv zu beenden.
- Siehe dazu auch den Abschnitt #Eigene Intents erstellen.
rhasspyShortcuts
- Hiermit können benutzerdefinierte Sätze erstellt werden ohne die sentences.ini in Rhasspy bearbeiten zu müssen.
- Diese Shortcuts werden zu Rhasspy hochgeladen, sobald das
updateSlots
Set-Kommando ausgeführt wird. - Ein Shortcut pro Zeile, Syntax ist entweder einfach oder erweitert.
- Beispiele:
mute on=set amplifier2 mute on
lamp off={fhem("set lampe1 off")}
i="du bist cool" f="set $NAME speak siteId='livingroom' text='danke dir! du bist noch viel cooler!'"
i="schalte den ton aus" p={fhem ("set $NAME mute off")} n=amplifier2 c="soll ich den ton wirklich ausschalten?"
i="ich hab hunger" f="set Herd on" d="Herd" c="möchtest du schweinsbraten?"
- Erklärung zu den Abkürzungen:
i
=> intent
- Zeilen, die mit
i
beginnen, werden als erweiterte Syntax interpretiert. Soll die erweiterte Syntax verwendet werden, ist dasi
also Pflicht!
f
=> FHEM Befehl
- Syntax wie von der FHEM Kommandozeile gewohnt
p
=> Perl Befehl
- Syntax wie von der FHEM Kommandozeile gewohnt, eingerahmt in geschwungenen Klammern (
{}
).p
hat Vorrang vorf
d
=> Device Name(en, Komma getrennt)
- Device Name(n), die an fhem.pl als upgedated übergeben werden sollen. Das wird benötigt um weitere Aktionen in FHEM und das Longpolling zu triggern.
- Hinweis: Wenn Perl-Funktionen aufgerufen werden, wird der Rückgabewert dieser Funktion verwendet, sofern kein explizites Device angegeben ist.
r
=> Response
- Sprachanwort, die ausgegeben wird. Ist
r
nicht gesetzt, wird der Rückgabewert der aufgerufenen Funktion verwendet. - In den Antwortsätze werden set magic-ähnliche Ersetzungen verarbeitet. Es ist also auch eine Zeile wie
i="what's the time for sunrise" r="at [Astro:SunRise] o'clock"
gültig. - Mit den folgenden Abkürzungen kann auch nach einer Bestätigung für den Befehl gefragt werden:
c
=> Entweder Zahl oder Text. Wenn Zahl, wird sie als Timeout für den Abbruch des Dialogs behandelt. Wenn Text wird dieser als Sprachausgabe zur Bestätigung verwendet.ct
=> Numerischer Wert für das Timeout des Dialogs in Sekunden. Default ist15
.
- Siehe hier für weitere Informationen zu Bestätigungen.
rhasspyTweaks
Mit diesen Einstellungen können benutzerdefinierte Optimierungen an RHASSPY vorgenommen werden.
timerLimits
- Wird verwendet um den Timer anzuweisen mit z.B. "gestellt auf 30 Minuten" oder "gestellt auf 10:30" zu antworten
timerLimits=90,300,3000,2*HOURSECONDS,50
- Hierbei müssen fünf Werte gesetzt werden, die den Zeitgrenzen für Stufen in der Antwortstruktur timerSet entsprechen.
- Obiges Beispiel also würde dazu führen, unter einer eingestellten Zeit von 90 Sekunden mit der Sekundenangabe geantwortet wird. In Minuten und Sekunden solange der Timer kürzer als 300 Sekunden ist. Usw. Der letzte Wert ist das Limit in Sekunden, wenn der Timer im "Uhrzeit"-Format gestellt ist.
timerSounds
- Standardmäßig antwortet der Timer mit einer Sprachnachricht, wenn er abgelaufen ist. Soll lieber eine WAV-Datei verwendet werden, kann das hier eingestellt werden.
timerSounds= default=./yourfile1.wav eier=3:20:./yourfile2.wav kartoffeln=5:./yourfile3.wav
- Die Keys in dieser Code-Zeile sind Beispiele und deren Name - bis auf
default
frei wählbar. Der Name muss aber zu den Label-Tags für die Timer in den Rhasspy-Sentences passen. default
ist optional. Wenn gesetzt, wird dieses WAV-File für alle benannten Timer verwendet, für die kein Keyword in der Konfiguration ist.- Die beiden Nummern sind optional. Die erste legt fest, wie oft die WAV-Datei wiederholt werden soll (Default: 5). Die zweite definiert die Pause in Sekunden zwischen den Wiederholungen (Default: 15). Ist nur eine Zahl gesetzt, wird diese als gewünschte Anzahl an Wiederholungen interpretiert.
updateSlots
- Ändert diverse Aspekte des Erstellens und Updatens von Slots
noEmptySlots=1
- Per Default generiert RHASSPY einen zusätzlichen Slot für jeden genericDeviceType, der erkannt wird. Unabhängig davon, ob er bei einem Gerät gesetzt ist. Das kann zu leeren Slots führen.
- Ist der Wert
1
, werden keine leeren Slots erstellt.
overwrite_all=false
- RHASSPY überschreibt alle vorhandenen Slots wenn ein
updateSlots
ausgeführt wird. Ist das nicht gewünscht, muss dieser Wert auffalse
gesetzt werden.
timeouts
- Die Keywörter
confirm
unddefault
können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern. - Beispiel:
timeouts: confirm=25 default=30
confirmIntents
- Hiermit kann eingestellt werden, dass für bestimmte Intents immer ein Bestätigung erfragt wird. Unterstützt werden derzeit alle "set-"-Intents.
- Dazu werden
Intent
=regex
-Paare verwendet.Intent
ist der Name des gewünschten Intentsregex
ist eine Regex, die eine bestimmte Gruppe (für Gruppen-Intents) oder einen bestimmten Device-Namen beschreiben muss.- Beispiel:
confirmIntents=SetOnOffGroup=light|blinds SetOnOff=blind.*
- Befehle werden nur nach einer positiven Bestätigung ausgeführt. Das bedeutet, es muss unbedingt ein
Mode:OK
-Wert vom ConfirmAction-Intent gesendet werden. Jede andere Wert fürMode
wird als Abbruch gewertet. Es kann aber auch der eigene Intent CancelAction für den Abbruch verwendet werden. - Beispiel:
[de.fhem:ConfirmAction] ( yes, please do it | go on | that's ok | yes, please ){Mode:OK} ( don't do it after all ){Mode} [de.fhem:CancelAction] ( let it be | oh no | cancel | cancellation ){Mode:Cancel}
confirmIntentResponses
- Üblicherweise ist die Bestätigungs-Frage ein "Echo" des ursprünglich gesprochenen Befehls. Dies kann für jeden Intent geändert werden,
- Dies kann für jeden Intent individuell angepaßt werden, wobei die Variablen $target, ($rawInput) und $Value verwendet werden können.
- Beispiel:
confirmIntentResponses=SetOnOffGroup="wirklich die Gruppe $target $Value schalten" SetOnOff="bestätige dass $target $Value geschaltet werden soll"
$Value
wird dabei mit den defaults aus dem words key in der languageFile übersetz (falls vorhanden). Weitere Optionen für Ersetzungen von$Value
sind für einzelne Devices über den confirmValueMap key im Attribut rhasspySpecials verfügbar.
intentFilter
- Rhasspy aktiviert bei jedem Neustart alle ihm bekannten Intents. Da manche der von FHEM genutzten Intents nur in bestimmten Situationen (v.a. innerhalb offener Dialoge) benötigt werden, deaktiviert RHASSPY diese (derzeit: ConfirmAction, CancelAction, ChoiceRoom und ChoiceDevice beim Start, sowie jedes Mal, wenn erkannt wird, dass das Standardfiltering nicht wie erwartet funktioniert (was v.a. bei einem zwischenzeitlichen Rhasspy-Neustart der Fall sein kann). Über diesen Tweak können weitere Intents mit in diese automatisierte (De-) Aktivierung mit einbezogen werden. Entweder ist dabei einfach der Name (ohne die Zusätze aus language und fhemId anzugeben, oder eine explizite Anweisung zum ein- und Ausschalten (in der Form
intentname=true
). Die 4 vorgenannten Standard-Intents können nicht über diesen Weg aktiviert werden. Details zur intern genutzten Rhasspy-Funktionalität sind in der Rhasspy-Dokumentation zu finden.
ignoreKeywords
- Da in manchen der von RHASSPY automatisch ausgewerteten Attribute häufig auch eher technisch motivierte Angaben zu finden sind, kann über diesen Schlüssel verhindert werden, dass derartige Angaben bei der slot-Erstellung übergangen werden. Dies betrifft z.B. häufig anzutreffende room-Werte wie MQTT, alexa, homebridge oder googleassistant. Die hier angegebenen key-value-Paare werden als Negativ-Filter für die angegebenen Werte verwendet (derzeit nur für rooms und group). value wird dabei als (case-insensitive) regex behandelt, verglichen wird auf exakten match (es müssen also ggf. vorne bzw. hinten .* angefügt werden).
- Dieses Beispiel filtert daher die o.g. Räume aus und dazu noch die strukturierten Unterräume unterhalb Steuerung:
ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.*
Readings / Events
IODev
- Das eingestellte IO-Device
intents
- Eine Liste der in Rhasspy vorhandenen Intents
lastIntentPayload
- Inhalt des letzten Intents der von FHEM empfangen wurde
lastIntentTopic
- Das MQTT-Topic des letzten Intents
listening_roomname
- Ein Reading für jeden Raum bzw. jede siteId
- Wechselt auf 1 sobald ein Hotword erkannt wurde und zurück auf 0, sobald die Dialog-Session beendet ist.
- Kann z.B. verwendet werden, um den Ton eines TVs auszuschalten, während Rhasspy auf ein Kommando hört.
mute_roomname
- Zeigt an, ob ein Raum / eine siteId vom Intent SetMute stumm geschalten wurde und somit keine Befehle ausführt.
- Jeweils ein Reading für jede siteId.
- Default ist 0.
responseType
- Der Typ der letzten Antwort (text/voice).
- voiceResponse and textResponse
- Antwort auf das letzte Sprach-/Text-Kommando.
siteIds
- Listet alle siteIds auf.
- Kann mit fetchSiteIds aktualisiert werden.
state
- Zeigt an ob RHASSPY mit Rhasspy verbunden ist
training
- Letzte zurückgelieferte Antwort auf einen trainRhasspy-Befehl.
updateSlots
- Letzte zurückgelieferte Antwort nach einem updateSlots-Befehl.
hotword
- Wenn aktiviert, beinhaltet dieses Reading das letzte verwendete Hotword und von welcher siteId es aufgerufen wurde.
voiceResponse
- Letze Sprach-Antwort auf einen Sprach-Befehl
FHEM-Devices für die Verwendung mit Rhasspy konfigurieren
Um ein Gerät mit Rhasspy steuern zu können, muss Rhasspy einige Details über das Gerät kennen. Diese werden bekannt gemacht, in dem bei den Geräten Attribute gesetzt werden, die anschließend vom RHASSPY-Modul ausgewertet und an Rhasspy gesendet werden.
Der einfachste - und empfohlene - Weg, dies zu erreichen, ist durch Setzen des Attributs genericDeviceType. Das Modul erkennt dann die möglichen Schalt - und Abfragemöglichkeiten des Gerätes automatisch.
Sollte genericDeviceType (gDT) nicht ausreichen, gibt es noch weitere Attribute, die stattdessen oder ergänzend dazu verwendet werden können (z.b. rhasspyName, rhasspyRoom, ...). Die Namen dieser Attribute beginnen alle mit dem prefix, das in der DEF des RHASSPY-Moduls gesetzt wurde. Diese Dokumentation verwendet das Prefix rhasspy
.
Sind sowohl genericDeviceType als auch Spezial-Attribute vorhanden, werden die von gDT gesammelten Möglichkeiten durch die der Spezial-Attribute überschrieben.
Wichtig:
- Nach JEDER Änderung an den folgenden Attributen muss ein
update devicemap
ausgeführt werden. Sonst erfahren weder RHASSPY, noch Rhasspy von der Änderung. - RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das
update devicemap
-Kommando aktualisiert und kann mittelslist
-Befehl angezeigt werden. Für diesen HASH werden alle Namen und sonstige "Labels" in Kleinbuchstaben umgewandelt. Sollte man Slots händisch befüllen, muss also darauf geachtet werden, dass Rhasspy ebenfalls Werte in Kleinbuchstaben liefert. - Die Mindestvoraussetzungen für ein FHEM Device um mit RHASSPY zusammenzuarbeiten sind:
- Das Device muss von der devspec im Define des RHASSPY-Devices abgedeckt werden
- Es muss mindestens eines der folgenden Attribute (im Normalfall genericDeviceType) im Device gesetzt sein.
- Die Mapping-Logik (für Namen, mögliche Schaltzustände, etc.) ist wie folgt:
- Sind RHASSPY-spezifische Attribute gesetzt, werden ausschließlich diese verwendet. Natürlich nur für den Zweck des gesetzten Attributs. Ein gesetzter rhasspyName z.B. wird also nicht verhindern, dass die durch genericDeviceType ermittelten möglichen Schaltzustände ebenfalls gespeichert werden.
- Je spezifischer ein Attribut ist, desto eher wird es unspezifische überschreiben. alias wird also verhindern, dass der (technische) Device-Namen verwendet wird. Aber ein gesetztes Attribut alexaName, gassistantName oder siriName wird den Alias überschreiben. Sind zwei "gleichwertige" Attribute vorhanden (z.B. siriName und alexaName), werden beide verwendet.
- Attribut-Werte werden typischerweise "Zeile für Zeile" gelesen. Wobei gilt, eine Zeile pro Wert/Befehl. Zeilenumbrüche sollten also an den richtigen Stellen gesetzt werden.
genericDeviceType
Ist dieses Attribut gesetzt, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln sofern das Device der devspec entspricht.
Derzeit werden folgende genericDeviceType unterstützt:
- switch
- light
- thermostat
- thermometer
- HumiditySensor
- blind/blinds/shutter
- media
- motion/contact/ContactSensor/lock/presence
Wird genericDeviceType verwendet, werden unter anderem folgende Informationen gesammelt:
- der Name (
NAME
oderalias
) - der Raum, in dem das Device ist
- die Gruppe, zu der das Device gehört
- wie Informationen vom Gerät abgefragt werden können
- wie Werte/Stati am Gerät gesetzt werden können
Die Verwendung von genericDeviceType ist der einfachste Weg, wie man FHEM Geräte dazu bringen kann, mit RHASSPY zusammenzuarbeiten. Manchmal liefert gDT aber nicht ausreichende oder nicht passende Informationen. In so einem Fall können die folgenden Attribute (zusätzlich) verwendet werden.
rhasspyName
Mit diesem Attribut kann der Name des Geräts eingestellt werden, mit dem es in einem Sprachbefehl angesprochen werden soll. Es können auch mehrere Namen - getrennt durch ein Komma - angegeben werden.
Beispiel:
attr <device> rhasspyName Lampe,Stehlampe,Wunderlicht
Es ist durchaus möglich, mehrere FHEM-Geräte mit dem selben Namen zu haben. Sie müssen dann nur in unterschiedlichen Räumen sein.
rhasspyRoom
Dieses Attribut kann verwendet werden, um Rhasspy mitzuteilen, in welchem physischem (oder logischen) Raum sich das Gerät befindet.
Ist es nicht vorhanden, wird alexaRoom
oder das FHEM-Attribut <room> verwendet. Sind auch diese nicht vergeben, gehört das Gerät zum "Standard-Raum", der im Define des RHASSPY-Devices angegeben wurde.
Das Attribut ist nützlich, wenn man Sprachbefehle ohne explizite Raumangabe verwenden will. Gibt es z.B. ein Gerät mit dem Namen Lampe und dessen rhasspyRoom-Attribut ist gleich, wie die siteId von der aus der Sprachbefehl abgesetzt wird, reicht es zu sagen "Lampe ein". Der Raum muss also nicht extra dazu gesagt werden.
Es ist auch möglich, mehrere Raum-Namen zu vergeben sofern diese durch ein Komma voneinander getrennt werden.
Beispiel:
attr <device> rhasspyRoom livingroom
Hinweis: Wenn die siteId den Konventionen von Rhasspy zur Gruppierung von siteIds folgt (roomname.satellite), wird nur roomname
als Raum-Name angenommen.
If siteId follows the grouping conventions in Rhasspy ( roomname.sub-satellite), only roomname will be used as room info.
You may use a special reading following the name convention 'siteId2room_satellite' to automatically redirect any siteId to the room, indicated by ReadingVal() for this reading. See also myUtils example file (ins svn/contrib) for assigning suitable values by RHASSPY using a CustomIntent.
rhasspyGroup
Kommagetrennte Liste an Gruppen, zu denen das Gerät zugehörig ist
Beispiel:
attr <device> rhasspyGroup Lampen,Beleuchtung Arbeitsfläche,Küchen Beleuchtung
rhasspyMapping
Wenn die automatische Erkennung des richtigen Intents für ein Gerät nicht funktioniert oder nicht das gewünschte Ergebnis liefert, kann mit diesem Attribut angegeben werden, mit welchem Intent das Gerät gesteuert werden kann.
Es ist möglich, mehrere verschiedene Intents pro Gerät zu verwenden. Es muss nur einfach eine neue Zeile für ein weiteres Mapping verwendet werden.
Beispiel:
attr <device> rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response="Alles klar"
GetOnOff:currentVal=state,valueOff=off
GetNumeric:currentVal=pct,type=brightness
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness
Status:response=Die Helligkeit in der Küche ist bei [<device>:pct]
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next
Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings
Manche Intents können FHEM-Kommandos oder -Readings verwenden, um Werte auszulesen oder zu setzen.
Dabei gibt es drei Möglichkeiten, wie diese geschrieben werden können:
- Direktes Verwenden von SET-Kommando oder Reading des aktuellen Device:
cmd=on or currentReading=temperature
- Umleiten eines Kommando auf ein anderes Device oder Verwenden eines Readings aus einem anderen Gerät:
cmd=Otherdevice:on or currentReading=Otherdevice:temperature
- Perl-Code um einen Befehl auszuführen oder einen Wert zu setzen:
- Das ermöglicht sehr komplexe Anfragen.
- Der Code muss in geschwungenen Klammern sein.
{currentVal={ReadingsVal($DEVICE,"state",0)}
- oder
cmd={fhem("set $DEVICE dim $VALUE")}
- $DEVICE ist das aktuelle FHEM-device. Der SetNumeric-Intent kann $VALUE für den Wert verwenden, der gesetzt werden soll.
rhasspyChannels
Das Attribut wird vom Intent MediaControls verwendet. Es informiert den Intent darüber, welche Kanäle vorhanden sind und welcher FHEM-Befehl oder Perl-Code auszuführen ist, wenn auf den Kanal geschalten werden soll.
Eine Zeile pro Kanal.
Um rhasspyChannels zu verwenden, muss zuerst ein neues User-Attribut im FHEM-Device, das damit gesteuert werden soll, angelegt werden. Dafür kann z.B. dieses Beispiel verwendet werden: attr <deviceName> userattr rhasspyChannels:textField-long
Beispiel:
attr <device> rhasspyChannels orf eins=channel 201
orf zwei=channel 202
orf drei=channel 203
netflix=launchApp Netflix
rhasspyColors
Wird verwendet um Lichtfarben zu wechseln.
Um das Mapping zu verwenden, muss zuerst ein User-Attribut am zu steuernden Gerät angelegt werden. Z.B. attr <deviceName> userattr rhasspyChannels:textField-long
Eine Zeile pro Farbe
Beispiel:
attr lamp1 rhasspyColors rot=rgb FF0000
grün=rgb 008000
blau=rgb 0000FF
gelb=rgb FFFF00
rhasspySpecials
Currently some colour light options besides group and venetian blind related stuff is implemented, this could be the place to hold additional options, e.g. for confirmation requests. You may use several of the following lines.
key:value line by line arguments similar to rhasspyTweaks.
group
- If set, the device will not be directly addressed, but the mentioned group - typically a FHEM structure device or a HUEDevice-type group. This has the advantage of saving RF ressources and/or fits better to already implemented logics.
- Note: all addressed devices will be switched, even if they are not member of the rhasspyGroup. Each group should only be addressed once, but it's recommended to put this info in all devices under RHASSPY control in the same external group logic.
- All of the following options are optional.
async_delay
- Float nummeric value, just as async_delay in structure; the delay will be obeyed prior to the next sending command.
prio
- Numeric value, defaults to "0". prio and async_delay will be used to determine the sending order as follows: first devices will be those with lowest prio arg, second sort argument is async_delay with lowest value first.
- Beispiel:
attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights
numericValueMap
- Allows mapping of numeric values from the Value key to individual commands. Might e.g. usefull to address special positioning commands for blinds.
- Beispiel:
attr blind1 rhasspySpecials numericValueMap:10='Event Slit' 50='myPosition'
- Note: will lead to e.g. set blind1 Event Slit when numeric value 10 is received in {Value} key.
venetianBlind
attr blind1 rhasspySpecials venetianBlind:setter=dim device=blind1_slats stopCommand="set blind1_slats dim [blind1_slats:dim]"
- Explanation (one of the two arguments is mandatory):
- setter is the set command to control slat angle, e.g. positionSlat for CUL_HM or older ZWave type devices
- device is needed if the slat command has to be issued towards a different device (applies e.g. to newer ZWave type devices)
- CustomCommand arbitrary command defined by the user. Note: no variables will be evaluated. Will be executed if a regular nummeric command is detected.
- stopCommand arbitrary command defined by the user. Note: no variables will be evaluated. Will be executed if a stop command is detected.
- If set, the slat target position will be set to the same level than the main device.
colorCommandMap
- Allows mapping of values from the Color key to individual commands.
- Beispiel:
attr lamp1 rhasspySpecials colorCommandMap:0='rgb FF0000' 120='rgb 00FF00' 240='rgb 0000FF'
colorTempMap
- Allows mapping of values from the Colortemp key to individual commands.
- Works similar to colorCommandMap
colorForceHue2rgb
- Defaults to
0
. If set, a rgb command will be issued, even if the device is capable to handle hue commands. - Beispiel:
attr lamp1 rhasspySpecials colorForceHue2rgb:1
priority
- Keywords inRoom and outsideRoom can be used, each followed by comma separated types to give priority in GetNumeric. This may eleminate requests in case of several possible devices or rooms to deliver requested info type.
- Beispiel:
attr sensor_outside_main rhasspySpecials priority:inRoom=temperature outsideRoom=temperature,humidity,pressure
confirm
- This is the more granular alternative to confirmIntents key in rhasspyTweaks (including confirmIntentResponses). You may provide intent names only or <Intent>=<response> pairs like confirm: SetOnOff="$target shall be switched $Value" SetScene.
confirmValueMap
- Provide a device specific translation for $Value, e.g. for a blind type device rhasspySpecials could look like:
confirm: SetOnOff="really $Value $target" confirmValueMap: on=open off=close
scenes
attr lamp1 rhasspySpecials scenes:scene2="Kino zu zweit" scene3=Musik scene1=none scene4=none
- Explanation:
- If set, the label provided will be sent to Rhasspy instead of the tech names (derived from available setters). Keyword none will delete the scene from the internal list, setting the combination all=none will exclude the entire device from beeing recognized for SetScene.
Intents
Intents werden verwendet um FHEM zu sagen, was es nach einem erhaltenen Sprach-/Textkommand unternehmen soll. Dieses Modul stellt einige Intents bereit.
Wichtig: Bei Tags (Value, Room, Device, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen.
SetOnOff
Intent um Geräte zwischen zwei Zuständen (ein/aus, auf/zu, start/stop) zu schalten.
Beispiel-Mappings:
SetOnOff:cmdOn=on,cmdOff=off
SetOnOff:cmdOn=on,cmdOff=off,response="Sir yes Sir"
SetOnOff:cmdOn=on,cmdOff=off,response="$DEVICE now [$DEVICE:state]"
Argumente:
cmdOn
Befehl um das Gerät einzuschalten. Siehe #Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings.cmdOff
Befehl um das Gerät auszuschalten. Siehe #Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings.
Optionale Argumente:
response
Eine benutzerdefinierte Antwort auf einen Befehl
Beispiel-Sätze:
schalten das licht ein
schließe den rollladen im schlafzimmer
starte die kaffeemaschine
Beispiel Rhasspy-Sentences:
[de.fhem:SetOnOff]
(turn on|open|start){Value:on} $de.fhem.Device{Device} [$de.fhem.Room{Room}]
(turn off|close|stop){Value:off} $de.fhem.Device{Device} [$de.fhem.Room{Room}]
Verpflichtende Tags:
Value:on
und/oderValue:off
Device
Optionale Tags:
Room
SetOnOffGroup
Intent um Gruppen von Geräte zwischen zwei Zuständen zu schalten.
Dafür ist ein SetOnOff-Mapping benötigt und alle gewünschten Geräte müssen dasselbe Attribut group
oder rhasspyGroup
haben.
Beispiel-Sätze:
schalte alle lampen in der küche aus
schließe alle rollläden im schlafzimmer
schalte alle lampen aus
Beispiel Rhasspy-Sentences:
[de.fhem:SetOnOffGroup]
(schalte|öffne{Value:on}) alle $de.fhem.Group{Group} (:){Room:global} ([$de.fhem.Room{Room}]) [ein{Value:on}]
(schalte|schließe{Value:off}) alle $de.fhem.Group{Group} (:){Room:global}([$de.fhem.Room{Room}]) [aus{Value:off}]
Verpflichtende Tags:
Value:on und/oder Value:off
Group
Optionale Tags:
Room
SetTimedOnOff
Intent um Geräte für eine bestimmte Zeitspanne in einen bestimmten Zustand zu versetzten.
Device muss ein SetOnOff-Mapping haben und die SetExtentions unterstützen.
Beispiel-Sätze:
schalte das licht für eine minute und dreißig sekunden aus
schalte die musik im bad bis zwei uhr ein
Beispiel Rhasspy-Sentences:
[de.fhem:SetTimedOnOff]
schalte $de.fhem.Device{Device} [$de.fhem.Room{Room}] für ([(1..60){Hour!int} (stunde|stunden)] [und] [(1..60){Min!int} (minute|minuten)] [und] [(1..60){Sec!int} (sekunde|sekunden)]) (ein{Value:on}|aus{Value:off})
schalte $de.fhem.Device{Device} [$de.fhem.Room{Room}] bis (0..24){Hourabs!int} [(1..60){Min!int}] (ein{Value:on}|aus{Value:off})
Verpflichtende Tags:
Value
Device
Hour oder Min oder Sec oder Hourabs
Optionale Tags:
Room