RHASSPY: Unterschied zwischen den Versionen

Aus FHEMWiki
(Installation auf reguläres update angepaßt)
 
(54 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Baustelle}}
{{Baustelle}}
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 10_RHASSPY.pm.
{{Infobox Modul
{{Infobox Modul
|ModPurpose=Anbindung von FHEM an den Rhasspy Sprachassistenten
|ModPurpose=Anbindung von FHEM an den Rhasspy Sprachassistenten
Zeile 9: Zeile 10:
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]]), drhirn ({{Link2FU|15727|Forum}}/[[Benutzer Diskussion:Drhirn|Wiki]])
|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.
[[File:Rhasspy_fhem.png|thumb|right|Schematische Darstellung von Rhasspy und FHEM/RHASSPY]]
== Einleitung ==
[https://github.com/rhasspy/rhasspy Rhasspy] ist eine Open Source Server-Lösung für Spracherkennung und Sprachsteuerung, welche auf einem RaspBerry Pi oder einem anderen Debian-basierten Serversystem lauffähig ist. Es handelt sich dabei um eine Sammlung von Programmen (=Skripten in der Python-Sprechweise), die unter einer einheitlichen und sehr  flexiblen Benutzungsoberfläche zusammengefasst sind. Die Besonderheit an Rhasspy ist, dass es nach der Installation komplett offline betrieben werden kann. 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 19: Zeile 20:
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.
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.
RHASSPY verwendet das Modul 00_MQTT2_CLIENT.pm um Nachrichten zu empfangen und zu senden. Daher ist es notwendig, eine Instanz dieses Moduls als FHEM-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!
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!


{{Hinweis| In diesem Artikel und der Commandref werden folgende Schreibweisen verwendet:
=== Konventionen ===
* '''[[RHASSPY]]''' bezieht sich auf das FHEM-Modul oder das FHEM-Device
{{Hinweis| In diesem Artikel und der CommandRef werden folgende Schreibweisen verwendet:
* '''Rhasspy''' bezeichnet die (zentrale) Installation bzw. das Web-Interface, unter dem die Scriptsammlung verwaltet werden kann.}}
* '''[[RHASSPY]]''' bezieht sich auf das FHEM-Modul
* '''rhasspy''' bezieht sich auf das das FHEM-Device
* '''Rhasspy''' bezeichnet die (zentrale) Serverinstallation}}


{{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 ===
Die Installation und Erstinbetriebnahme von Rhasspy wird in einer Schnellstart-Anleitung erklärt: [[RHASSPY/Schnellstart]] Diese Anleitung sollte auch befolgt werden, wenn man sich sehr gut mit FHEM auskennt. Wer dies erfolgreich absolviert hat, kann gleich zu Abschnitt [[#Set-Befehle_.28SET.29|Set-Befehle (SET)]] weiterspringen, und/oder die [[RHASSPY/Vertiefung|Vertiefung]] durcharbeiten.


== Erste Schritte ==
=== Details zur Verwaltung des RHASSPY Moduls ===
Für Einsteiger in das Thema Rhasspy bzw. RHASSPY gibt es eine Schnellstart-Anleitung, welche die ersten grundlegenden Schritte einfach erklärt: [[RHASSPY/Schnellstart]]
Das Modul ist seit September 2022 im regulären FHEM-update enthalten.
 
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:
<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.
 
 
=== 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:
<syntaxhighlight lang="text">update add https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt</syntaxhighlight>
 
Anschließend kann mit folgendem Befehl das Modul installiert oder aktualisiert werden:
<syntaxhighlight lang="text">update all https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt</syntaxhighlight>
 
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 [https://fhem.de/commandref.html#update CommandRef] oder im [[Update|FHEM-Wiki]].
 
Nach Installation des Moduls muss FHEM neu gestartet werden.
 


== Einrichtung MQTT2_CLIENT ==
== Einrichtung MQTT2_CLIENT ==
Zeile 70: Zeile 43:


Zuerst muss ein MQTT2_CLIENT Device erstellt werden, welches sich mit dem MQTT-Server (Mosquitto) von Rhasspy verbindet:
Zuerst muss ein MQTT2_CLIENT Device erstellt werden, welches sich mit dem MQTT-Server (Mosquitto) von Rhasspy verbindet:
<syntaxhighlight lang="text">define <deviceName> MQTT2_CLIENT <ip-oder-hostname-des-mqtt-servers>:<port></syntaxhighlight>
<syntaxhighlight lang="perl">define <deviceName> MQTT2_CLIENT <ip-oder-hostname-des-mqtt-servers>:<port></syntaxhighlight>




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 <code>RHASSPY</code>. Ansonsten müssen noch alle anderen Devices (z.B. <code>MQTT_GENERIC_BRIDGE</code>, <code>MQTT2_DEVICE</code>) angegeben werden.
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 <code>RHASSPY</code>. Ansonsten müssen noch alle anderen Devices (z.B. <code>MQTT_GENERIC_BRIDGE</code>, <code>MQTT2_DEVICE</code>) angegeben werden.
<syntaxhighlight lang="text">attr <deviceName> clientOrder RHASSPY [device2] [device3]</syntaxhighlight>
<syntaxhighlight lang="perl">attr <deviceName> clientOrder RHASSPY [device2] [device3]</syntaxhighlight>
 


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 <code>setByTheProgram</code>. Ansonsten müssen alle für RHASSPY notwendigen Topics eingefügt werden.
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 <code>setByTheProgram</code>. Ansonsten müssen alle für RHASSPY notwendigen Topics eingefügt werden.
<syntaxhighlight lang="text">attr <deviceName> subscriptions setByTheProgram</syntaxhighlight>
<syntaxhighlight lang="perl">attr <deviceName> subscriptions setByTheProgram</syntaxhighlight>
bzw.
bzw.
<syntaxhighlight lang="text">attr <deviceName> subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected</syntaxhighlight>
<syntaxhighlight lang="perl">attr <deviceName> subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected hermes/hotword/toggleOn    hermes/hotword/toggleOff hermes/tts/say</syntaxhighlight>
 


;Beispiele
;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.
* 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.
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183
attr rhasspyMQTT2 clientOrder RHASSPY
attr rhasspyMQTT2 clientOrder RHASSPY
attr rhasspyMQTT2 subscriptions setByTheProgram
attr rhasspyMQTT2 subscriptions setByTheProgram
</syntaxhighlight>
</syntaxhighlight>
*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.
* 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.
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
defmod rhasspyMQTT2 MQTT2_CLIENT 192.168.1.122:1884
defmod rhasspyMQTT2 MQTT2_CLIENT 192.168.1.122:1884
attr rhasspyMQTT2 clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE
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]
attr rhasspyMQTT2 subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected hermes/hotword/toggleOn hermes/hotword/toggleOff hermes/tts/say [zusätzliche Subscriptions für andere MQTT-Module]
</syntaxhighlight>
</syntaxhighlight>


== Definition von RHASSPY (DEF)==
== Definition von RHASSPY (DEF)==
<syntaxhighlight lang="text">define <name> RHASSPY <baseUrl> <devspec> <defaultRoom> <language> <fhemId> <prefix> <useGenericAttrs> <handleHotword> <encoding></syntaxhighlight>
<syntaxhighlight lang="perl">define <name> RHASSPY <baseUrl> <devspec> <defaultRoom> <siteId> <language> <fhemId> <prefix> <useGenericAttrs> <handleHotword> <autoTraining> <encoding></syntaxhighlight>
{{Randnotiz|RNTyp=Info|RNText=RHASSPY verwendet sehr oft <parseParams>. Nicht nur im Define, sondern z.B. auch, um Attribut-Werte auszuwerten. Es sollten also alle Parameter im Define in der Form key=value angegeben werden.).}}{{Randnotiz|RNTyp=Info|RNText=RHASSPY führt jede Menge Daten aus unterschiedlichen Quellen zusammen um seine Funktion erfüllen zu können. Die endgültige Daten-Struktur, die RHASSPY verwendet, kann mittels des [[List|list]]-Kommandos angezeigt werden. Es wird empfohlen, sich diese Daten-Struktur auf jeden Fall anzusehen. Vor allem dann, wenn etwas nicht wie gewünscht funktioniert.}}
{{Randnotiz|RNTyp=Info|RNText=RHASSPY verwendet sehr oft <parseParams>. Nicht nur im Define, sondern z.B. auch, um Attribut-Werte auszuwerten. Es sollten also alle Parameter im Define in der Form key=value angegeben werden.).}}{{Randnotiz|RNTyp=Info|RNText=RHASSPY führt jede Menge Daten aus unterschiedlichen Quellen zusammen um seine Funktion erfüllen zu können. Die endgültige Daten-Struktur, die RHASSPY verwendet, kann mittels des [[List|list]]-Kommandos angezeigt werden. Es wird empfohlen, sich diese Daten-Struktur auf jeden Fall anzusehen. Vor allem dann, wenn etwas nicht wie gewünscht funktioniert.}}
Alle Parameter sind '''optional'''. Die meisten werden im Normalfall gar nicht benötigt (z.B. <code>fhemId</code>, <code>prefix</code>). 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 <code>language</code>, möchte man eine andere Sprache als Englisch oder Deutsch verwenden.
Alle Parameter sind '''optional'''. Die meisten werden im Normalfall gar nicht benötigt (z.B. <code>fhemId</code>, <code>prefix</code>), oder können auf den automatisch vergebenen Werten belassen werden. 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 <code>language</code>, möchte man eine andere Sprache als Englisch oder Deutsch verwenden und <code>siteId</code>, das für Tests und andere Text-Eingabemöglichkeiten wichtig ist.
 
=== 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 <code>baseUrl=http://127.0.0.1:12101</code>.
 
=== devspec ===
''devspec'' der Geräte, die mit Rhasspy gesteuert werden sollen. Wenn der ''genericDeviceType''-Support aktiviert ist, ist der Default <code>devspec=genericDeviceType=.+</code>, sonst wird <code>devspec=room=Rhasspy</code> 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. <code>devspec=room=livingroom,room=bathroom,bedroomlamp</code>) verwendet werden können, finden sich in der [https://commandref.fhem.de/commandref.html#devspec 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 <code>defaultRoom=default</code>.
 
=== language ===
Sprache, in der mit Rhasspy gesprochen wird. Der Standard-Wert hängt vom ''global''-Device ab. Dieser ist standardmäßig <code>language=en</code>.
 
=== 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 <code>fhemId=fhem</code>.
{{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}}
 
=== siteId ===
Wenn bestimmte Funktionen genutzt werden sollen, muss die RHASSPY-Instanz für Rhasspy als ''Satellit'' eigenständig angesprochen werden können. Hierzu muss dann eine eindeutige Kennung vergeben werden, und diese ist insbesondere dann auch in der für die Intent Recognition zuständigen Rhasspy-Komponente als Satellit anzugeben. Wird diese nicht explizit gesetzt, wird diese aus dem ''language''-Kürzel und der ''fhemId'' zusammengesetzt.
{{Hinweis|Für die Funktionalitäten ''test_sentence'', ''test_file'', ''msgDialog'' und ''AMAD.*'' ist es '''zwingend erforderlich''', die siteId in der Rhasspy-Intent-Recognition-Komponente einzutragen!}}
 
=== 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 <code>prefix=rhasspy</code>.
 
=== 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 und die automatisierte Eigenschaftenerkennung. Default ist <code>useGenericAttrs=1</code>.
 
=== encoding ===
Sollte es Probleme mit Umlauten geben, kann das Character-Encoding geändert werden. Default ist <code>encoding=utf8</code>.


=== 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|''rhasspyHotwords'']]. Default ist <code>handleHotword=0</code>


;<code id="def-baseurl">baseUrl</code>
=== autoTraining ===
: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 <code>baseUrl=http://127.0.0.1:12101</code>.
Da Änderungen auf der FHEM-Seite (z.B. bei Änderungen der rhasspyNames) auch Rhasspy bekannt gemacht werden müssen und anschließend ein Training erfolgen muss, damit Rhasspy diese Änderugnen ebenfalls berücksichtigt, übergibt RHASSPY derartige Änderungen nach Ablauf von einer Minute seit der letzten Änderung an Rhasspy und initiiert dann ein Training. Setzt man diesen Schlüssel auf "0", wird diese Funktion deaktiviert, alle anderen numerischen Werte werden als Änderung dieses Timeouts (in Sekunden) interpretiert
;<code id="def-devspec">devspec</code>
Default ist <code>autoTraining=60</code>
:devspec der Geräte, die mit Rhasspy gesteuert werden sollen. Wenn der ''genericDeviceType''-Support aktiviert ist, ist der Default <code>devspec=genericDeviceType=.+</code>, sonst wird <code>devspec=room=Rhasspy</code> 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. <code>devspec=room=livingroom,room=bathroom,bedroomlamp</code>) verwendet werden können, finden sich in der [https://commandref.fhem.de/commandref.html#devspec CommandRef].
;<code id="def-defaultroom">defaultRoom</code>
: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 <code>defaultRoom=default</code>.
;<code id="def-language">language</code>
:Sprache, in der mit Rhasspy gesprochen wird. Der Standard-Wert hängt vom ''global''-Device ab. Dieser ist standardmäßig <code>language=en</code>.
;<code id="def-fhemid">fhemId</code>
: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 <code>fhemId=fhem</code>.
;<code id="def-prefix">prefix</code>
: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 <code>prefix=rhasspy</code>.
;<code id="def-usegenericattrs">'''useGenericAttrs'''</code>
:Ü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 <code>useGenericAttrs=1</code>.
;<code id="def-encoding">encoding</code>
:Sollte es Probleme mit Umlauten geben, kann das Character-Encoding geändert werden. Default ist <code>encoding=utf8</code>.
;<code id="handlehotword">handleHotword</code>
:Triggert das Reading ''hotword'', wenn ein Hotword erkannt wurde (und erstellt das Reading, falls noch nicht vorhanden). Weitere Informationen dazu stehen beim Attribut [[#attr-rhasspyhotwords|''rhasspyHotwords'']]. Default ist <code>handleHotword=0</code>


{{Hinweis|Nach dem Definieren eines RHASSPY-Modules sollte das IODev manuell gesetzt werden um ein automatische IO-Zuweisung zu verhindern. Z.B. <code>attr <deviceName> IODev <m2client></code>.}}
{{Hinweis|Nach dem Definieren eines RHASSPY-Modules sollte das IODev manuell gesetzt werden um ein automatische IO-Zuweisung zu verhindern. Z.B. <code>attr <deviceName> IODev <m2client></code>.}}


;Beispiele:
;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:
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:
<syntaxhighlight lang="text">define Rhasspy RHASSPY</syntaxhighlight>
<syntaxhighlight lang="perl">define Rhasspy RHASSPY</syntaxhighlight>


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:
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:
<syntaxhighlight lang="text">define Rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 defaultRoom="Büro Lisa" language=de devspec=genericDeviceType=.+,device_a1,device_xy handleHotword=1</syntaxhighlight>
<syntaxhighlight lang="perl">define Rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 defaultRoom="Büro Lisa" language=de devspec=genericDeviceType=.+,device_a1,device_xy handleHotword=1</syntaxhighlight>


== Set-Befehle (SET) ==


==Set-Befehle (SET)==
=== customSlot ===
Erstellt einen neuen - oder überschreibt einen alten - Slot in Rhasspy
* <code>slotname</code> und <code>slotdata</code> sind verpflichtend
* <code>overwrite</code> ist optional. Default ist <code>overwrite=true</code>. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.
* <code>training</code> ist optional. Default ist <code>training=true</code>. Das Setzen eines anderen Wertes verhindert ein Training von Rhasspy nach dem Speichern des Slots.


;<code id="set-customslot">customSlot</code>
'''Beispiele:'''
:Erstellt einen neue - oder überschreibt einen alten - Slot in Rhasspy
:<code>slotname</code> und <code>slotdata</code> sind verpflichtend
:<code>overwrite</code> ist optional. Default ist <code>overwrite=true</code>. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.
:<code>training</code> ist optional. Default ist <code>training=true</code>. Das Setzen eines anderen Wertes verhindert ein Training von Rhasspy nach dem Speichern des Slots.
 
:'''Beispiele:'''
:<code>set <rhasspyDevice> customSlot mySlot a,b,c overwrite training</code>
:<code>set <rhasspyDevice> customSlot mySlot a,b,c overwrite training</code>
:<code>set <rhasspyDevice> customSlot slotname=mySlot slotdata=a,b,c overwrite=false</code>
:<code>set <rhasspyDevice> customSlot slotname=mySlot slotdata=a,b,c overwrite=false</code>




;<code id="set-fetchsiteids">fetchSiteIds</code>
=== 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.
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.).
Muss immer ausgeführt werden, wenn eine neue siteId in Rhasspy hinzugefügt wird (neuer Satellit z.B.).
:'''Beispiel:'''
'''Beispiel:'''
:<code>set <rhasspyDevice> fetchSiteIds</code>
:<code>set <rhasspyDevice> fetchSiteIds</code>




;<code id="set-play">play</code>
=== play ===
:Sendet eine WAV Datei an Rhasspy.
Sendet eine WAV Datei an Rhasspy, <code>siteId</code> und <path> sind verpflichtend!
:<code>siteId</code> 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.
Optional kann die Anzahl der Wiederholungen (Default: 1) und die Dauer der Pause zwischen den jeweiligen Wiederholungen (Default: 15) angeben werden.
:''Beispiele:'''
''Beispiele:'''
:<code>set <rhasspyDevice> play siteId="default" path="/opt/fhem/test.wav"</code>
:<code>set <rhasspyDevice> play siteId="default" path="/opt/fhem/test.wav"</code>
:<code>set <rhasspyDevice> play siteId="default" path="./test.wav" repeats=3 wait=20</code>
:<code>set <rhasspyDevice> play siteId="default" path="./test.wav" repeats=3 wait=20</code>




;<code id="set-speak">speak</code>
=== speak ===
:Sendet einen Text an das TTS-Sytem, welches ihn dann als Sprache ausgibt.
Sendet einen Text an das TTS-Sytem, welches ihn dann als Sprache ausgibt.
:Beide Argumente <code>siteId</code> und <code>text</code> sind verpflichtend!
 
:'''Beispiel:'''
Beide Argumente <code>siteId</code> und <code>text</code> sind verpflichtend!
 
'''Beispiel:'''
:<code>set <rhasspyDevice> speak siteId="wohnzimmer" text="This is a test"</code>
:<code>set <rhasspyDevice> speak siteId="wohnzimmer" text="This is a test"</code>


=== textCommand ===
Sendet ein Text-Kommando an Rhasspy.


;<code id="set-textcommand">textCommand</code>
'''Beispiel:'''
:Sendet ein Text-Kommando an Rhasspy.
:'''Example:'''
:<code>set <rhasspyDevice> textCommand schalte das licht ein</code>
:<code>set <rhasspyDevice> textCommand schalte das licht ein</code>
Mangels siteId erfolgt hier keine Rückmeldung zum ausgeführten Kommando.


=== trainRhasspy ===
Startet das Training von Rhasspy.


;<code id="set-trainrhasspy">trainRhasspy</code>
'''Beispiel:'''
:Startet das Training von Rhasspy.
:'''Beispiel:'''
:<code>set <rhasspyDevice> trainRhasspy</code>
:<code>set <rhasspyDevice> trainRhasspy</code>


=== update ===
''update'' kennt diverse Abstufungen:
==== 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.) und ein Training zu starten. Wenn [[#autoTraining|autoTraining]] nicht deaktiviert wurde, erfolgt dies bei Änderungen an relevanten Attributen nach einiger Zeit zwar automatisch, über diesen Befehl kann aber sichergestellt werden, dass dies unmittelbar und ohne Vergleich mit Alt-Daten erfolgt.
''Beispiel:'''
:<code>set <rhasspyDevice> update devicemap</code>
==== update devicemap_only ====
Aktualisiert die Datenstruktur von RHASSPY. Es werden weder Slots in Rhasspy geändert, noch das Training gestartet.
'''Beispiel:'''
:<code>set <rhasspyDevice> update devicemap_only</code>
==== update 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  (Hinweis: Die ersten beiden Teile ''de'' und ''fhem'' hängen von der DEF des RHASSPY-Devices ab)
* de.fhem.Device
* de.fhem.Device-''genericDeviceType''
* de.fhem.Device-''Intent''
* de.fhem.Group
* de.fhem.Room
* de.fhem.MediaChannels
* de.fhem.Color
* de.fhem.NumericType
'''Beispiel:'''
:<code>set <rhasspyDevice> update slots</code>
==== slots_no_training ====
Wie <code>slots</code>, aber ohne Training nach dem Update.
'''Beispiel:'''
:<code>set <rhasspyDevice> update slots_no_training</code>
==== update language ====
Liest das das Sprach-File (''languageFile'') neu ein.


;<code id="set-update">update</code>
Muss immer ausgeführt werden, wenn in diesem File oder dem Attribut ''languageFile'' etwas geändert wurde!
:;<code id="set-update-devicemap">devicemap</code>
::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:'''
::<code>set <rhasspyDevice> update devicemap</code>


:;<code id="set-update-devicemaponly">devicemap_only</code>
'''Beispiel:'''
::Aktualisiert die Datenstruktur von RHASSPY. Es werden weder Slots in Rhasspy geändert, noch das Training gestartet.
:<code>set <rhasspyDevice> update language</code>
::'''Beispiel:'''
::<code>set <rhasspyDevice> update devicemap_only</code>


:;<code id="set-update-slots">slots</code>
==== update intent_filter ====
::Aktualisiert (bzw. erstellt) alle Slots in Rhasspy mit den aktuellen Geräten, Räumen, usw.
Setzt die Intent Filter, die vom Rhasspy Dialogue Manger verwendet werden zurück. Details dazu bei [[#intentFilter|intentFilter]] im ''rhasspyTweaks''-Attribut.
::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:'''
::<code>set <rhasspyDevice> update slots</code>


:;<code id="set-update-slotsnotraining">slots_no_training</code>
'''Beispiel:'''
::Wie <code>slots</code>, aber ohne Training nach dem Update.
:<code>set <rhasspyDevice> update intent_filter</code>
::'''Beispiel:'''
::<code>set <rhasspyDevice> update slots_no_training</code>


:;<code id="set-update-language">language</code>
==== update all ====
::Liest das das Sprach-File (''languageFile'') neu ein.
Aktualisiert die Devicemap und das languageFile
::Muss immer ausgeführt werden, wenn in diesem File oder dem Attribut ''languageFile'' etwas geändert wurde!
::'''Beispiel:'''
::<code>set <rhasspyDevice> update language</code>


:;<code id="set-udpate-intentfilter">intent_filter</code>
'''Beispiel:'''
::Setzt die Intent Filter, die vom Rhasspy Dialogue Manger verwendet werden zurück. Details dazu bei [[#attr-rhasspytweaks-intentfilter|intentFilter]] im ''rhasspyTweaks''-Attribut.
:<code>set <rhasspyDevice> update all</code>
::'''Beispiel:'''
::<code>set <rhasspyDevice> update intent_filter</code>


:;<code id="set-update-all">all</code>
::Aktualisiert die Devicemap und das languageFile
::'''Beispiel:'''
::<code>set <rhasspyDevice> update all</code>


=== volume ===
Stellt die Lautstärke der gewünschten siteId auf einen Wert zwischen 0 and 1 (float). Beide Argumente <code>siteId</code> <code>volume</code> sind verpflichtend.


;<code id="set-volume">volume</code>
'''Beispiel:'''
::Stellt die Lautstärke der gewünschten siteId auf einen Wert zwischen 0 and 1 (float).
::Beide Argumente <code>siteId</code> <code>volume</code> sind verpflichtend.
::'''Beispiel:'''
::<code>set <rhasspyDevice> siteId="default" volume="0.5"</code>
::<code>set <rhasspyDevice> siteId="default" volume="0.5"</code>


{{Hinweis|Bitte nicht vergessen, dass nach jeder Änderung an RHASSPY oder an einem von RHASSPY gesteuerten Gerät ein <code>update devicemap</code> ausgeführt werden muss!}}
{{Hinweis|Bitte nicht vergessen, dass nach jeder Änderung an RHASSPY oder an einem von RHASSPY gesteuerten Gerät ein <code>update devicemap</code> ausgeführt werden sollte, v.a. wenn das [[#autoTraining|autoTraining]] in der DEF deaktiviert wurde!}}
 
== Get-Befehle (GET) ==
=== export_mapping ===
Liefert für das angegebene Device ein "klassisches" ''rhasspyMapping'', das dann als Basis für eigene Weiterentwicklungen genutzt werden kann. Funktioniert ggf. nicht in allen Fällen (z.B. bei ''SetScene'' und dem Szenen-Format für ''HUEBridge'').
 
=== test_file ===
Anzugeben ist der Dateiname (einschl. Pfad)
 
Die Datei wird zeilenweise eingelesen und an die Rhasspy-Komponente für die Intent-Erkennung übergeben. Das Ergebnis der Analyse wird in eine File geschrieben, die auf '_result.txt' endet. ''stop'' als Dateiname unterbricht einen laufenden Test. Die ggf. abgeleiteten Kommandos werden nicht ausgeführt, FHEM wird während eines laufende Tests auch keine anderen Kommandos von der Rhasspy-Seite her annehmen.
Für diese Funktion ist es zwingend erforderlich, dass die ''siteId'' der RHASSPY-Instanz bei der Intent-Recognition-Komponente in Rhasspy als Satellit angegeben wurde.
 
=== test_sentence ===
Es kann ein beliebiger einzelner Satz eingegeben werden, die Ausgabe erfolgt dann in einem eigenen Dialogfeld, ansonsten gilt sinngemäß dasselbe wie bei ''test_file''.


==Attribute (ATTR)==
==Attribute (ATTR)==
Zeile 242: Zeile 253:
*Attribute, die in den Devices gesetzt werden müssen, die von RHASSPY kontrolliert werden sollen.
*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.
Letztere werden im Abschnitt [[#FHEM-Devices für die Verwendung mit Rhasspy konfigurieren|FHEM-Devices für die Verwendung mit Rhasspy konfigurieren]] behandelt.


In diesem Abschnitt werden die Attribute behandelt, die auf das RHASSPY-Device selbst wirken.
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:'''
<code>attr <rhasspyDevice> IODev rhasspyMQTT2</code>


;<code id="attr-iodev">IODev</code>
===forceNEXT===
:Das MQTT2_CLIENT Device, welches die MQTT-Nachrichten für RHASSPY liefert.
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.
:'''Beispiel:'''
Standardmäßig werden diese Nachrichten nicht weitergeleitet um eine bessere Kompatibilität mit dem ''autocreate''-Feature des MQTT2_DEVICE sicher zu stellen.
:<code>attr <rhasspyDevice> IODev rhasspyMQTT2</code>
Siehe dazu das {{Link2CmdRef|Anker=MQTT2_CLIENT-attr-clientOrder|Lang=en|Label=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 <code>0</code>
;<code id="attr-forcenext">forceNext</code>
: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 {{Link2CmdRef|Anker=MQTT2_CLIENT-attr-clientOrder|Lang=en|Label=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 <code>0</code>
 
:'''Beispiel:'''
:<code>attr <rhasspyDevice> forceNext 1</code>


'''Beispiel:'''
<code>attr <rhasspyDevice> forceNext 1</code>


;<code id="attr-languagefile">languageFile</code>
===languageFile===
:Pfad zur Sprach-Datei
{{Randnotiz|RNTyp=g|RNText=Bei Nutzung von configDB wird diese Datei aus der Datenbank gelesen.}}
:Ist dieses Argument nicht gesetzt, wird ein Standard-Set an englischen Sätzen für die Sprachantworten verwendet.
Pfad zur Sprach-Datei
:Die Datei selbst muss ein gültiges JSON-File sein, dass sich nach der Struktur aus den englischen Standardwerten richtet.
Ist dieses Argument nicht gesetzt, wird ein Standard-Set an englischen Sätzen für die Sprachantworten verwendet.
:Eine deutsche Beispiel-Datei ist in [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/RHASSPY/rhasspy-de.cfg SVN] und [https://github.com/fhem/fhem-rhasspy/blob/dev/FHEM/rhasspy-de.cfg GitHub] vorhanden. Man kann aber einfach ein Dump der englischen Struktur machen (replace RHASSPY by your device's name: <code>{toJSON($defs{RHASSPY}->{helper}{lng})}</code>, das Ergebnis dann bearbeiten und es als eigenes languageFile verwenden.
Die Datei selbst muss ein gültiges JSON-File sein, dass sich nach der Struktur aus den englischen Standardwerten richtet.
:Im Standard-Set sind auch einige Variablen enthalten. Auch die können im eigenen File verwendet werden.
Eine deutsche Beispiel-Datei ist im [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/RHASSPY/rhasspy-de.cfg SVN] vorhanden. Man kann aber einfach ein Dump der englischen Struktur machen (replace RHASSPY by your device's name: <code>{toJSON($defs{RHASSPY}->{helper}{lng})}</code>, das Ergebnis dann bearbeiten und es als eigenes languageFile verwenden.
: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.
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):
'''Beispiel:''' (vorausgesetzt, die Sprach-Datei ist im selben Verzeichnis wie fhem.pl):
:<code>attr <rhasspyDevice> languageFile ./rhasspy-de.cfg</code>
<code>attr <rhasspyDevice> languageFile ./rhasspy-de.cfg</code>




;<code id="attr-response">response</code>
====response====
:'''Hinweis:''': Die Verwendung dieses Attributs ist nicht mehr empfohlen. Bessere Alternative ist die Sprach-Datei.
{{Hinweis|Die Verwendung dieses Attributs ist nicht mehr empfohlen. Bessere Alternative ist die Sprach-Datei.}}
<!--
<!--
:Mit diesem Attribut können eigene Standardantworten definiert werden.
Mit diesem Attribut können eigene Standardantworten definiert werden.
:Mögliche Schlüsselwörter sind <code>DefaultError</code>, <code>NoActiveMediaDevice</code> und <code>DefaultConfirmation</code>.
Mögliche Schlüsselwörter sind <code>DefaultError</code>, <code>NoActiveMediaDevice</code> und <code>DefaultConfirmation</code>.


:'''Beispiel:'''
'''Beispiel:'''
:<syntaxhighlight lang="text">DefaultError=
<syntaxhighlight lang="perl">DefaultError=
DefaultConfirmation=Klaro, mach ich</syntaxhighlight>
DefaultConfirmation=Klaro, mach ich</syntaxhighlight>
-->
-->


 
===rhasspyHotwords===
;<code id="attr-rhasspyhotwords">rhasspyHotwords</code>
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.}}
:'''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
   
   
:'''Beispiele:'''
'''Beispiele:'''
:<code>bumblebee_linux = set amplifier2 mute on</code>
:<code>bumblebee_linux = set amplifier2 mute on</code>
:<code>porcupine_linux = livingroom="set amplifier mute on" default={Log3($DEVICE,3,"device $DEVICE - room $ROOM - value $VALUE")}</code>
:<code>porcupine_linux = livingroom="set amplifier mute on" default={Log3($DEVICE,3,"device $DEVICE - room $ROOM - value $VALUE")}</code>


:Im ersten Beispiel wird der Befehl immer ausgeführt, wenn das Hotword ''bumblebee_linux'' erkannt wurde.
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.
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.
$DEVICE wird ausgewertet als der Name des RHASSPY Devices, $ROOM als siteId und $VALUE als das verwendete Hotword.


 
===rhasspyIntents===
;<code id="attr-rhasspyintents">rhasspyIntents</code>
Definiert einen benutzerdefinierten Intent.
:Definiert einen benutzerdefinierten Intent.
Ein Intent pro Zeile.
:Ein Intent pro Zeile.
'''Beispiel:'''
:'''Beispiel:'''
:<code>attr <rhasspyDevice> rhasspyIntents SetCustomIntentsTest=SetCustomIntentsTest(siteId,Type)</code>
:<code>attr <rhasspyDevice> rhasspyIntents SetCustomIntentsTest=SetCustomIntentsTest(siteId,Type)</code>
:in Kombination mit folgendem myUtils-Code
in Kombination mit folgendem myUtils-Code
:<syntaxhighlight lang="perl">
<syntaxhighlight lang="perl">
sub SetCustomIntentsTest {
sub SetCustomIntentsTest {
my $room = shift;
my $room = shift;
Zeile 316: Zeile 323:
return "RHASSPY: Room $room, Type $type";
return "RHASSPY: Room $room, Type $type";
}</syntaxhighlight>
}</syntaxhighlight>
:schreibt einen Log-Eintrag nach jedem Aufruf dieses Intents.
schreibt einen Log-Eintrag nach jedem Aufruf dieses Intents.
:Die folgenden Argumente können dabei übergeben werden:
 
:*NAME => Name des RHASSPY-Devices
Die folgenden Argumente können dabei übergeben werden:
:*DATA => komplette JSON-$data (wie intern geparsed), in JSON kodiert
* NAME => Name des RHASSPY-Devices
:*siteId, Device etc. => jedes Element, das in JSON-$data existiert
* DATA => komplette JSON-$data (wie intern geparsed), in JSON kodiert
: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.
* siteId, Device etc. => jedes Element, das in JSON-$data existiert
:Es kann aber auch ein HASH oder ARRAY übergeben werden.
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.
: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.
Es kann aber auch ein '''HASH''' oder '''ARRAY''' übergeben werden.
:Siehe dazu auch den Abschnitt [[#Eigene Intents erstellen]].
* Im Falle eines '''ARRAY'''s 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|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|Eigene Intents erstellen]].


;<code id="attr-rhasspyshortcuts">rhasspyShortcuts</code>
===rhasspyShortcuts===
:Hiermit können benutzerdefinierte Sätze erstellt werden ohne die sentences.ini in Rhasspy bearbeiten zu müssen.
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 <code>updateSlots</code> [[#set-update|Set]]-Kommando ausgeführt wird.
Diese Shortcuts werden zu Rhasspy hochgeladen, sobald das <code>updateSlots</code> [[#set-update|Set]]-Kommando ausgeführt wird.
:Ein Shortcut pro Zeile, Syntax ist entweder einfach oder erweitert.
Ein Shortcut pro Zeile, Syntax ist entweder einfach oder erweitert.
:'''Beispiele:'''
'''Beispiele:'''
:<code>mute on=set amplifier2 mute on</code>
:<code>mute on=set amplifier2 mute on</code>
:<code>lamp off={fhem("set lampe1 off")}</code>
:<code>lamp off={fhem("set lampe1 off")}</code>
Zeile 338: Zeile 348:
:<code>i="schalte den ton aus" p={fhem ("set $NAME mute off")} n=amplifier2 c="soll ich den ton wirklich ausschalten?"</code>
:<code>i="schalte den ton aus" p={fhem ("set $NAME mute off")} n=amplifier2 c="soll ich den ton wirklich ausschalten?"</code>
:<code>i="ich hab hunger" f="set Herd on" d="Herd" c="möchtest du schweinsbraten?"</code>
:<code>i="ich hab hunger" f="set Herd on" d="Herd" c="möchtest du schweinsbraten?"</code>
:Erklärung zu den Abkürzungen:
:*<code>i</code> => intent
::Zeilen, die mit <code>i</code> beginnen, werden als erweiterte Syntax interpretiert. Soll die erweiterte Syntax verwendet werden, ist das <code>i</code> also Pflicht!
:*<code>f</code> => FHEM Befehl
::Syntax wie von der FHEM Kommandozeile gewohnt
:*<code>p</code> => Perl Befehl
::Syntax wie von der FHEM Kommandozeile gewohnt, eingerahmt in geschwungenen Klammern (<code>{}</code>). <code>p</code> hat Vorrang vor <code>f</code>
:*<code>d</code> => 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.
:*<code>r</code> => Response
::Sprachanwort, die ausgegeben wird. Ist <code>r</code> 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 <code>i="what's the time for sunrise" r="at [Astro:SunRise] o'clock"</code> gültig.
::Mit den folgenden Abkürzungen kann auch nach einer Bestätigung für den Befehl gefragt werden:
::*<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>.
::Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen.


Erklärung zu den Abkürzungen:
* <code>i</code> => intent
Zeilen, die mit <code>i</code> beginnen, werden als erweiterte Syntax interpretiert. Soll die erweiterte Syntax verwendet werden, ist das <code>i</code> also Pflicht!
* <code>f</code> => FHEM Befehl
Syntax wie von der FHEM Kommandozeile gewohnt
* <code>p</code> => Perl Befehl
Syntax wie von der FHEM Kommandozeile gewohnt, eingerahmt in geschwungenen Klammern (<code>{}</code>). <code>p</code> hat Vorrang vor <code>f</code>
* <code>d</code> => 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.
* <code>r</code> => Response
Sprachanwort, die ausgegeben wird. Ist <code>r</code> 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 <code>i="what's the time for sunrise" r="at [Astro:SunRise] o'clock"</code> gültig.


Mit den folgenden Abkürzungen kann auch nach einer Bestätigung für den Befehl gefragt werden:
* <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>.
Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen.


;<code id="attr-rhasspytweaks">rhasspyTweaks</code>
 
===rhasspyTweaks===
Mit diesen Einstellungen können benutzerdefinierte Optimierungen an RHASSPY vorgenommen werden.
Mit diesen Einstellungen können benutzerdefinierte Optimierungen an RHASSPY vorgenommen werden.


:*<code id="attr-rhasspytweaks-timerlimits">timerLimits</code>
====timerLimits====
::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, 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.
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.
:<code>timerSounds= default=./yourfile1.wav eier=3:20:./yourfile2.wav kartoffeln=5:./yourfile3.wav</code>
Die Keys in dieser Code-Zeile sind Beispiele und deren Name - bis auf <code>default</code> frei wählbar. Der Name muss aber zu den ''Label''-Tags für die Timer in den Rhasspy-Sentences passen.
<code>default</code> 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
* <code>noEmptySlots=1</code>
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 <code>1</code>, werden keine leeren Slots erstellt.
* <code>overwrite_all=false</code>
RHASSPY überschreibt alle vorhandenen Slots wenn ein <code>updateSlots</code> ausgeführt wird. Ist das nicht gewünscht, muss dieser Wert auf <code>false</code> gesetzt werden.
* <code>timeouts</code>
Die Keywörter <code>confirm</code> und <code>default</code> können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern.
'''Beispiel:'''
<code>timeouts: confirm=25 default=30</code>


:*<code id="attr-rhasspytweaks-timersounds">timerSounds</code>
====confidenceMin====
::Standardmäßig antwortet der Timer mit einer Sprachnachricht, wenn er abgelaufen ist. Soll lieber eine WAV-Datei verwendet werden, kann das hier eingestellt werden.
Rhasspy ermittelt u.A. auch einen Indikator, anhand dem bestimmt werden kann, wie genau ein Satz erkannt wurde. Ist dieser ''confidence''-Wert sehr bzw. zu niedrig, kann es erwünscht sein, die (falsch erkannte) Absicht des Sprechers nicht umzusetzen. RHASSPY nutzt daher standardmäßig einen Mindestwert von 0.66, bei allen darunter liegenden Werten wird das betreffende Kommando nicht ausgeführt. Dies kann über diesen Tweak global (key: default) oder feiner pro Intent festgelegt werden.
::<code>timerSounds= default=./yourfile1.wav eier=3:20:./yourfile2.wav kartoffeln=5:./yourfile3.wav</code>
Beispiel:
::Die Keys in dieser Code-Zeile sind Beispiele und deren Name - bis auf <code>default</code> frei wählbar. Der Name muss aber zu den ''Label''-Tags für die Timer in den Rhasspy-Sentences passen.
<code>confidenceMin= default=0.6 SetMute=0.4 SetOnOffGroup=0.8 SetOnOff=0.8</code>
::<code>default</code> 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.


:*<code id="attr-rhasspytweaks-updateslots">updateSlots</code>
====confirmIntents====
::Ändert diverse Aspekte des Erstellens und Updatens von Slots
Hiermit kann eingestellt werden, dass für bestimmte Intents immer ein Bestätigung erfragt wird. Unterstützt werden derzeit alle "set-"-Intents.
::*<code>noEmptySlots=1</code>
Dazu werden <code>Intent</code>=<code>regex</code>-Paare verwendet. <code>Intent</code> ist der Name des gewünschten Intents, <code>regex</code> ist eine Regex, die eine bestimmte Gruppe (für Gruppen-Intents) oder einen bestimmten Device-Namen beschreiben muss.
:::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.
'''Beispiel:'''
:::Ist der Wert <code>1</code>, werden keine leeren Slots erstellt.
<code>confirmIntents=SetOnOffGroup=light|blinds SetOnOff=blind.*</code>
::*<code>overwrite_all=false</code>
Befehle werden nur nach einer positiven Bestätigung ausgeführt. Das bedeutet, es wird eine Rückfrage ausgegeben, auf diese muss dann (innerhalb des gesetzten Timeouts) unbedingt ein <code>Mode:OK</code>-Wert vom ''ConfirmAction''-Intent gesendet werden. Jede andere Wert für <code>Mode</code> wird als Abbruch gewertet. Es kann aber auch der eigene Intent ''CancelAction'' für den Abbruch verwendet werden.
:::RHASSPY überschreibt alle vorhandenen Slots wenn ein <code>updateSlots</code> ausgeführt wird. Ist das nicht gewünscht, muss dieser Wert auf <code>false</code> gesetzt werden.
'''Beispiel:'''
::*<code>timeouts</code>
:::Die Keywörter <code>confirm</code> und <code>default</code> können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern.
:::'''Beispiel:'''
:::<code>timeouts: confirm=25 default=30</code>


:*<code id="attr-rhasspytweaks-confirmintents">confirmIntents</code>
<syntaxhighlight lang="ini">
::Hiermit kann eingestellt werden, dass für bestimmte Intents immer ein Bestätigung erfragt wird. Unterstützt werden derzeit alle "set-"-Intents.
::Dazu werden <code>Intent</code>=<code>regex</code>-Paare verwendet.
:::<code>Intent</code> ist der Name des gewünschten Intents
:::<code>regex</code> ist eine Regex, die eine bestimmte Gruppe (für Gruppen-Intents) oder einen bestimmten Device-Namen beschreiben muss.
:::'''Beispiel:'''
:::<code>confirmIntents=SetOnOffGroup=light|blinds SetOnOff=blind.*</code>
::Befehle werden nur nach einer positiven Bestätigung ausgeführt. Das bedeutet, es muss unbedingt ein <code>Mode:OK</code>-Wert vom ''ConfirmAction''-Intent gesendet werden. Jede andere Wert für <code>Mode</code> wird als Abbruch gewertet. Es kann aber auch der eigene Intent ''CancelAction'' für den Abbruch verwendet werden.
::'''Beispiel:'''
::<syntaxhighlight lang="ini">
[de.fhem:ConfirmAction]
[de.fhem:ConfirmAction]
( yes, please do it | go on | that's ok | yes, please ){Mode:OK}
( yes, please do it | go on | that's ok | yes, please ){Mode:OK}
Zeile 404: Zeile 420:
</syntaxhighlight>
</syntaxhighlight>


:*<code id="attr-rhasspytweaks-confirmintentresponses>confirmIntentResponses</code>
====confirmIntentResponses====
::Ü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.
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="wirklich die Gruppe $target $Value schalten" SetOnOff="bestätige dass $target $Value geschaltet werden soll"</code>
<code>confirmIntentResponses=SetOnOffGroup="wirklich die Gruppe $target $Value schalten" SetOnOff="bestätige dass $target $Value geschaltet werden soll"</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>$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.
 
====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, Choice, 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.
 
====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'':
 
<code>ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.</code>
 
====gdt2groups====
Dieser Eintrag ermöglicht es, alle Geräte eines generichDeviceType innerhalb der automatischen Erfassung automatisch einer oder mehreren Gruppen zuzuordnen. Die Vorgaben in diesem Eintrag werden nicht übernommen, wenn am jeweiligen Einzelgerät  das Attribut ''rhasspyGroup'' gesetzt ist.  Hier eine deutschsprachige Vorbelegung als '''Beispiel''': <code>gdt2groups= blind=rollläden,rollladen thermostat=heizkörper light=lichter,leuchten</code>
 
====mappingOverwrite====
Wird diese Option aktiviert, wird bei gesetztem ''rhasspyMapping''-Attribut an einem Device alles gelöscht, was die automatisierte mapping-Erkennung anhand des genericDeviceType erkannt hatte. Sonst ird jeweils nur überschrieben, was als Intent im ''rhasspyMapping'' dieses Geräts angegeben ist.


:*<code id="attr-rhasspytweaks-intentfilter">intentFilter</code>
Syntax:
::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.
:mappingOverwrite=1


:*<code id="attr-rhasspytweaks-ignorekeywords">ignoreKeywords</code>
====extrarooms====
::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).
Komma-separierte Liste von weiteren Räumen, die die aus der Generierung der Device-Map bekannten Räume erweitert. Dies kann z.B. für CustomIntents benötigt werden.
::Dieses '''Beispiel''' filtert daher die o.g. Räume aus und dazu noch die strukturierten Unterräume unterhalb ''Steuerung'':
Diese werden in die Slots für <code>rooms</code> und <code>mainrooms</code> integriert.
::<code>ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.*</code>
Beispiel:
:extrarooms= barn,music collection,cooking recipies




Zeile 460: Zeile 492:


=== Benutzerdefinierte Readings ===
=== Benutzerdefinierte Readings ===
 
Um das Verhalten von RHASSPY beeinflussen zu können, können neben den bei den Attributen verfügbaren ''Tweaks'' auch die folgenden Readings genutzt - und v.a. auch im laufenden Betrieb immer weider geändert - werden:
There are some readings you may find useful to tweak some aspects of RHASSPY's logics:
*<code>siteId2room_</code> Falls keine explizite Raum-Information in den an RHASSPY weitergegebenen Daten enthalten ist, ermittelt das Modul den Raum in der Regel aus dem Namen der ''siteId''. So werden z.B. alle raumlosen Anweisungen von einem Satelliten names ''schlafzimmer'', im Raum ''schlafzimmer'' ausgeführt werden (wenn möglich). Die Gruppenfunktion von Rhasspy wird unterstützt, so wird z.B. ''wohnzimmer.vorne'' ebenfalls automatisch dem Raum ''wohnzimmer'' zugeordnet. Über passende Angaben in ''siteId2room-Readings'' kann dieses Verhalten modifiziert werden: <code>setreading siteId2room_mobile_phone1 wohnzimmer</code> wird RHASSPY veranlassen, den Satelliten  ''mobile_phone1'' dem Raum ''wohnzimmer'' zuzuweisen. Ein Beispiel, mit dem dies per Sprachkommando erfolgt, ist in ''contrib'' zu finden, mit der mobilen Satelliten per Funktionsaufruf in einem [[#rhasspyIntents|rhasspyIntent]] einem neuen Raum zugewiesen werden können.
*<code>siteId2room_</code> Typically, RHASSPY derives room info from the name of the siteId. So naming a satellite bedroom will let RHASSPY assign this satellite to the same room. Using the group scheme is also supported, e.g. kitchen.front will refer to kitchen as room (if not explicitly given). You may overwrite this behavior by setting values to siteId2room readings: <code>setreading siteId2room_mobile_phone1 kitchen</code> will force RHASSPY to link your satellite phone1 kitchen to kitchen as room.
*<code>siteId2doubleSpeak_</code> RHASSPY antwortet immer über den Satelliten, von dem die jeweilige Sprachanweisung kam. Manchmal kann es erwünscht sein, zusätzliche Sprachrückmeldungen an einen weiteren Satelliten zu geben - z.B. weil der betreffende Lautsprecher (zeitweise) ausgeschaltet ist. Ist ein entsprechendes Reading gesetzt, erfolgen (zusätzliche!) Sprachausgaben an den dort als Readingwert angegebenen zweiten Satelliten; das Namensschema der Readings entspricht dem für site2room.
*<code>siteId2doubleSpeak_</code> RHASSPY will always respond via the satellite where the dialogue was initiated from. In some cases, you may want additional output to other satellites - e.g. if they don't have (always on) sound output options. Setting this type of reading will lead to (additional!) responses to the given second satellite; naming scheme is the same as for site2room.


== FHEM-Devices für die Verwendung mit Rhasspy konfigurieren ==
== FHEM-Devices für die Verwendung mit Rhasspy konfigurieren ==
Zeile 473: Zeile 504:


Sind sowohl ''genericDeviceType'' als auch Spezial-Attribute vorhanden, werden die von gDT gesammelten Möglichkeiten durch die der Spezial-Attribute überschrieben.
Sind sowohl ''genericDeviceType'' als auch Spezial-Attribute vorhanden, werden die von gDT gesammelten Möglichkeiten durch die der Spezial-Attribute überschrieben.




'''Wichtig:'''
'''Wichtig:'''
*Nach JEDER Änderung an den folgenden Attributen muss ein <code>[[#set-update-devicemap|update devicemap]]</code> ausgeführt werden. Sonst erfahren weder RHASSPY, noch Rhasspy von der Änderung.
*Nach JEDER Änderung (bzw. nach Abschluss aller Änderungen) an den folgenden Attributen muss ein <code>[[#update devicemap|update devicemap]]</code> ausgeführt werden. In der Regel wird dies automatisch veranlasst, aber wenn dies deaktiviert sein sollte, würden sonst weder RHASSPY, noch Rhasspy von der Änderung erfahren.
*RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das <code>update devicemap</code>-Kommando aktualisiert und kann mittels <code>[[List|list]]</code>-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.
*RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das <code>update devicemap</code>-Kommando aktualisiert und kann mittels <code>[[List|list]]</code>-Befehl angezeigt werden. Für diesen HASH werden alle Namen und sonstige "Labels" in Kleinbuchstaben umgewandelt. Falls man Slots händisch befüllt, muss also darauf geachtet werden, dass Rhasspy ebenfalls Werte in Kleinbuchstaben liefert.
*Die Mindestvoraussetzungen für ein FHEM Device um mit RHASSPY zusammenzuarbeiten sind:
*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
**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.
**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:
*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.
**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.
**Je spezifischer ein Attribut ist, desto eher wird überschreiben, was weniger speziell ist. Ein gesetzter ''alias'' wird also verhindern, dass der (technische) Device-Name verwendet wird. Aber ein gesetztes Attribut ''alexaName'', ''gassistantName'' oder ''siriName'' wird (auch) 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.
*Attribut-Werte werden typischerweise "Zeile für Zeile" gelesen. Wobei gilt, eine Zeile pro Wert/Befehl/Funktionalität. Zeilenumbrüche '''müssen''' also an den richtigen Stellen gesetzt werden.
 
 
===<code>genericDeviceType</code>===


Ist dieses Attribut gesetzt, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln sofern das Device der devspec entspricht.
=== genericDeviceType ===
Ist dieses Attribut gesetzt '''und''' entspricht der Devicename der devspec, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln.


Derzeit werden folgende genericDeviceType unterstützt:
Derzeit werden folgende Werte für das Attribut genericDeviceType unterstützt:
*switch
*switch
*light
*light
Zeile 503: Zeile 531:


Wird ''genericDeviceType'' verwendet, werden unter anderem folgende Informationen gesammelt:
Wird ''genericDeviceType'' verwendet, werden unter anderem folgende Informationen gesammelt:
* der Name (<code>NAME</code> oder <code>alias</code>)
* der Name (<code>NAME</code> oder <code>alias</code>) des Devices
* der Raum, in dem das Device ist
* der (FHEM-)Raum, in dem sich das Device befindet.
* die Gruppe, zu der das Device gehört
* die Gruppe, zu der das Device gehört (ggf. unter Beachtung des Schlüssels [[#gdt2groups|gdt2groups]] aus [[#rhasspyTweaks|rhasspyTweaks]])
* wie Informationen vom Gerät abgefragt werden können
* wie Informationen vom Gerät abgefragt werden können
* wie Werte/Stati am Gerät gesetzt werden können
* wie Werte/Status 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.
 


===<code>rhasspyName</code>===
Die Verwendung von ''genericDeviceType'' ist der einfachste Weg, wie man FHEM-Devices dazu bringen kann, mit RHASSPY zusammenzuarbeiten. Manchmal liefert genericDeviceType aber nicht ausreichende oder nicht passende Informationen. In so einem Fall können die folgenden Attribute (zusätzlich) verwendet werden.
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.


=== 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, der erste Wert in dieser Liste dient intern als Hauptname (''alias''), z.B. in Auswahldialogen.


'''Beispiel:'''
'''Beispiel:''' <code>attr <device> rhasspyName Lampe,Stehlampe,Wunderlicht</code>
<code>attr <device> rhasspyName Lampe,Stehlampe,Wunderlicht</code>


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.
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 ===
===<code>rhasspyRoom</code>===
Dieses Attribut kann verwendet werden, um Rhasspy mitzuteilen, in welchem physischem (oder logischen) Raum sich das Gerät befindet.
Dieses Attribut kann verwendet werden, um Rhasspy mitzuteilen, in welchem physischem (oder logischen) Raum sich das Gerät befindet.


Ist es nicht vorhanden, wird <code>alexaRoom</code> 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.
Ist es nicht vorhanden, wird <code>alexaRoom</code> 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.
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:'''
Es ist auch möglich, mehrere Raum-Namen zu vergeben sofern diese durch ein Komma voneinander getrennt werden (der erste Wert ist wieder der ''Hauptraum'' für Auswahldialoge etc.).
<code>attr <device> rhasspyRoom livingroom</code>


Hinweis: Wenn die siteId den Konventionen von Rhasspy zur Gruppierung von siteIds folgt (roomname.satellite), wird nur <code>roomname</code> als Raum-Name angenommen.
'''Beispiel:''' <code>attr <device> rhasspyRoom livingroom</code>
<font color="gray>
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.
</font>


Hinweis: Wenn die ''siteId'' den Konventionen von Rhasspy zur Gruppierung von siteIds folgt (''roomname.satellite''), wird nur <code>roomname</code> als Raum-Name angenommen. Beachte: Die automatisierte Zuweisung zu einem Raum kann durch ''siteId2room_.*''-Readings modifiziert werden (s.o.).


===<code>rhasspyGroup</code>===
=== rhasspyGroup ===
Kommagetrennte Liste an Gruppen, zu denen das Gerät zugehörig ist
Kommagetrennte Liste an Gruppen, zu denen das Gerät zugehörig ist


'''Beispiel:''' <code>attr <device> rhasspyGroup Lampen,Beleuchtung Arbeitsfläche,Küchen Beleuchtung</code>


'''Beispiel:'''
=== rhasspyMapping ===
<code>attr <device> rhasspyGroup Lampen,Beleuchtung Arbeitsfläche,Küchen Beleuchtung</code>
 
 
===<code>rhasspyMapping</code>===
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.
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.
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:'''
'''Beispiel:'''
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
attr <device> rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response="Alles klar"
attr <device> rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response="Alles klar"
GetOnOff:currentVal=state,valueOff=off
GetOnOff:currentVal=state,valueOff=off
Zeile 566: Zeile 579:
</syntaxhighlight>
</syntaxhighlight>


====Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings====
==== Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings ====
Manche Intents können FHEM-Kommandos oder -Readings verwenden, um Werte auszulesen oder zu setzen.
Manche Intents können FHEM-Kommandos oder -Readings verwenden, um Werte auszulesen oder zu setzen.


Zeile 583: Zeile 596:




===<code>rhasspyChannels</code>===
=== rhasspySpecials ===
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.
Dieses Attribut wirkt ähnlich wie [[#rhasspyTweaks| rhasspyTweaks]], verändert allerdings nur jeweils das Verhalten des Geräts, bei dem es gesetzt ist. Auch dieses Attribut wird zeilenweise eingelesen, es können ein oder mehrere der folgenden Optionen gesetzt werden:
 
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: <code>attr <deviceName> userattr rhasspyChannels:textField-long</code>
 
 
'''Beispiel:'''
<syntaxhighlight lang="text">
attr <device> rhasspyChannels orf eins=channel 201
orf zwei=channel 202
orf drei=channel 203
netflix=launchApp Netflix
</syntaxhighlight>
 
 
===<code>rhasspyColors</code>===
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. <code>attr <deviceName> userattr rhasspyChannels:textField-long</code>
 
Eine Zeile pro Farbe
 
 
'''Beispiel:'''
<syntaxhighlight lang="text">
attr lamp1 rhasspyColors rot=rgb FF0000
grün=rgb 008000
blau=rgb 0000FF
gelb=rgb FFFF00
</syntaxhighlight>
 
 
===<code>rhasspySpecials</code>===
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 ====
::Wird dieser Schlüssel gesetzt, wird das Gerät bei Gruppenaktionen nicht direkt adressiert, sondern die hier angegebene Gruppe. Details hierzu sind in [[RHASSPY/Vertiefung#Timing-Aspekte| Vertiefung - Timing-Aspekte]] zu finden.


:*<code>group</code>
::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.
:::*<code>async_delay</code>
::::Float nummeric value, just as async_delay in structure; the delay will be obeyed prior to the next sending command.
:::*<code>prio</code>
::::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:'''
::'''Beispiel:'''
::<code>attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights</code>
::<code>attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights</code>


 
==== numericValueMap ====
:*<code>numericValueMap</code>
::Ermöglicht es, statt der allgemeinen Methode zum Umgang mit numerischen Werten einzelnen Werten spezielle Kommandos zuzuweisen. Dies kann z.B. hilfreich sein, um spezielle Positionen für Rollladengeräte anzusteuern.
::Allows mapping of numeric values from the Value key to individual commands. Might e.g. usefull to address special positioning commands for blinds.
::'''Beispiel''':
::'''Beispiel''':
::<code>attr blind1 rhasspySpecials numericValueMap:10='Event Slit' 50='myPosition'</code>
::<code>attr blind1 rhasspySpecials numericValueMap:10='Event Slit' 50='myPosition'</code>
::Note: will lead to e.g. set blind1 Event Slit when numeric value 10 is received in {Value} key.
::führt dazu, dass ein numerischer Wert von 10 (im {Value}-key) das Kommando <code>set blind1 Event Slit</code> ausführt.


==== venetianBlind ====
Siehe [[RHASSPY/Vertiefung#Jalousien|Vertiefung - Jalousien]]


:*<code>venetianBlind</code>
==== colorCommandMap ====
::<code>attr blind1 rhasspySpecials venetianBlind:setter=dim device=blind1_slats stopCommand="set blind1_slats dim [blind1_slats:dim]"</code>
Sowie **colorTempMap** und **colorForceHue2rgb**
::Explanation (one of the two arguments is mandatory):
Siehe [[RHASSPY/Vertiefung#Farben|Vertiefung - Farben]]
::*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.


==== priority ====
Ermöglicht es, Rückfragen zu vermeiden, wenn mehrere Geräte für bestimmte Aktionen in Frage kommen. Siehe [[RHASSPY/Vertiefung#Einer_statt_alle|Einer statt alle]]


:*<code>colorCommandMap</code>
==== confirm ====
::Allows mapping of values from the Color key to individual commands.
Ist eine Möglichkeit, Geräte nur nach Rückfrage und Bestätigung zu schalten (ähnlich wie ''confirmIntents'' in ''rhasspyTweaks''). Es können entweder einfach nur Intent-Namen angegeben werden, oder Paare von **Intent** und zugehöriger **response**:
::'''Beispiel:'''
SetOnOff="Soll $target wirklich $Value geschaltet werden" SetScene
::<code>attr lamp1 rhasspySpecials colorCommandMap:0='rgb FF0000' 120='rgb 00FF00' 240='rgb 0000FF'</code>


==== confirmValueMap ====
Kann spezielle Übersetzungen für $Value enthalten, z.B. für Rollladen-Geräte:


:*<code>colorTempMap</code>
<syntaxhighlight lang="perl">confirm: SetOnOff="wirklich $Value $target"
::Allows mapping of values from the Colortemp key to individual commands.
confirmValueMap: on=öffnen off=schließen</syntaxhighlight>
::Works similar to colorCommandMap


==== scenes ====
Wird bei der automatisierten Erfassung erkannt, dass ein Gerät das Setzen von Szenen unterstützt, werden die erkannten Szenen-Namen an Rhasspy übergeben. Da diese häufig technischer Natur sind, eignen sie sich nicht für eine Spracherkennung. Über diesen Schlüssel können daher sprechbare Namen für jede Szene vergeben werden, und/oder einzelne bzw. alle Szenen von der Erkennung ausgenommen werden. Der Kenner ''none'' löscht die Szene von der Liste der übermittelten Szenen, wird die Kombination ''all=none'' angegeben, wird dieses Gerät insgesamt von der Vorbereitung für den Intent ''SetScene'' ausgeschlossen.
Beispiel:
<syntaxhighlight lang="perl">attr lamp1 rhasspySpecials scenes:scene2="Kino zu zweit" scene3=Musik scene1=none scene4=none</syntaxhighlight>
Siehe auch [[RHASSPY/Vertiefung#echte_Szenen|Vertiefung - echte Szenen]].


:*<code>colorForceHue2rgb</code>
=== Veraltete Attribute ===
::Defaults to <code>0</code>. If set, a rgb command will be issued, even if the device is capable to handle hue commands.
In der Regel sollte es ausreichen, die zu steuernden Devices über die oben genannten Attribute zu konfigurieren. Es gibt jedoch noch zwei ältere Methoden. Um diese zu verwenden, muss zuerst jeweils ein entsprechendes User-Attribut im FHEM-Device, das damit gesteuert werden soll, angelegt werden.
::'''Beispiel:'''
::<code>attr lamp1 rhasspySpecials colorForceHue2rgb:1</code>


==== rhasspyChannels ====
Das Attribut wird vom Intent ''MediaControls'' verwendet. Es informiert den Intent darüber, welche (Medien-)Kanäle vorhanden sind und welcher FHEM-Befehl oder Perl-Code auszuführen ist, wenn auf diesen Kanal geschaltet werden soll.


:*<code>priority</code>
In diesem Attribut muss eine Zeile pro (Medien-)Kanal verwendet werden.
::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:'''
::<code>attr sensor_outside_main rhasspySpecials priority:inRoom=temperature outsideRoom=temperature,humidity,pressure</code>


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: <code>attr <deviceName> userattr rhasspyChannels:textField-long</code>


:*<code>confirm</code>
::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.


'''Beispiel:'''
<syntaxhighlight lang="perl">
attr <device> rhasspyChannels orf eins=channel 201
orf zwei=channel 202
orf drei=channel 203
netflix=launchApp Netflix
</syntaxhighlight>


:*<code>confirmValueMap</code>
==== rhasspyColors ====
::Provide a device specific translation for $Value, e.g. for a blind type device rhasspySpecials could look like:
Ältere Methode, die verwendet werden kann, um Lichtfarben zu wechseln. Es wird nachdrücklich empfohlen, die neueren Methoden über die (nummerisch zu übergebenden) allgemeinen Farbwerte und/oder ein ''colorCommandMap'' oder ''colorTempMap'' (siehe ''rhasspySpecials'') zu konfigurieren!
::<syntaxhighlight lang="text>confirm: SetOnOff="really $Value $target"
confirmValueMap: on=open off=close</syntaxhighlight>


Um das Mapping zu verwenden, muss zuerst ein User-Attribut am zu steuernden Gerät angelegt werden. Z.B. <code>attr <deviceName> userattr rhasspyChannels:textField-long</code>


:*<code>scenes</code>
Eine Zeile pro Farbe
::<code>attr lamp1 rhasspySpecials scenes:scene2="Kino zu zweit" scene3=Musik scene1=none scene4=none</code>
::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.


'''Beispiel:'''
<syntaxhighlight lang="perl">
attr lamp1 rhasspyColors rot=rgb FF0000
grün=rgb 008000
blau=rgb 0000FF
gelb=rgb FFFF00
</syntaxhighlight>


== Intents ==
== Intents ==
Zeile 696: Zeile 675:




'''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 (<code>Value</code>, <code>Room</code>, <code>Device</code>, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen.
:*RHASSPY erstellt bei einem <code>update slots</code> auch Slots je nach Möglichkeiten der Geräte oder Gruppen. Unterstützt ein Gerät zum Beispiel den Intent ''GetNumeric'', wird auch ein Slot <code>de.fhem.Device-GetNumeric</code> erstellt. Ein Gerät, dass ein- und ausgeschalten werden kann, wird im Slot <code>de.fhem.Device-SetOnOff</code> untergebracht. Ein einzelnes Gerät kann sich auch in mehreren Slots befinden. Um eine möglichst genaue Spracherkennung zu gewährleisten, ist '''empfohlen''', diese '''spezifischen Slots''' - statt einfach nur <code>de.fhem.Device</code> oder <code>de.fhem.Group</code> - '''zu verwenden'''.




Zeile 703: Zeile 684:


Beispiel-Mappings:
Beispiel-Mappings:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
SetOnOff:cmdOn=on,cmdOff=off
SetOnOff:cmdOn=on,cmdOff=off
SetOnOff:cmdOn=on,cmdOff=off,response="Sir yes Sir"
SetOnOff:cmdOn=on,cmdOff=off,response="Sir yes Sir"
Zeile 710: Zeile 691:


Argumente:
Argumente:
*<code>cmdOn</code> Befehl um das Gerät einzuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].
*<code>cmdOn</code> Befehl um das Gerät einzuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].
*<code>cmdOff</code> Befehl um das Gerät auszuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].
*<code>cmdOff</code> Befehl um das Gerät auszuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].


Optionale Argumente:
Optionale Argumente:
Zeile 718: Zeile 699:


Beispiel-Sätze:
Beispiel-Sätze:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
schalten das licht ein
schalten das licht ein
schließe den rollladen im schlafzimmer
schließe den rollladen im schlafzimmer
Zeile 728: Zeile 709:
<syntaxhighlight lang="ini">
<syntaxhighlight lang="ini">
[de.fhem:SetOnOff]
[de.fhem:SetOnOff]
(turn on|open|start){Value:on} $de.fhem.Device{Device} [$de.fhem.Room{Room}]
(schalte|schalt|mache|mach|stelle|stell|starte) [den|die|das] $de.fhem.Device-SetOnOff{Device} [[(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room}] (an|ein){Value:on}
(turn off|close|stop){Value:off} $de.fhem.Device{Device} [$de.fhem.Room{Room}]
(schalte|schalt|mache|mach|stelle|stell) [den|die|das] $de.fhem.Device-SetOnOff{Device} [[(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room}] aus{Value:off}
(fahre|fahr) [den|die|das] $de.fhem.Device-blind{Device} [[(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room}] ((hoch|auf){Value:on}|(zu|runter){Value:off})
 
</syntaxhighlight>
</syntaxhighlight>


Zeile 738: Zeile 721:
Optionale Tags:
Optionale Tags:
*<code>Room</code>
*<code>Room</code>


=== SetOnOffGroup ===
=== SetOnOffGroup ===
Intent um Gruppen von Geräte zwischen zwei Zuständen zu schalten.
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 <code>group</code> oder <code>rhasspyGroup</code> haben.
Dafür ist ein SetOnOff-Mapping benötigt und alle gewünschten Geräte müssen (ggf. u.A. auch) der gewählten Gruppe angehören (einzustellen über das Attribut <code>group</code> bzw. <code>rhasspyGroup</code>, oder allgemein kommend aus rhasspyTweaks - gdt2groups).
 


Beispiel-Sätze:
Beispiel-Sätze:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
schalte alle lampen in der küche aus
schalte die lampen in der küche aus
schließe alle rollläden im schlafzimmer
schließe alle rollläden im schlafzimmer
schalte alle lampen aus
schalte sämtliche lampen aus
</syntaxhighlight>
</syntaxhighlight>


Zeile 756: Zeile 739:
<syntaxhighlight lang="ini">
<syntaxhighlight lang="ini">
[de.fhem:SetOnOffGroup]
[de.fhem:SetOnOffGroup]
(schalte|öffne{Value:on}) alle $de.fhem.Group{Group} (:){Room:global} ([$de.fhem.Room{Room}]) [ein{Value:on}]
\[(schalt|mach)] (die | alle | sämtliche ) $de.fhem.Group-SetOnOff{Group} [[in|im|in der|auf der] [( überall: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}]
\[(schalt|mach)] (die | alle | sämtliche ) $de.fhem.Group-SetOnOff{Group} [[in|im|in der|auf der] [( überall:global | $de.fhem.Room ){Room}] aus{Value:off}
(öffne{Value:on}|schließe{Value:off}) (alle | sämtliche ) $de.fhem.Group-blind{Group} [[in|im|in der|auf der] [( überall:global{Room:global} | $de.fhem.Room{Room} )]
(fahr|fahre|mach|mache) [den|die|das] $de.fhem.Group-blind{Group} [[(im|in dem|in der)] ( überall:global{Room:global} | $de.fhem.Room{Room} )] ( auf{Value:on} | hoch{Value:on} | zu{Value:off} | runter{Value:off} )
</syntaxhighlight>
</syntaxhighlight>


Zeile 766: Zeile 751:
Optionale Tags:
Optionale Tags:
*<code>Room</code>
*<code>Room</code>


=== SetTimedOnOff ===
=== SetTimedOnOff ===
Zeile 775: Zeile 759:


Beispiel-Sätze:
Beispiel-Sätze:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
schalte das licht für eine minute und dreißig sekunden aus
schalte das licht für eine minute und dreißig sekunden aus
schalte die musik im bad bis zwei uhr ein
schalte die musik im bad bis zwei uhr ein
Zeile 784: Zeile 768:
<syntaxhighlight lang="ini">
<syntaxhighlight lang="ini">
[de.fhem:SetTimedOnOff]
[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-SetOnOff{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})
schalte $de.fhem.Device-SetOnOff{Device} [$de.fhem.Room{Room}] bis (0..24){Hourabs!int} [(1..60){Min!int}] (ein{Value:on}|aus{Value:off})
</syntaxhighlight>
</syntaxhighlight>


Zeile 804: Zeile 788:


Beispiel-Sätze:
Beispiel-Sätze:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
schalte alle lichter in der küche für fünfzig sekunden ein
schalte alle lichter in der küche für fünfzig sekunden ein
schalte alle licher bis zwei uhr ein
schalte alle licher bis zwei uhr ein
Zeile 814: Zeile 798:
<syntaxhighlight lang="ini">
<syntaxhighlight lang="ini">
[de.fhem:SetTimedOnOffGroup]
[de.fhem:SetTimedOnOffGroup]
schalte $de.fhem.Group{Group} [$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.Group-SetOnOff{Group} [$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.Group{Group} [$de.fhem.Room{Room}] bis (0..24){Hourabs!int} [(1..60){Min!int}] (ein{Value:on}|aus{Value:off})
schalte $de.fhem.Group-SetOnOff{Group} [$de.fhem.Room{Room}] bis (0..24){Hourabs!int} [(1..60){Min!int}] (ein{Value:on}|aus{Value:off})
</syntaxhighlight>
</syntaxhighlight>


Zeile 832: Zeile 816:


Beispiel-Mappings:
Beispiel-Mappings:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
GetOnOff:currentVal=state,valueOff=closed
GetOnOff:currentVal=state,valueOff=closed
GetOnOff:currentVal=state,valueOn=on
GetOnOff:currentVal=state,valueOn=on
Zeile 849: Zeile 833:


Beispiel-Sätze:
Beispiel-Sätze:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
ist das licht im bad ein
ist das licht im bad ein
ist das fenster im wohnzimmer geöffnet
ist das fenster im wohnzimmer geöffnet
Zeile 859: Zeile 843:
<syntaxhighlight lang="ini">
<syntaxhighlight lang="ini">
[en.fhem:GetOnOff]
[en.fhem:GetOnOff]
ist $de.fhem.Device{Device} [$de.fhem.Room{Room}] (ein|geöffnet){State:on}
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (ein|geöffnet){State:on}
ist $de.fhem.Device{Device} [$de.fhem.Room{Room}] (aus|geschlossen){State:off}
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (aus|geschlossen){State:off}
</syntaxhighlight>
</syntaxhighlight>


Zeile 874: Zeile 858:


=== SetNumeric ===
=== SetNumeric ===
Intent to dim, change volume, set temperature, ...
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw..  
 


Beispiel-Mappings:
Beispiel-Mappings:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
SetNumeric:currentVal=pct,cmd=dim,minVal=0,maxVal=99,step=25,type=brightness
SetNumeric:currentVal=pct,cmd=dim,minVal=0,maxVal=99,step=25,type=brightness
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volume
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volume
Zeile 885: Zeile 868:


Argumente:
Argumente:
*<code>currentVal</code> Reading which contains the acual value. Required.
*<code>currentVal</code> Reading, in dem der aktuelle Wert zu finden ist (wird zwingend benötigt).
*<code>part</code> Used to split currentVal into separate values. Separator is a blank. E.g. if currentVal is 23 C, part=0 results in 23. Optional.
*<code>part</code> Kann genutzt werden, um den Wert aus **currentVal** in mehrere Teile zu zerlegen (getrennt wird am Leerzeichen). Z.B. wenn currentVal 23 C ist, wird **part=0** **23** ergeben. Optionaler Parameter.
*<code>cmd</code> Set-command of the device that should be called after analysing the voice-command. Required.
*<code>cmd</code> Das **Set**-Kommando des Geräts, das in Folge des Sprachkommandos ausgeführt werden soll. (Notwendiger Parameter).
*<code>minVal</code> Lowest possible value. Optional.
*<code>minVal</code> Niedrigster zugelassener Wert, optional.
*<code>maxVal</code> Highest possible value. Optional.
*<code>maxVal</code> Höchster zugelassener Wert, optional.
*<code>step</code> Step-size for changes (e.g. turn the volume up). Optional. Default 10.
*<code>step</code> Schrittweite für relative Änderungen wie <code>mach lauter</code>. Optional. Default: 10.
*<code>map</code> Currently only one possible value: percent. See below. Optional.
*<code>map</code> Derzeit wird ausschließlich die Angabe **percent** ausgewertet. Optionaler Parameter, der bewirkt, dass alle Angaben als Prozentwert (zwischen minVal und maxVal) interpretiert werden und entsprechend gerechnet wird. So wird z.B. eine Leuchte mit **minVal=0** und **maxVal=255** beim Befehl "stelle das Licht auf 50" dies so verstehen, als wäre die Anweisung "stelle das Licht auf 50 Prozent" gewesen. Das Licht wird daher auf 127 gestellt, und nicht auf (absolut) 50.
*<code>type</code> To differentiate between multiple possible SetNumeric-Intents for the same device. Recommended.
*<code>type</code> Zur Unterscheidung, falls mehrere SetNumeric-Intents für das Gerät möglich sind. Empfohlener Parameter.
 
Explanation for map=percent or {Unit:percent}: If on of these options is set, all numeric control values are taken as percentage between minVal and maxVal.
If there is a light-device with the setting minVal=0 and maxVal=255, then "turn the light to 50" means the same as "turn the light to 50 percent". The light is then set to 127 instead of 50.


Good to know:
Gut zu wissen:
To use the commands like louder or lower without the need to speak a device-name, the module has to know which device is currently playing. Thus it uses the GetOnOff-Mappings to search a turned on device with e.g. type=volume. First it searches in the actual rhasspyRoom (as indicated in RHASSPY list, this is not restricted to the attribute!) (the siteId or - if missing - the default rhasspyRoom), next in all other rhasspyRooms.
Um Kommandos wie **lauter** oder **leiser** ohne Angabe eines Gerätes ausführen zu können, muss RHASSPY zunächst ermitteln, welches Gerät gerade überhaupt etwas wiedergibt ist. Daher nutzt es die GetOnOff-Mappings, um festzustellen, welches Gerät vom **type=volume** überhaupt angeschaltet ist. Dabei wird wie üblich zunächst im aktuellen rhasspyRoom gesucht, bevor die Suche außerhalb fortgesetzt wird.
That's why it's advisable to also set a GetOnOff-Mapping if using a SetNumeric-Mapping.
Setzt man also Mappings manuell, ist es ratsam, auch ein **GetOnOff**-Mapping zu setzen.




Possible types:
Zulässige Typen sind:
*<code>brightness</code>
*<code>brightness</code>
*<code>setTarget</code>
*<code>setTarget</code>
Zeile 910: Zeile 890:


Beispiel-Sätze:
Beispiel-Sätze:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
Set to light to 30 percent
Stelle das Licht auf 30 Prozent
Turn the radio down
Mach das Radio leiser
Set the temperature in the living room 2 degree warmer
Stell die Temperatur im Wohnzimmer 2 Grad wärmer
</syntaxhighlight>
</syntaxhighlight>




Beispiel Rhasspy-Sentences:
Beispiel Rhasspy-Sentences:
(if you need to speak Real numbers ("two point five") see Custom Converter to use Real numbers)
(Beachte: Wenn wie hier im Beispiel reele Zahlen (mit Komma) ermöglicht werden sollen ("acht Komma fünf"), wird ein [[#Custom Converter für reelle Zahlen| Custom Converter für reelle Zahlen]] benötigt)
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
[en.fhem:SetNumeric]
[de.fhem:SetNumeric]
(change) $de.fhem.Device{Device} [$de.fhem.Room{Room}] to (0..100){Value!int} [percent{Unit:percent}]
den=(den|die|das)
(turn up|increase){Change:volUp} [the volume] [of] $de.fhem.Device{Device} [by] [(0..10){Value!float}] [decibel{Unit}]
cmdmulti=(schalte|schalt|mache|mach|stelle|stell)
(turn down|lower){Change:volDown} [the volume] [of] $de.fhem.Device{Device} [by] [(0..10){Value!float}] [decibel{Unit}]
rooms=([(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room})
(turn up|increase){Change:tempUp} [the heating|the temperature] [of] $de.fhem.Device{Device} [by] [(0..10){Value!float}] [degree{Unit}]
<cmdmulti> [<den>] $de.fhem.Device-SetNumeric{Device} auf (0..100){Value!int} [Prozent{Unit:percent}]
(turn down|lower){Change:tempDown} [the heating|the temperature] [of] $de.fhem.Device{Device} [by] [(0..10){Value!float}] [degree{Unit}]
\[<cmdmulti>] [die Lautstärke [an|am]] [dem|<den>] $de.fhem.Device-media{Device} [<rooms>] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}
(turn up|increase){Change:lightUp} [the light] [of] $de.fhem.Device{Device} [by] [(0..30 [point:. 1..9]){Value!customFloat}] [percent{Unit:percent}]
<cmdmulti> [die Lautstärke [an|am]] [dem|<den>] [$de.fhem.Device-media{Device}] [<rooms>] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}
(turn down|decrease){Change:lightDown} [the light] [of] $de.fhem.Device{Device} [by] [(0..30 [point:. 1..9]){Value!customFloat}] [percent{Unit:percent}]
<cmdmulti> [<den>] $de.fhem.Device-thermostat{Device} [<rooms>] [um] [(0..10){Value!int}] [Grad{Unit.degree}] ( wärmer:tempUp | kälter:tempDown ){Change}
<cmdmulti> [<den>] $de.fhem.Device-light{Device} [<rooms>] [um] [(0..30 [Komma:. 1..9]){Value!customFloat}] [Prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}
<cmdmulti> [<den>] ( $de.fhem.Device-light | $de.fhem.Device-media |$de.fhem.Device-blind){Device} [<rooms>] auf [(0..30 [Komma:. 1..9]){Value!customFloat}]
\[deutlich{Factor:2}] ( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [<de.fhem:SetOnOff.rooms>]
( halte | stoppe | stop ) [<den>] $de.fhem.Device-blind{Device} [<de.fhem:SetOnOff.rooms>] [an] {Change:cmdStop}
</syntaxhighlight>
</syntaxhighlight>


Currently there are this possible types for tag <code>{Change}</code>:
Derzeit werden folgende Typen für das Feld <code>{Change}</code> ausgewertet:
*<code>tempUp</code> / <code>tempDown</code>
*<code>tempUp</code> / <code>tempDown</code>
*<code>volUp</code> / <code>volDown</code>
*<code>volUp</code> / <code>volDown</code>
Zeile 936: Zeile 920:
*<code>setUp</code> / <code>setDown</code>
*<code>setUp</code> / <code>setDown</code>


Required tags:
Notwendig sind:
*<code>Change</code> oder <code>Type</code>
*<code>Change</code> oder <code>Type</code>
*<code>Value</code> oder <code>Change</code>
*<code>Value</code> oder <code>Change</code>
Zeile 944: Zeile 928:
*<code>Room</code>
*<code>Room</code>
*<code>Unit</code>
*<code>Unit</code>
 
*<code>Factor</code> Dieser Wert wird mit der Standard-Schrittweite (<code>step</code> im Mapping) multipliziert


=== SetNumericGroup ===
=== SetNumericGroup ===
 
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. Die Funktionsweise entspricht dabei dem des Intents ''SetNumeric'', wobei eben statt eines einzelnen Devices eben ein oder mehrere Geräte über ihren Gruppennamen angesprochen werden. Statt des optionalen Tags <code>Device</code> ist daher der Tag <code>Group</code> zu übergeben.
Aus der Adressierung mehrerer Geräte ergeben sich einige Besonderheiten, die in der [[RHASSPY/Vertiefung]], dort speziell auch im Punkt [[RHASSPY/Vertiefung#Beispiel_SetOnOffGroup|Beispiel SetOnOffGroup]] näher erläutert sind. Wesentliche zu beachtende Aspekte sind:
* Vermeidung von Funk-Überschneidungen (''Specials'' ''partOf'' und ''async_delay'')
* Begrenzung der Gruppenzugehörigkeit durch die Raumzugehörigkeit (und die Aufhebung dieser Beschränkung durch die Übergabe des speziellen Raums ''global'')


=== GetNumeric ===
=== GetNumeric ===
Intent to question values like actual temperature, brightness, volume, ...
Intent, mit dem man Werte erfragen kann, wie z.B. die aktuelle Temperatur, Helligkeit, Lautstärke, ...




Beispiel-Mappings:
Beispiel-Mappings:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
GetNumeric:currentVal=temperature,part=1,type=temperature
GetNumeric:currentVal=temperature,part=1,type=temperature
GetNumeric:currentVal=pct,map=percent,minVal=0,maxVal=100,type=brightness
GetNumeric:currentVal=pct,map=percent,minVal=0,maxVal=100,type=brightness
GetNumeric:currentVal=volume,type=volume
GetNumeric:currentVal=volume,type=volume
GetNumeric:currentVal=humidity,part=0,type=airHumidity
GetNumeric:currentVal=humidity,part=0,type=humidity
GetNumeric:currentVal=batteryPercent,type=battery
GetNumeric:currentVal=batteryPercent,type=battery
</syntaxhighlight>
</syntaxhighlight>


Argumente:
Argumente:
*<code>currentVal</code> Reading which contains the value.
*<code>currentVal</code> Das Reading, das den abzufragenden Wert enthält
*<code>part</code> Used to split currentVal into separate values. Separator is a blank. E.g. if currentVal is 23 C, part=1 results in 23
*<code>part</code> Teile aus currentVal ableiten, indem am Leerzeichen getrennt wird. Ist ''currentVal'' beispielsweise ''23 C'', entspricht ''part=1'' dem Wert ''23''
*<code>map</code> See Explanation in SetNumeric Intent. Converts the given value back to a percent-value.
*<code>map</code> Die Funktionswiese entspricht dem ''SetNumeric'' Intent. Wandelt den vorhandenen Wert in eine Prozent-Angabe um.
*<code>minVal</code> Lowest possible value. Only needed if map is used.
*<code>minVal</code> Niedrigster zulässiger Wert (nur benötigt, wenn ''map'' angegeben ist).
*<code>maxVal</code> Highest possible value. Only needed if map is used.
*<code>maxVal</code> Höchster zulässiger Wert  (nur benötigt, wenn ''map'' angegeben ist).
*<code>type</code> To differentiate between multiple possible SetNumeric-Intents for the same device.
*<code>type</code> Dient der Unterscheidung zwischen mehreren GetNumeric-Anfragemöglichkeiten für dasselbe Gerät (auch relevant für SetNumeric-Anweisungen).


Possible types:
Mögliche Abfragetypen:
*<code>airHumidity</code>
*<code>humidity</code>
*<code>battery</code>
*<code>battery</code>
*<code>brightness</code>
*<code>brightness</code>
Zeile 980: Zeile 967:
*<code>volume</code>
*<code>volume</code>
*<code>waterLevel</code>
*<code>waterLevel</code>
 
Aus dem Abfragetypen ergibt sich die von RHASSPY ausgewählte Antwort.


Beispiel Sätze:
Beispiel Sätze:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
what is the temperature in the living room
what is the temperature in the living room
how bright is the floor lamp
how bright is the floor lamp
Zeile 991: Zeile 978:


Beispiel Rhasspy-Sentences:
Beispiel Rhasspy-Sentences:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
[en.fhem:GetNumeric]
[en.fhem:GetNumeric]
#actual temperature
#actual temperature
(what is|how high is) the temperature{Type:temperature} [$de.fhem.Device{Device}] [$de.fhem.Room{Room}]
(what is|how high is) the temperature{Type:temperature} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]


#desired-temperature
#desired-temperature
\[what is the|how high is the] (desired temperature){Type:desired-temp} [($de.fhem.Device){Device}] [$de.fhem.Room{Room}]
\[what is the|how high is the] (desired temperature){Type:desired-temp} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]


#volume
#volume
(what is the|how high is the) volume{Type:volume} $de.fhem.Device{Device} [$de.fhem.Room{Room}]
(what is the|how high is the) volume{Type:volume} $de.fhem.Device-GetNumeric{Device} [$de.fhem.Room{Room}]
</syntaxhighlight>
</syntaxhighlight>


Zeile 1.009: Zeile 996:
Optional tags
Optional tags
*<code>Room</code>
*<code>Room</code>


=== GetState ===
=== GetState ===
Zeile 1.016: Zeile 1.002:


Beispiel-Mappings:
Beispiel-Mappings:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
GetState:response="Temperature is [$DEVICE:temp] degree at [Thermo:hum] percent humidity"
GetState:response="Temperature is [$DEVICE:temp] degree at [Thermo:hum] percent humidity"
GetState:response={my $value=ReadingsVal("$DEVICE","brightness",""); return "Brightness is $value";}
GetState:response={my $value=ReadingsVal("$DEVICE","brightness",""); return "Brightness is $value";}
Zeile 1.030: Zeile 1.016:


Example-Sentences:
Example-Sentences:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
How is the state of the thermostat in the kitchen
How is the state of the thermostat in the kitchen
state light in livingroom
state light in livingroom
Zeile 1.038: Zeile 1.024:


Example-Rhasspy-Sentences:
Example-Rhasspy-Sentences:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
[de.fhem:GetState]
[de.fhem:GetState]
\[how is the] (state) $de.fhem.Device{Device} [$de.fhem.Room{Room}]
\[how is the] (state) $de.fhem.Device{Device} [$de.fhem.Room{Room}]
Zeile 1.055: Zeile 1.041:


Beispiel-Mapping:
Beispiel-Mapping:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next
</syntaxhighlight>
</syntaxhighlight>
Zeile 1.072: Zeile 1.058:


Example-Sentences:
Example-Sentences:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
skip to next track on the radio
skip to next track on the radio
pause
pause
Zeile 1.083: Zeile 1.069:


Example-Rhasspy-Sentences:
Example-Rhasspy-Sentences:
<syntaxhighlight lang="text">
<syntaxhighlight lang="ini">
[de.fhem:MediaControls]
[de.fhem:MediaControls]
(start){Command:cmdPlay} the playback [$de.fhem.Device-MediaControls{Device}]
(start){Command:cmdPlay} the playback [$de.fhem.Device-MediaControls{Device}]
Zeile 1.107: Zeile 1.093:


Beispiel-Mappings:
Beispiel-Mappings:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
SWR3=favorite s_w_r_3
SWR3=favorite s_w_r_3
SWR1=favorite s_w_r_1
SWR1=favorite s_w_r_1
Zeile 1.121: Zeile 1.107:


Example-Sentences:
Example-Sentences:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
play CNN on the radio in my office
play CNN on the radio in my office
switch to HBO
switch to HBO
Zeile 1.129: Zeile 1.115:


Example-Rhasspy-Sentences:
Example-Rhasspy-Sentences:
<syntaxhighlight lang="text">
<syntaxhighlight lang="ini">
[en.fhem:MediaChannels]
[en.fhem:MediaChannels]
\[(play|switch to|change to)] ($de.fhem.MediaChannels){Channel} [($de.fhem.Device){Device}] [($de.fhem.Room){Room}]
\[(play|switch to|change to)] ($de.fhem.MediaChannels){Channel} [($de.fhem.Device){Device}] [($de.fhem.Room){Room}]
Zeile 1.157: Zeile 1.143:


Example-Mappings:
Example-Mappings:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
red=rgb FF0000
red=rgb FF0000
green=rgb 00FF00
green=rgb 00FF00
Zeile 1.167: Zeile 1.153:


Example-Sentences:
Example-Sentences:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
change light to green
change light to green
lightstrip blue
lightstrip blue
Zeile 1.175: Zeile 1.161:


Example-Rhasspy-Sentences:
Example-Rhasspy-Sentences:
<syntaxhighlight lang="text">
<syntaxhighlight lang="ini">
[en.fhem:SetColor]
[en.fhem:SetColor]
\[change|color] $de.fhem.Device{Device} [$de.fhem.Room{Room}] $de.fhem.Color{Color}
\[change|color] $de.fhem.Device{Device} [$de.fhem.Room{Room}] $de.fhem.Color{Color}
Zeile 1.201: Zeile 1.187:


Beispiel-Sätze:
Beispiel-Sätze:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
wie spät ist es?
wie spät ist es?
sag mir die uhrzeit
sag mir die uhrzeit
Zeile 1.208: Zeile 1.194:


Beispiel Rhasspy-Sentences:
Beispiel Rhasspy-Sentences:
<syntaxhighlight lang="text">
<syntaxhighlight lang="ini">
[de.fhem:GetTime]
[de.fhem:GetTime]
wie spät [ist es]
wie spät [ist es]
Zeile 1.223: Zeile 1.209:


Beispiel-Satz:
Beispiel-Satz:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
welcher tag ist heute
welcher tag ist heute
</syntaxhighlight>
</syntaxhighlight>
Zeile 1.229: Zeile 1.215:


Beispiel Rhasspy-Sentences:
Beispiel Rhasspy-Sentences:
<syntaxhighlight lang="text">
<syntaxhighlight lang="ini">
[de.fhem:GetDate]
[de.fhem:GetDate]
welcher tag ist heute
welcher tag ist heute
Zeile 1.246: Zeile 1.232:


Beispiel Sätze:
Beispiel Sätze:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
Set timer in bedroom to five minutes
Set timer in bedroom to five minutes
Set countdown in the kitchen to two hours
Set countdown in the kitchen to two hours
Zeile 1.258: Zeile 1.244:


Example-Rhasspy-Sentence:
Example-Rhasspy-Sentence:
<syntaxhighlight lang="text">
<syntaxhighlight lang="ini">
[de.fhem:SetTimer]
[de.fhem:SetTimer]
labels=(alarm|teetimer|countdown|timer)
labels=(alarm|teetimer|countdown|timer)
Zeile 1.292: Zeile 1.278:


Beispiel-Sätze:
Beispiel-Sätze:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
good night
good night
be quiet
be quiet
Zeile 1.302: Zeile 1.288:




Example-Rhasspy-Sentences:
Beispiel für Rhasspy-Sentences:
<syntaxhighlight lang="text">
<syntaxhighlight lang="ini">
[de.fhem:SetMute]
[de.fhem:SetMute]
(good night|be quiet){Value:on}
(good night|be quiet){Value:on}
Zeile 1.310: Zeile 1.296:




Attention! The <code>{Value:on}</code> or <code>{Value:off}</code> is mandatory, case sensitive and has to be english!
Hinweis: Die Felder <code>{Value:on}</code> bzw. <code>{Value:off}</code> sind verpflichtend und ''case sensitive'', der Wert ''on'' bzw. ''off'' ist in Englisch anzugeben!




=== ConfirmAction ===
=== ConfirmAction ===
 
Dies ist - wie die folgenden Intents ''CancelAction'' und ''Choice'' (bzw. die überholten Varianten ''ChoiceRoom'' und ''ChoiceDevice'') auch - ein Intent, der im Rahmen von Dialogen benötigt wird. Siehe dazu auch [[RHASSPY/Vertiefung#Dialoge|Vertiefung - Dialoge]].
Um eine Aktion tatsächlich auszuführen, ist als Rückgabe zwingend <code>{Mode}</code> mit dem Wert ''OK'' erforderlich, alles andere wird so behandelt, als wäre der Intent ''CancelAction'' ausgewählt worden, was zur Beendigung des Dialogs ohne Aktion führt.


=== CancelAction ===
=== CancelAction ===
Siehe ''ConfirmAction''. Dieser Intent muss nicht zwingend existieren, es kann auch ein unpassender Rückgabewert in ''ConfirmAction'' angegeben werden, um die Abbruch-Routinen für Dialoge zu starten.


=== Choice ===
Siehe ''ConfirmAction''. Dient im Rahmen von Dialogen der Auswahl von einem oder mehreren der folgenden Elemente:
<code>{Device}</code>, <code>{Room}</code> und/oder <code>{Scene}</code>.


=== ChoiceRoom ===
Beispiel für Rhasspy-Sentences:
<syntaxhighlight lang="ini">
[de.fhem:Choice]
den=(den|die|das)
choose= ( nimm [bitte] | [bitte] nimm | ich hätte gerne | [ich] (wähle|nehme) )


<choose> [ <den> [( Gerät | $de.fhem.Aliases{Device} )] ] ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room}
<choose> [ <den> ] $de.fhem.Aliases{Device} [ ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room} ]
<choose> [ ( die Szene | den Modus ) ] $de.fhem.Scenes [Modus] [ [( am | vom )] $de.fhem.Aliases{Device} ] [( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room} ] [bitte]
</syntaxhighlight>.


=== ChoiceDevice ===
==== ChoiceRoom ====
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Raums, wird heute pauschal nach ''Choice'' umgeleitet und sollte nicht mehr verwendet werden!


==== ChoiceDevice ====
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Gerätes, wird heute pauschal nach ''Choice'' umgeleitet und sollte nicht mehr verwendet werden!


=== ReSpeak ===
=== ReSpeak ===
Zeile 1.333: Zeile 1.335:


Beispiel-Sätze:
Beispiel-Sätze:
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
was hast du gesagt
was hast du gesagt
kannst du das wiederholen
kannst du das wiederholen
Zeile 1.341: Zeile 1.343:


Example-Rhasspy-Sentences:
Example-Rhasspy-Sentences:
<syntaxhighlight lang="text">
<syntaxhighlight lang="ini">
[de.fhem:ReSpeak]
[de.fhem:ReSpeak]
was hast du gesagt
was hast du gesagt
Zeile 1.347: Zeile 1.349:
ich habe dich nicht verstanden
ich habe dich nicht verstanden
</syntaxhighlight>
</syntaxhighlight>
=== Shortcuts ===


== Eigene Intents erstellen ==
== Eigene Intents erstellen ==
Es ist auch möglich, eigene Intents zu erstellen, sollten die hier vorgestellten nicht reichen.
Es ist auch möglich, eigene Intents zu erstellen, sollten die hier vorgestellten nicht reichen. Dafür gibt es zwei Wege: Für kleinere Intents können die Möglichkeiten von FHEMs [[99_myUtils_anlegen|99_myUtils.pm]] genutzt werden. Aufwendigere Intents können in jeweils eigenen Dateien abgelegt werden, die dann von RHASSPY ausgelesen werden.
Dafür gibt es zwei Wege: Für kleinere Intents können die Möglichkeiten von FHEMs [[99_myUtils_anlegen|99_myUtils.pm]] genutzt werden. Aufwendigere Intents können in jeweils eigenen Dateien abgelegt werden, die dann von RHASSPY ausgelesen werden.
 
 
=== Intents in 99_myUtils.pm ===
=== Intents in 99_myUtils.pm ===


As example an intent that repeats the last voice response Rhasspy has spoken.
Hier ein (veraltetes, siehe oben) Beispiel, mit dem die letzte ''voice response'' wiederholt werden kann.


Add the following sub to your 99_myUtils.pm:
Ergänze deine 99_myUtils.pm mit folgender Funktion:


<syntaxhighlight lang="perl">
<syntaxhighlight lang="perl">
Zeile 1.371: Zeile 1.367:
</syntaxhighlight>
</syntaxhighlight>


Then create or edit the attribut rhasspyIntents and add the following text. One Intent per line.
Ergänze im Attribut ''rhasspyIntents'' folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
Respeak=Respeak()
Respeak=Respeak()
</syntaxhighlight>
</syntaxhighlight>


Last add a new sentence to sentence.ini of your Rhasspy base:
Ergänze einen neuen Intent in deinen ''sentence.ini'' an der Rhasspy base:


<syntaxhighlight lang="text">
<syntaxhighlight lang="ini">
[de.fhem:Respeak]
[de.fhem:Respeak]
was hast du gesagt
was hast du gesagt
</syntaxhighlight>
</syntaxhighlight>


=== Intents in eigenen Dateien ===
Beispiele: https://github.com/fhem/fhem-rhasspy/blob/main/FHEM/99_RHASSPY_Utils_Demo.pm


=== Intents in eigenen Dateien ===
==== Beispiel: Raumwechsel ====
Beispiel: https://github.com/fhem/fhem-rhasspy/blob/main/FHEM/99_RHASSPY_Utils_Demo.pm
Erforderlichen Code in das Modulverzeichnis holen und laden:  
<syntaxhighlight lang="perl">{ Svn_GetFile('contrib/RHASSPY/99_RHASSPY_Utils_siteId2room.pm', 'FHEM/99_RHASSPY_Utils_siteId2room.pm',sub(){ RHASSPY_Utils_siteId2room_Initialize() }) }</syntaxhighlight>Ergänze im Attribut ''rhasspyIntents'' folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):
<syntaxhighlight  lang="perl">
siteId2room=RHASSPY::siteId2room::siteId2room(NAME,DATA)
</syntaxhighlight>Ergänze einen neuen Intent in deinen ''sentence.ini'' an der Rhasspy base:
<syntaxhighlight lang="ini">
[de.fhem:siteId2room]
( Ortswechsel  | begib dich ) ( ins | in den ) $de.fhem.Room{Room}
</syntaxhighlight>


== Tipps & Tricks ==
== Tipps & Tricks ==
===Custom Converter für reelle Zahlen===
===Custom Converter für reelle Zahlen===
Rhasspy is (currently) not able to recognize spoken Real numbers (e.g. ten point five) as numbers. Instead it interprets them as two numbers and "point".
{{Randnotiz|RNTyp=g|RNText=RHASSPY enthält für <code>{Value}</code> nunmehr auch einen Konverter, der Leerzeichen aus Zahlenwerten entfernt. Enthält dieses Datenfeld bei der Übergabe aus Rhasspy z.B. <code>- 10 .5</code>, wird dies automatisch in <code>-10.5</code> umgewandelt.}}
Rhasspy kann (derzeit) keine gesprochenen reellen Nummern (z.B. 22,5) als Nummer erkennen. Stattdessen interpretiert es die Zahl als zwei Nummern und einen Punkt.


To use Real numbers correctly, you have to create a [https://rhasspy.readthedocs.io/en/latest/training/#converters custom converter] and use this in your sentences.
Um reelle Nummern richtig zu verwenden, muss ein [https://rhasspy.readthedocs.io/en/latest/training/#converters Custom Converter] erstellt und in der sentences.ini verwendet werden.


To do this, create a file under <code><profile>/converters</code>, name it as you wish and make it executable.
So ein Konverter kann erstellt werden, in dem unter <code><profile>/converters</code> ein neues File mit beliebigem Namen angelegt wird. Der Name muss aber dann auch genau so als Converter in der sentences.ini verwendet werden. Anschließend muss die Datei noch ausführbar gemacht werden.
E.g.
 
Z.B.:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
touch .config/rhasspy/profile/en/converters/customFloat
touch .config/rhasspy/profile/en/converters/customFloat
Zeile 1.400: Zeile 1.408:
</syntaxhighlight>
</syntaxhighlight>


Then fill it with the following example-code:
Folgender Beispiel-Code kann danach in die Datei geschrieben werden:
<syntaxhighlight lang="python">
<syntaxhighlight lang="python">
#!/usr/bin/env python3
#!/usr/bin/env python3
Zeile 1.406: Zeile 1.414:
import json
import json


# [22, ".", 5]
# von Rhasspy als JSON übergebene/n Wert/e einlesen
args = json.load(sys.stdin)
args = json.load(sys.stdin)


# 22.5
# wenn im deserialisierten JSON nur ein Wert ist, wird der als Ergebnis genommen
num = "".join(str(s).strip() for s in args)
# sind mehrere Werte vorhanden (z.B. 22,.,5), werden die zu einem einzelnen String zusammen gesetzt
if type(args) == int:
    num = args
else:
    num = "".join(str(s).strip() for s in args)


# Ergebnis wird an Rhasspy übergeben
print(num)
print(num)
</syntaxhighlight>
</syntaxhighlight>


Restart Rhasspy and afterwards you can use your custom-converter in your sentences.
Nach einem Neustart von Rhasspy kann dieser Converter dann verwendet werden.


<syntaxhighlight lang="text">
<syntaxhighlight lang="ini">
[SetHeating]
[de.fhem.SetNumeric]
set heating [to] (0..30 [point:. 0..99]){temp!customFloat}
stelle die heizung auf (0..30 [komma:. 0..99]){Value!customFloat}
</syntaxhighlight>
</syntaxhighlight>




Zeile 1.439: Zeile 1.453:
</syntaxhighlight>
</syntaxhighlight>
and add a response to the SetOnOff-Mapping of a device
and add a response to the SetOnOff-Mapping of a device
<syntaxhighlight lang="text">
<syntaxhighlight lang="perl">
SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}
SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}
</syntaxhighlight>
</syntaxhighlight>


== Links ==
== Links ==
* [https://github.com/rhasspy/rhasspy Rhasspy auf Github]
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]
* [https://github.com/razzo04/rhasspy-mobile-app App für Adroid-Satelliten]
* [https://github.com/razzo04/rhasspy-mobile-app App für Android-Satelliten]
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]
[[Kategorie:Sprachsteuerung]]
[[Kategorie:Sprachsteuerung]]

Aktuelle Version vom 18. September 2022, 09:54 Uhr


Clock - Under Construction.svg An dieser Seite wird momentan noch gearbeitet.


Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 10_RHASSPY.pm.

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!
Schematische Darstellung von Rhasspy und FHEM/RHASSPY

Einleitung

Rhasspy ist eine Open Source Server-Lösung für Spracherkennung und Sprachsteuerung, welche auf einem RaspBerry Pi oder einem anderen Debian-basierten Serversystem lauffähig ist. Es handelt sich dabei um eine Sammlung von Programmen (=Skripten in der Python-Sprechweise), die unter einer einheitlichen und sehr flexiblen Benutzungsoberfläche zusammengefasst sind. Die Besonderheit an Rhasspy ist, dass es nach der Installation komplett offline betrieben werden kann. 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 Modul 00_MQTT2_CLIENT.pm um Nachrichten zu empfangen und zu senden. Daher ist es notwendig, eine Instanz dieses Moduls als FHEM-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!

Konventionen

Info blue.png
In diesem Artikel und der CommandRef werden folgende Schreibweisen verwendet:
  • RHASSPY bezieht sich auf das FHEM-Modul
  • rhasspy bezieht sich auf das das FHEM-Device
  • Rhasspy bezeichnet die (zentrale) Serverinstallation



Info blue.png
Dialoge werden in RHASSPY verwaltet wie hier beschrieben. Dialoge werden also nicht funktionieren, sobald für das Dialogue-Management etwas anderes als RHASSPY eingestellt ist


Erste Schritte

Die Installation und Erstinbetriebnahme von Rhasspy wird in einer Schnellstart-Anleitung erklärt: RHASSPY/Schnellstart Diese Anleitung sollte auch befolgt werden, wenn man sich sehr gut mit FHEM auskennt. Wer dies erfolgreich absolviert hat, kann gleich zu Abschnitt Set-Befehle (SET) weiterspringen, und/oder die Vertiefung durcharbeiten.

Details zur Verwaltung des RHASSPY Moduls

Das Modul ist seit September 2022 im regulären FHEM-update enthalten.

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 hermes/hotword/toggleOn     hermes/hotword/toggleOff hermes/tts/say
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 hermes/hotword/toggleOn hermes/hotword/toggleOff hermes/tts/say [zusätzliche Subscriptions für andere MQTT-Module]

Definition von RHASSPY (DEF)

define <name> RHASSPY <baseUrl> <devspec> <defaultRoom> <siteId> <language> <fhemId> <prefix> <useGenericAttrs> <handleHotword> <autoTraining> <encoding>
Info green.pngRHASSPY verwendet sehr oft <parseParams>. Nicht nur im Define, sondern z.B. auch, um Attribut-Werte auszuwerten. Es sollten also alle Parameter im Define in der Form key=value angegeben werden.).
Info green.pngRHASSPY führt jede Menge Daten aus unterschiedlichen Quellen zusammen um seine Funktion erfüllen zu können. Die endgültige Daten-Struktur, die RHASSPY verwendet, kann mittels des list-Kommandos angezeigt werden. Es wird empfohlen, sich diese Daten-Struktur auf jeden Fall anzusehen. Vor allem dann, wenn etwas nicht wie gewünscht funktioniert.

Alle Parameter sind optional. Die meisten werden im Normalfall gar nicht benötigt (z.B. fhemId, prefix), oder können auf den automatisch vergebenen Werten belassen werden. 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 und siteId, das für Tests und andere Text-Eingabemöglichkeiten wichtig ist.

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 wird devspec=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.

Info blue.png
Dialoge werden in RHASSPY verwaltet wie hier beschrieben. Dialoge werden also nicht funktionieren, sobald für das Dialogue-Management etwas anderes als RHASSPY eingestellt ist


siteId

Wenn bestimmte Funktionen genutzt werden sollen, muss die RHASSPY-Instanz für Rhasspy als Satellit eigenständig angesprochen werden können. Hierzu muss dann eine eindeutige Kennung vergeben werden, und diese ist insbesondere dann auch in der für die Intent Recognition zuständigen Rhasspy-Komponente als Satellit anzugeben. Wird diese nicht explizit gesetzt, wird diese aus dem language-Kürzel und der fhemId zusammengesetzt.

Info blue.png
Für die Funktionalitäten test_sentence, test_file, msgDialog und AMAD.* ist es zwingend erforderlich, die siteId in der Rhasspy-Intent-Recognition-Komponente einzutragen!


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 und die automatisierte Eigenschaftenerkennung. 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

autoTraining

Da Änderungen auf der FHEM-Seite (z.B. bei Änderungen der rhasspyNames) auch Rhasspy bekannt gemacht werden müssen und anschließend ein Training erfolgen muss, damit Rhasspy diese Änderugnen ebenfalls berücksichtigt, übergibt RHASSPY derartige Änderungen nach Ablauf von einer Minute seit der letzten Änderung an Rhasspy und initiiert dann ein Training. Setzt man diesen Schlüssel auf "0", wird diese Funktion deaktiviert, alle anderen numerischen Werte werden als Änderung dieses Timeouts (in Sekunden) interpretiert Default ist autoTraining=60


Info blue.png
Nach dem Definieren eines RHASSPY-Modules sollte das IODev manuell gesetzt werden um ein automatische IO-Zuweisung zu verhindern. Z.B. 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 neuen - oder überschreibt einen alten - Slot in Rhasspy

  • slotname und slotdata sind verpflichtend
  • overwrite ist optional. Default ist overwrite=true. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.
  • training ist optional. Default ist training=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 und text sind verpflichtend!

Beispiel:

set <rhasspyDevice> speak siteId="wohnzimmer" text="This is a test"

textCommand

Sendet ein Text-Kommando an Rhasspy.

Beispiel:

set <rhasspyDevice> textCommand schalte das licht ein

Mangels siteId erfolgt hier keine Rückmeldung zum ausgeführten Kommando.

trainRhasspy

Startet das Training von Rhasspy.

Beispiel:

set <rhasspyDevice> trainRhasspy

update

update kennt diverse Abstufungen:

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.) und ein Training zu starten. Wenn autoTraining nicht deaktiviert wurde, erfolgt dies bei Änderungen an relevanten Attributen nach einiger Zeit zwar automatisch, über diesen Befehl kann aber sichergestellt werden, dass dies unmittelbar und ohne Vergleich mit Alt-Daten erfolgt.

Beispiel:'

set <rhasspyDevice> update devicemap

update 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

update 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 (Hinweis: Die ersten beiden Teile de und fhem hängen von der DEF des RHASSPY-Devices ab)
  • de.fhem.Device
  • de.fhem.Device-genericDeviceType
  • de.fhem.Device-Intent
  • de.fhem.Group
  • de.fhem.Room
  • de.fhem.MediaChannels
  • de.fhem.Color
  • de.fhem.NumericType

Beispiel:

set <rhasspyDevice> update slots

slots_no_training

Wie slots, aber ohne Training nach dem Update.

Beispiel:

set <rhasspyDevice> update slots_no_training

update 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

update 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

update 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"


Info blue.png
Bitte nicht vergessen, dass nach jeder Änderung an RHASSPY oder an einem von RHASSPY gesteuerten Gerät ein update devicemap ausgeführt werden sollte, v.a. wenn das autoTraining in der DEF deaktiviert wurde!


Get-Befehle (GET)

export_mapping

Liefert für das angegebene Device ein "klassisches" rhasspyMapping, das dann als Basis für eigene Weiterentwicklungen genutzt werden kann. Funktioniert ggf. nicht in allen Fällen (z.B. bei SetScene und dem Szenen-Format für HUEBridge).

test_file

Anzugeben ist der Dateiname (einschl. Pfad)

Die Datei wird zeilenweise eingelesen und an die Rhasspy-Komponente für die Intent-Erkennung übergeben. Das Ergebnis der Analyse wird in eine File geschrieben, die auf '_result.txt' endet. stop als Dateiname unterbricht einen laufenden Test. Die ggf. abgeleiteten Kommandos werden nicht ausgeführt, FHEM wird während eines laufende Tests auch keine anderen Kommandos von der Rhasspy-Seite her annehmen. Für diese Funktion ist es zwingend erforderlich, dass die siteId der RHASSPY-Instanz bei der Intent-Recognition-Komponente in Rhasspy als Satellit angegeben wurde.

test_sentence

Es kann ein beliebiger einzelner Satz eingegeben werden, die Ausgabe erfolgt dann in einem eigenen Dialogfeld, ansonsten gilt sinngemäß dasselbe wie bei test_file.

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

Info green.pngBei Nutzung von configDB wird diese Datei aus der Datenbank gelesen.

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 im SVN 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

Info blue.png
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.

Info blue.png
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 das i 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 vor f

  • 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 ist 15.

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 auf false gesetzt werden.

  • timeouts

Die Keywörter confirm und default können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern. Beispiel: timeouts: confirm=25 default=30

confidenceMin

Rhasspy ermittelt u.A. auch einen Indikator, anhand dem bestimmt werden kann, wie genau ein Satz erkannt wurde. Ist dieser confidence-Wert sehr bzw. zu niedrig, kann es erwünscht sein, die (falsch erkannte) Absicht des Sprechers nicht umzusetzen. RHASSPY nutzt daher standardmäßig einen Mindestwert von 0.66, bei allen darunter liegenden Werten wird das betreffende Kommando nicht ausgeführt. Dies kann über diesen Tweak global (key: default) oder feiner pro Intent festgelegt werden. Beispiel: confidenceMin= default=0.6 SetMute=0.4 SetOnOffGroup=0.8 SetOnOff=0.8

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 Intents, regex 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 wird eine Rückfrage ausgegeben, auf diese muss dann (innerhalb des gesetzten Timeouts) unbedingt ein Mode:OK-Wert vom ConfirmAction-Intent gesendet werden. Jede andere Wert für Mode 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, Choice, 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-.

gdt2groups

Dieser Eintrag ermöglicht es, alle Geräte eines generichDeviceType innerhalb der automatischen Erfassung automatisch einer oder mehreren Gruppen zuzuordnen. Die Vorgaben in diesem Eintrag werden nicht übernommen, wenn am jeweiligen Einzelgerät das Attribut rhasspyGroup gesetzt ist. Hier eine deutschsprachige Vorbelegung als Beispiel: gdt2groups= blind=rollläden,rollladen thermostat=heizkörper light=lichter,leuchten

mappingOverwrite

Wird diese Option aktiviert, wird bei gesetztem rhasspyMapping-Attribut an einem Device alles gelöscht, was die automatisierte mapping-Erkennung anhand des genericDeviceType erkannt hatte. Sonst ird jeweils nur überschrieben, was als Intent im rhasspyMapping dieses Geräts angegeben ist.

Syntax:

mappingOverwrite=1

extrarooms

Komma-separierte Liste von weiteren Räumen, die die aus der Generierung der Device-Map bekannten Räume erweitert. Dies kann z.B. für CustomIntents benötigt werden. Diese werden in die Slots für rooms und mainrooms integriert. Beispiel:

extrarooms= barn,music collection,cooking recipies


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

Benutzerdefinierte Readings

Um das Verhalten von RHASSPY beeinflussen zu können, können neben den bei den Attributen verfügbaren Tweaks auch die folgenden Readings genutzt - und v.a. auch im laufenden Betrieb immer weider geändert - werden:

  • siteId2room_ Falls keine explizite Raum-Information in den an RHASSPY weitergegebenen Daten enthalten ist, ermittelt das Modul den Raum in der Regel aus dem Namen der siteId. So werden z.B. alle raumlosen Anweisungen von einem Satelliten names schlafzimmer, im Raum schlafzimmer ausgeführt werden (wenn möglich). Die Gruppenfunktion von Rhasspy wird unterstützt, so wird z.B. wohnzimmer.vorne ebenfalls automatisch dem Raum wohnzimmer zugeordnet. Über passende Angaben in siteId2room-Readings kann dieses Verhalten modifiziert werden: setreading siteId2room_mobile_phone1 wohnzimmer wird RHASSPY veranlassen, den Satelliten mobile_phone1 dem Raum wohnzimmer zuzuweisen. Ein Beispiel, mit dem dies per Sprachkommando erfolgt, ist in contrib zu finden, mit der mobilen Satelliten per Funktionsaufruf in einem rhasspyIntent einem neuen Raum zugewiesen werden können.
  • siteId2doubleSpeak_ RHASSPY antwortet immer über den Satelliten, von dem die jeweilige Sprachanweisung kam. Manchmal kann es erwünscht sein, zusätzliche Sprachrückmeldungen an einen weiteren Satelliten zu geben - z.B. weil der betreffende Lautsprecher (zeitweise) ausgeschaltet ist. Ist ein entsprechendes Reading gesetzt, erfolgen (zusätzliche!) Sprachausgaben an den dort als Readingwert angegebenen zweiten Satelliten; das Namensschema der Readings entspricht dem für site2room.

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 (bzw. nach Abschluss aller Änderungen) an den folgenden Attributen muss ein update devicemap ausgeführt werden. In der Regel wird dies automatisch veranlasst, aber wenn dies deaktiviert sein sollte, würden sonst weder RHASSPY, noch Rhasspy von der Änderung erfahren.
  • RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das update devicemap-Kommando aktualisiert und kann mittels list-Befehl angezeigt werden. Für diesen HASH werden alle Namen und sonstige "Labels" in Kleinbuchstaben umgewandelt. Falls man Slots händisch befüllt, 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 überschreiben, was weniger speziell ist. Ein gesetzter alias wird also verhindern, dass der (technische) Device-Name verwendet wird. Aber ein gesetztes Attribut alexaName, gassistantName oder siriName wird (auch) 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/Funktionalität. Zeilenumbrüche müssen also an den richtigen Stellen gesetzt werden.

genericDeviceType

Ist dieses Attribut gesetzt und entspricht der Devicename der devspec, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln.

Derzeit werden folgende Werte für das Attribut 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 oder alias) des Devices
  • der (FHEM-)Raum, in dem sich das Device befindet.
  • die Gruppe, zu der das Device gehört (ggf. unter Beachtung des Schlüssels gdt2groups aus rhasspyTweaks)
  • wie Informationen vom Gerät abgefragt werden können
  • wie Werte/Status am Gerät gesetzt werden können

Die Verwendung von genericDeviceType ist der einfachste Weg, wie man FHEM-Devices dazu bringen kann, mit RHASSPY zusammenzuarbeiten. Manchmal liefert genericDeviceType 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, der erste Wert in dieser Liste dient intern als Hauptname (alias), z.B. in Auswahldialogen.

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 (der erste Wert ist wieder der Hauptraum für Auswahldialoge etc.).

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. Beachte: Die automatisierte Zuweisung zu einem Raum kann durch siteId2room_.*-Readings modifiziert werden (s.o.).

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.


rhasspySpecials

Dieses Attribut wirkt ähnlich wie rhasspyTweaks, verändert allerdings nur jeweils das Verhalten des Geräts, bei dem es gesetzt ist. Auch dieses Attribut wird zeilenweise eingelesen, es können ein oder mehrere der folgenden Optionen gesetzt werden:

group

Wird dieser Schlüssel gesetzt, wird das Gerät bei Gruppenaktionen nicht direkt adressiert, sondern die hier angegebene Gruppe. Details hierzu sind in Vertiefung - Timing-Aspekte zu finden.
Beispiel:
attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights

numericValueMap

Ermöglicht es, statt der allgemeinen Methode zum Umgang mit numerischen Werten einzelnen Werten spezielle Kommandos zuzuweisen. Dies kann z.B. hilfreich sein, um spezielle Positionen für Rollladengeräte anzusteuern.
Beispiel:
attr blind1 rhasspySpecials numericValueMap:10='Event Slit' 50='myPosition'
führt dazu, dass ein numerischer Wert von 10 (im {Value}-key) das Kommando set blind1 Event Slit ausführt.

venetianBlind

Siehe Vertiefung - Jalousien

colorCommandMap

Sowie **colorTempMap** und **colorForceHue2rgb** Siehe Vertiefung - Farben

priority

Ermöglicht es, Rückfragen zu vermeiden, wenn mehrere Geräte für bestimmte Aktionen in Frage kommen. Siehe Einer statt alle

confirm

Ist eine Möglichkeit, Geräte nur nach Rückfrage und Bestätigung zu schalten (ähnlich wie confirmIntents in rhasspyTweaks). Es können entweder einfach nur Intent-Namen angegeben werden, oder Paare von **Intent** und zugehöriger **response**:

SetOnOff="Soll $target wirklich $Value geschaltet werden" SetScene

confirmValueMap

Kann spezielle Übersetzungen für $Value enthalten, z.B. für Rollladen-Geräte:

confirm: SetOnOff="wirklich $Value $target"
confirmValueMap: on=öffnen off=schließen

scenes

Wird bei der automatisierten Erfassung erkannt, dass ein Gerät das Setzen von Szenen unterstützt, werden die erkannten Szenen-Namen an Rhasspy übergeben. Da diese häufig technischer Natur sind, eignen sie sich nicht für eine Spracherkennung. Über diesen Schlüssel können daher sprechbare Namen für jede Szene vergeben werden, und/oder einzelne bzw. alle Szenen von der Erkennung ausgenommen werden. Der Kenner none löscht die Szene von der Liste der übermittelten Szenen, wird die Kombination all=none angegeben, wird dieses Gerät insgesamt von der Vorbereitung für den Intent SetScene ausgeschlossen. Beispiel:

attr lamp1 rhasspySpecials scenes:scene2="Kino zu zweit" scene3=Musik scene1=none scene4=none

Siehe auch Vertiefung - echte Szenen.

Veraltete Attribute

In der Regel sollte es ausreichen, die zu steuernden Devices über die oben genannten Attribute zu konfigurieren. Es gibt jedoch noch zwei ältere Methoden. Um diese zu verwenden, muss zuerst jeweils ein entsprechendes User-Attribut im FHEM-Device, das damit gesteuert werden soll, angelegt werden.

rhasspyChannels

Das Attribut wird vom Intent MediaControls verwendet. Es informiert den Intent darüber, welche (Medien-)Kanäle vorhanden sind und welcher FHEM-Befehl oder Perl-Code auszuführen ist, wenn auf diesen Kanal geschaltet werden soll.

In diesem Attribut muss eine Zeile pro (Medien-)Kanal verwendet werden.

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

Ältere Methode, die verwendet werden kann, um Lichtfarben zu wechseln. Es wird nachdrücklich empfohlen, die neueren Methoden über die (nummerisch zu übergebenden) allgemeinen Farbwerte und/oder ein colorCommandMap oder colorTempMap (siehe rhasspySpecials) zu konfigurieren!

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

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.
  • RHASSPY erstellt bei einem update slots auch Slots je nach Möglichkeiten der Geräte oder Gruppen. Unterstützt ein Gerät zum Beispiel den Intent GetNumeric, wird auch ein Slot de.fhem.Device-GetNumeric erstellt. Ein Gerät, dass ein- und ausgeschalten werden kann, wird im Slot de.fhem.Device-SetOnOff untergebracht. Ein einzelnes Gerät kann sich auch in mehreren Slots befinden. Um eine möglichst genaue Spracherkennung zu gewährleisten, ist empfohlen, diese spezifischen Slots - statt einfach nur de.fhem.Device oder de.fhem.Group - zu verwenden.


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:

Optionale Argumente:

  • response Eine benutzerdefinierte Antwort auf den Befehl


Beispiel-Sätze:

schalten das licht ein
schließe den rollladen im schlafzimmer
starte die kaffeemaschine


Beispiel Rhasspy-Sentences:

[de.fhem:SetOnOff]
(schalte|schalt|mache|mach|stelle|stell|starte) [den|die|das] $de.fhem.Device-SetOnOff{Device} [[(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room}] (an|ein){Value:on}
(schalte|schalt|mache|mach|stelle|stell) [den|die|das] $de.fhem.Device-SetOnOff{Device} [[(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room}] aus{Value:off}
(fahre|fahr) [den|die|das] $de.fhem.Device-blind{Device} [[(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room}] ((hoch|auf){Value:on}|(zu|runter){Value:off})

Verpflichtende Tags:

  • Value:on und/oder Value: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 (ggf. u.A. auch) der gewählten Gruppe angehören (einzustellen über das Attribut group bzw. rhasspyGroup, oder allgemein kommend aus rhasspyTweaks - gdt2groups).

Beispiel-Sätze:

schalte die lampen in der küche aus
schließe alle rollläden im schlafzimmer
schalte sämtliche lampen aus


Beispiel Rhasspy-Sentences:

[de.fhem:SetOnOffGroup]
\[(schalt|mach)] (die | alle | sämtliche ) $de.fhem.Group-SetOnOff{Group} [[in|im|in der|auf der] [( überall:global | $de.fhem.Room ){Room}] ein{Value:on}
\[(schalt|mach)] (die | alle | sämtliche ) $de.fhem.Group-SetOnOff{Group} [[in|im|in der|auf der] [( überall:global | $de.fhem.Room ){Room}] aus{Value:off}
(öffne{Value:on}|schließe{Value:off}) (alle | sämtliche ) $de.fhem.Group-blind{Group} [[in|im|in der|auf der] [( überall:global{Room:global} | $de.fhem.Room{Room} )] 
(fahr|fahre|mach|mache) [den|die|das] $de.fhem.Group-blind{Group} [[(im|in dem|in der)] ( überall:global{Room:global} | $de.fhem.Room{Room} )] ( auf{Value:on} | hoch{Value:on} | zu{Value:off} | runter{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-SetOnOff{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-SetOnOff{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


SetTimedOnOffGroup

Intent um eine Gruppe von Geräten für eine bestimmte Zeit zu schalten.

Devices müssen ein SetOnOff-Mapping haben, in einer Gruppe sein und die SetExtentions unterstützen.


Beispiel-Sätze:

schalte alle lichter in der küche für fünfzig sekunden ein
schalte alle licher bis zwei uhr ein


Beispiel Rhasspy-Sentences:

[de.fhem:SetTimedOnOffGroup]
schalte $de.fhem.Group-SetOnOff{Group} [$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.Group-SetOnOff{Group} [$de.fhem.Room{Room}] bis (0..24){Hourabs!int} [(1..60){Min!int}] (ein{Value:on}|aus{Value:off})

Verpflichtende Tags:

  • Value
  • Group
  • Hour oder Min oder Sec oder Hourabs

Optionale Tags:

  • Room


GetOnOff

Intent um den aktuellen Zustand eines Gerätes zu erfragen.


Beispiel-Mappings:

GetOnOff:currentVal=state,valueOff=closed
GetOnOff:currentVal=state,valueOn=on
GetOnOff:currentVal=pct,valueOff=0

Argumente: Hinweis: nur valueOn ODER valueOff müssen gesetzt werden. Der jeweils andere Wert bekommt den anderen Status.

  • currentVal Reading aus dem der aktuelle Status hervorgeht
  • valueOff Wert, der den Zustand aus beschreibt
  • valueOn Wert, der den Zustand an beschreibt

Optionale Argumente:

  • response Eine benutzerdefinierte Antwort auf den Befehl


Beispiel-Sätze:

ist das licht im bad ein
ist das fenster im wohnzimmer geöffnet
läuft die waschmaschine


Beispiel Rhasspy-Sentences:

[en.fhem:GetOnOff]
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (ein|geöffnet){State:on}
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (aus|geschlossen){State:off}

Die Zustände ein und aus sollten in unterschiedlichen Sentences sein und müssen {State:on} und {State:off} beinhalten.

Verpflichtende Tags:

  • State:on und/oder State:off
  • Device

Optionale Tags:

  • Room


SetNumeric

Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw..

Beispiel-Mappings:

SetNumeric:currentVal=pct,cmd=dim,minVal=0,maxVal=99,step=25,type=brightness
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volume
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness

Argumente:

  • currentVal Reading, in dem der aktuelle Wert zu finden ist (wird zwingend benötigt).
  • part Kann genutzt werden, um den Wert aus **currentVal** in mehrere Teile zu zerlegen (getrennt wird am Leerzeichen). Z.B. wenn currentVal 23 C ist, wird **part=0** **23** ergeben. Optionaler Parameter.
  • cmd Das **Set**-Kommando des Geräts, das in Folge des Sprachkommandos ausgeführt werden soll. (Notwendiger Parameter).
  • minVal Niedrigster zugelassener Wert, optional.
  • maxVal Höchster zugelassener Wert, optional.
  • step Schrittweite für relative Änderungen wie mach lauter. Optional. Default: 10.
  • map Derzeit wird ausschließlich die Angabe **percent** ausgewertet. Optionaler Parameter, der bewirkt, dass alle Angaben als Prozentwert (zwischen minVal und maxVal) interpretiert werden und entsprechend gerechnet wird. So wird z.B. eine Leuchte mit **minVal=0** und **maxVal=255** beim Befehl "stelle das Licht auf 50" dies so verstehen, als wäre die Anweisung "stelle das Licht auf 50 Prozent" gewesen. Das Licht wird daher auf 127 gestellt, und nicht auf (absolut) 50.
  • type Zur Unterscheidung, falls mehrere SetNumeric-Intents für das Gerät möglich sind. Empfohlener Parameter.

Gut zu wissen: Um Kommandos wie **lauter** oder **leiser** ohne Angabe eines Gerätes ausführen zu können, muss RHASSPY zunächst ermitteln, welches Gerät gerade überhaupt etwas wiedergibt ist. Daher nutzt es die GetOnOff-Mappings, um festzustellen, welches Gerät vom **type=volume** überhaupt angeschaltet ist. Dabei wird wie üblich zunächst im aktuellen rhasspyRoom gesucht, bevor die Suche außerhalb fortgesetzt wird. Setzt man also Mappings manuell, ist es ratsam, auch ein **GetOnOff**-Mapping zu setzen.


Zulässige Typen sind:

  • brightness
  • setTarget
  • temperature
  • volume


Beispiel-Sätze:

Stelle das Licht auf 30 Prozent
Mach das Radio leiser
Stell die Temperatur im Wohnzimmer 2 Grad wärmer


Beispiel Rhasspy-Sentences: (Beachte: Wenn wie hier im Beispiel reele Zahlen (mit Komma) ermöglicht werden sollen ("acht Komma fünf"), wird ein Custom Converter für reelle Zahlen benötigt)

[de.fhem:SetNumeric]
den=(den|die|das)
cmdmulti=(schalte|schalt|mache|mach|stelle|stell)
rooms=([(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room})
<cmdmulti> [<den>] $de.fhem.Device-SetNumeric{Device} auf (0..100){Value!int} [Prozent{Unit:percent}]
\[<cmdmulti>] [die Lautstärke [an|am]] [dem|<den>] $de.fhem.Device-media{Device} [<rooms>] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}
<cmdmulti> [die Lautstärke [an|am]] [dem|<den>] [$de.fhem.Device-media{Device}] [<rooms>] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}
<cmdmulti> [<den>] $de.fhem.Device-thermostat{Device} [<rooms>] [um] [(0..10){Value!int}] [Grad{Unit.degree}] ( wärmer:tempUp | kälter:tempDown ){Change}
<cmdmulti> [<den>] $de.fhem.Device-light{Device} [<rooms>] [um] [(0..30 [Komma:. 1..9]){Value!customFloat}] [Prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}
<cmdmulti> [<den>] ( $de.fhem.Device-light | $de.fhem.Device-media |$de.fhem.Device-blind){Device}  [<rooms>] auf [(0..30 [Komma:. 1..9]){Value!customFloat}]
\[deutlich{Factor:2}] ( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [<de.fhem:SetOnOff.rooms>]
( halte | stoppe | stop ) [<den>] $de.fhem.Device-blind{Device} [<de.fhem:SetOnOff.rooms>] [an] {Change:cmdStop}

Derzeit werden folgende Typen für das Feld {Change} ausgewertet:

  • tempUp / tempDown
  • volUp / volDown
  • lightUp / lightDown
  • setUp / setDown

Notwendig sind:

  • Change oder Type
  • Value oder Change

Optionale Tags:

  • Device
  • Room
  • Unit
  • Factor Dieser Wert wird mit der Standard-Schrittweite (step im Mapping) multipliziert

SetNumericGroup

Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. Die Funktionsweise entspricht dabei dem des Intents SetNumeric, wobei eben statt eines einzelnen Devices eben ein oder mehrere Geräte über ihren Gruppennamen angesprochen werden. Statt des optionalen Tags Device ist daher der Tag Group zu übergeben. Aus der Adressierung mehrerer Geräte ergeben sich einige Besonderheiten, die in der RHASSPY/Vertiefung, dort speziell auch im Punkt Beispiel SetOnOffGroup näher erläutert sind. Wesentliche zu beachtende Aspekte sind:

  • Vermeidung von Funk-Überschneidungen (Specials partOf und async_delay)
  • Begrenzung der Gruppenzugehörigkeit durch die Raumzugehörigkeit (und die Aufhebung dieser Beschränkung durch die Übergabe des speziellen Raums global)

GetNumeric

Intent, mit dem man Werte erfragen kann, wie z.B. die aktuelle Temperatur, Helligkeit, Lautstärke, ...


Beispiel-Mappings:

GetNumeric:currentVal=temperature,part=1,type=temperature
GetNumeric:currentVal=pct,map=percent,minVal=0,maxVal=100,type=brightness
GetNumeric:currentVal=volume,type=volume
GetNumeric:currentVal=humidity,part=0,type=humidity
GetNumeric:currentVal=batteryPercent,type=battery

Argumente:

  • currentVal Das Reading, das den abzufragenden Wert enthält
  • part Teile aus currentVal ableiten, indem am Leerzeichen getrennt wird. Ist currentVal beispielsweise 23 C, entspricht part=1 dem Wert 23
  • map Die Funktionswiese entspricht dem SetNumeric Intent. Wandelt den vorhandenen Wert in eine Prozent-Angabe um.
  • minVal Niedrigster zulässiger Wert (nur benötigt, wenn map angegeben ist).
  • maxVal Höchster zulässiger Wert (nur benötigt, wenn map angegeben ist).
  • type Dient der Unterscheidung zwischen mehreren GetNumeric-Anfragemöglichkeiten für dasselbe Gerät (auch relevant für SetNumeric-Anweisungen).

Mögliche Abfragetypen:

  • humidity
  • battery
  • brightness
  • desired-temp
  • setTarget
  • soilMoisture
  • temperature
  • volume
  • waterLevel

Aus dem Abfragetypen ergibt sich die von RHASSPY ausgewählte Antwort.

Beispiel Sätze:

what is the temperature in the living room
how bright is the floor lamp
what is the volume of the tv


Beispiel Rhasspy-Sentences:

[en.fhem:GetNumeric]
#actual temperature
(what is|how high is) the temperature{Type:temperature} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]

#desired-temperature
\[what is the|how high is the] (desired temperature){Type:desired-temp} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]

#volume
(what is the|how high is the) volume{Type:volume} $de.fhem.Device-GetNumeric{Device} [$de.fhem.Room{Room}]

Required tags:

  • Device
  • Type

Optional tags

  • Room

GetState

Intent to get specific information of a device. The respone can be defined.


Beispiel-Mappings:

GetState:response="Temperature is [$DEVICE:temp] degree at [Thermo:hum] percent humidity"
GetState:response={my $value=ReadingsVal("$DEVICE","brightness",""); return "Brightness is $value";}

Options:

  • response Text for the response Rhassyp will give.
To use values from FHEM use format [Device:Reading].
A comma within the response has to be escaped (\, instead of ,).
Or you can use Perl-code enclosed in curley brackets to define the response.
Mixing text and Perl-code is not supported.


Example-Sentences:

How is the state of the thermostat in the kitchen
state light in livingroom
state washer


Example-Rhasspy-Sentences:

[de.fhem:GetState]
\[how is the] (state) $de.fhem.Device{Device} [$de.fhem.Room{Room}]

Required tags:

  • Device

Optional tags:

  • Room


MediaControls

Intent to control media devices


Beispiel-Mapping:

MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next

Options:

  • cmdPlay Play command of the device. See chapter Formatting Commands and Readings inside a rhasspyMapping.
  • cmdPause Command to pause the device.
  • cmdStop Command to stop the device.
  • cmdFwd Command to skip to the next track/channel/etc.
  • cmdBack Command to skip to the previous track/channel/etc.


Note on issuing a voice-command without a room-name: As described in the SetNumeric-Intent, it is recommended to define a GetOnOff-Mapping to use the MediaControls-Intent without a room name.


Example-Sentences:

skip to next track on the radio
pause
skip video on the dvd player
stop playback
next
previous


Example-Rhasspy-Sentences:

[de.fhem:MediaControls]
(start){Command:cmdPlay} the playback [$de.fhem.Device-MediaControls{Device}]
(stop){Command:cmdStop} the playback [$de.fhem.Device-MediaControls{Device}]
(pause){Command:cmdPause} the playback [$de.fhem.Device-MediaControls{Device}]
(next){Command:Fwd} (song|title) [$de.fhem.Device-MediaControls{Device}]
(previous){Command:Back} (song|title) [$de.fhem.Device-MediaControls{Device}] [$de.fhem.Room{Room}]

Required tags:

  • Command

Optional tags:

  • Device
  • Room


MediaChannels

Intent to change radio-/tv channels, favorites, playlists, lightscenes, ...

Instead of using the attribute rhasspyMapping, this intent is configured with an own attribute #rhasspyChannels in the respective device. Reason is the multiple-line-configuration.


Beispiel-Mappings:

SWR3=favorite s_w_r_3
SWR1=favorite s_w_r_1
ARD=channel 204
Netflix=launchApp Netflix
Leselicht=set lightSceneWz scene Leselicht


Notice on using the commands without a device name: To start playback on a device without specifying the device name in the voice command, the module needs to know, which device should be used. Therefor it searches the attribute rhasspyChannels for suitable one. Devices in the actual or spoken room are preferred.


Example-Sentences:

play CNN on the radio in my office
switch to HBO
change channel on radio to BBC news


Example-Rhasspy-Sentences:

[en.fhem:MediaChannels]
\[(play|switch to|change to)] ($de.fhem.MediaChannels){Channel} [($de.fhem.Device){Device}] [($de.fhem.Room){Room}]

Required tags:

  • Channel

Optional tags:

  • Device
  • Room


SetColor

Intent to change light colors


Because of the multi-line settings, instead of configuring this intent with the attribute rhasspyMapping, a separate user-attribute #rhasspyColors is used.

The content of the rhasspyColors uses the following format: Colorname=cmd

Settings:

  • Colorname The name of the color you want to use in a voice-command
  • cmd The FHEM-command


Example-Mappings:

red=rgb FF0000
green=rgb 00FF00
blue=rgb 0000FF
white=ct 3000
warm white=ct 2700


Example-Sentences:

change light to green
lightstrip blue
color the light in the sleeping room white


Example-Rhasspy-Sentences:

[en.fhem:SetColor]
\[change|color] $de.fhem.Device{Device} [$de.fhem.Room{Room}] $de.fhem.Color{Color}

Required tags:

  • Color
  • Device

Optional tags

  • Room


SetColorGroup

SetScene

GetTime

Intent um die Uhrzeit zu erfragen.

Es werden keine Konfigurationen in FHEM benötigt.


Beispiel-Sätze:

wie spät ist es?
sag mir die uhrzeit


Beispiel Rhasspy-Sentences:

[de.fhem:GetTime]
wie spät [ist es]
sag mir die uhrzeit


GetDate

Intent um das aktuelle Datum zu erfragen.


Keine FHEM Einstellungen nötig.


Beispiel-Satz:

welcher tag ist heute


Beispiel Rhasspy-Sentences:

[de.fhem:GetDate]
welcher tag ist heute


SetTimer

Intent to create a timer/countdown/alarm


This intent creates an AT-command in FHEM with the given time and - currently - speaks the sentences "timer expired" when it has expired.


No FHEM-settings needed


Beispiel Sätze:

Set timer in bedroom to five minutes
Set countdown in the kitchen to two hours
set timer to five and a half hours
set alarm to 5 o' clock
set timer to 3 hours and 20 minutes
set timer to 1 hour, 30 minutes and 15 seconds
stop the timer in bedroom


Example-Rhasspy-Sentence:

[de.fhem:SetTimer]
labels=(alarm|teetimer|countdown|timer)
\[<labels>{Label}] [$de.fhem.Room{Room}] (to|in) [((1..60){Hour!int} (hour|hours))] [and] [((1..60){Min!int} (minute|minutes))] [and] [((1..60){Sec!int} (second|seconds))]
\[<labels>{Label}] [$de.fhem.Room{Room}] (to|in) (1..60){Hour!int} and (a quarter{Min:15}|a half{Min:30}|three quarters{Min:45}) (hour|hours)
\[<labels>{Label}] [$de.fhem.Room{Room}] (to|in) (1..60){Min!int} and (a quarter{Sec:15}|a half{Sec:30}|three quarters{Sec:45}) (minute|minutes)
\[<labels>{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (hour)
\[<labels>{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (minute)
\[<labels>{Label}] [$de.fhem.Room{Room}] (to|in|at) (1..24){Hourabs!int} [(1..60){Min!int}] o clock

(cancel|remove|stop|delete){CancelTimer} [<labels>{Label}] [$de.fhem.Room{Room}]

Required tags to set a timer:

  • Label
  • Hour, Hourabs, Min oder Sec

Required tags to cancel a timer:

  • Label


rhasspyTweaks for Timer:


SetMute

Intent to disable/enable the processing of intents on a specific siteId. Rhasspy will still listen to the wakeword but will not process any intents.

This intents creates a Reading mute_siteId for every siteId it get's a voice-command from.

No FHEM-settings needed

Beispiel-Sätze:

good night
be quiet
good morning
make noise
start listening
stop listening


Beispiel für Rhasspy-Sentences:

[de.fhem:SetMute]
(good night|be quiet){Value:on}
(good morning|make noise){Value:off}


Hinweis: Die Felder {Value:on} bzw. {Value:off} sind verpflichtend und case sensitive, der Wert on bzw. off ist in Englisch anzugeben!


ConfirmAction

Dies ist - wie die folgenden Intents CancelAction und Choice (bzw. die überholten Varianten ChoiceRoom und ChoiceDevice) auch - ein Intent, der im Rahmen von Dialogen benötigt wird. Siehe dazu auch Vertiefung - Dialoge. Um eine Aktion tatsächlich auszuführen, ist als Rückgabe zwingend {Mode} mit dem Wert OK erforderlich, alles andere wird so behandelt, als wäre der Intent CancelAction ausgewählt worden, was zur Beendigung des Dialogs ohne Aktion führt.

CancelAction

Siehe ConfirmAction. Dieser Intent muss nicht zwingend existieren, es kann auch ein unpassender Rückgabewert in ConfirmAction angegeben werden, um die Abbruch-Routinen für Dialoge zu starten.

Choice

Siehe ConfirmAction. Dient im Rahmen von Dialogen der Auswahl von einem oder mehreren der folgenden Elemente: {Device}, {Room} und/oder {Scene}.

Beispiel für Rhasspy-Sentences:

[de.fhem:Choice]
den=(den|die|das)
choose= ( nimm [bitte] | [bitte] nimm | ich hätte gerne | [ich] (wähle|nehme) )

<choose> [ <den> [( Gerät | $de.fhem.Aliases{Device} )] ] ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room}
<choose> [ <den> ] $de.fhem.Aliases{Device} [ ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room} ]
<choose> [ ( die Szene | den Modus ) ] $de.fhem.Scenes [Modus] [ [( am | vom )] $de.fhem.Aliases{Device} ] [( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room} ] [bitte]

.

ChoiceRoom

Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Raums, wird heute pauschal nach Choice umgeleitet und sollte nicht mehr verwendet werden!

ChoiceDevice

Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Gerätes, wird heute pauschal nach Choice umgeleitet und sollte nicht mehr verwendet werden!

ReSpeak

Wiederholt den letzten Satz, den Rhasspy gesprochen hat. Um genauer zu sein: Spricht den Inhalt des FHEM Readings voiceResponse.


Keine Einstellungen in FHEM benötigt.


Beispiel-Sätze:

was hast du gesagt
kannst du das wiederholen
ich habe dich nicht verstanden


Example-Rhasspy-Sentences:

[de.fhem:ReSpeak]
was hast du gesagt
kannst du das [bitte] wiederholen
ich habe dich nicht verstanden

Eigene Intents erstellen

Es ist auch möglich, eigene Intents zu erstellen, sollten die hier vorgestellten nicht reichen. Dafür gibt es zwei Wege: Für kleinere Intents können die Möglichkeiten von FHEMs 99_myUtils.pm genutzt werden. Aufwendigere Intents können in jeweils eigenen Dateien abgelegt werden, die dann von RHASSPY ausgelesen werden.

Intents in 99_myUtils.pm

Hier ein (veraltetes, siehe oben) Beispiel, mit dem die letzte voice response wiederholt werden kann.

Ergänze deine 99_myUtils.pm mit folgender Funktion:

sub Respeak(){
  #Credits to JensS
  my $name = "Rhasspy"; #Replace "Rhasspy" with the name of your RHASSPY-Device
  my $response = ReadingsVal($name,"voiceResponse","Ich kann mich leider nicht erinnern");
  return $response;
}

Ergänze im Attribut rhasspyIntents folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):

Respeak=Respeak()

Ergänze einen neuen Intent in deinen sentence.ini an der Rhasspy base:

[de.fhem:Respeak]
was hast du gesagt

Intents in eigenen Dateien

Beispiele: https://github.com/fhem/fhem-rhasspy/blob/main/FHEM/99_RHASSPY_Utils_Demo.pm

Beispiel: Raumwechsel

Erforderlichen Code in das Modulverzeichnis holen und laden:

{ Svn_GetFile('contrib/RHASSPY/99_RHASSPY_Utils_siteId2room.pm', 'FHEM/99_RHASSPY_Utils_siteId2room.pm',sub(){ RHASSPY_Utils_siteId2room_Initialize() }) }

Ergänze im Attribut rhasspyIntents folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):

siteId2room=RHASSPY::siteId2room::siteId2room(NAME,DATA)

Ergänze einen neuen Intent in deinen sentence.ini an der Rhasspy base:

[de.fhem:siteId2room]
( Ortswechsel  | begib dich ) ( ins | in den ) $de.fhem.Room{Room}

Tipps & Tricks

Custom Converter für reelle Zahlen

Info green.pngRHASSPY enthält für {Value} nunmehr auch einen Konverter, der Leerzeichen aus Zahlenwerten entfernt. Enthält dieses Datenfeld bei der Übergabe aus Rhasspy z.B. - 10 .5, wird dies automatisch in -10.5 umgewandelt.

Rhasspy kann (derzeit) keine gesprochenen reellen Nummern (z.B. 22,5) als Nummer erkennen. Stattdessen interpretiert es die Zahl als zwei Nummern und einen Punkt.

Um reelle Nummern richtig zu verwenden, muss ein Custom Converter erstellt und in der sentences.ini verwendet werden.

So ein Konverter kann erstellt werden, in dem unter <profile>/converters ein neues File mit beliebigem Namen angelegt wird. Der Name muss aber dann auch genau so als Converter in der sentences.ini verwendet werden. Anschließend muss die Datei noch ausführbar gemacht werden.

Z.B.:

touch .config/rhasspy/profile/en/converters/customFloat
chmod +x .config/rhasspy/profile/en/converters/customFloat

Folgender Beispiel-Code kann danach in die Datei geschrieben werden:

#!/usr/bin/env python3
import sys
import json

# von Rhasspy als JSON übergebene/n Wert/e einlesen
args = json.load(sys.stdin)

# wenn im deserialisierten JSON nur ein Wert ist, wird der als Ergebnis genommen
# sind mehrere Werte vorhanden (z.B. 22,.,5), werden die zu einem einzelnen String zusammen gesetzt
if type(args) == int:
    num = args
else:
    num = "".join(str(s).strip() for s in args)

# Ergebnis wird an Rhasspy übergeben
print(num)

Nach einem Neustart von Rhasspy kann dieser Converter dann verwendet werden.

[de.fhem.SetNumeric]
stelle die heizung auf (0..30 [komma:. 0..99]){Value!customFloat}


Rhasspy speaks actual state of device after switching it

JensS wrote a short script to let Rhasspy speak the actual state of a FHEM-device after switching it with a voice-command. Add the following to your 99_myUtils.pm

sub ResponseOnOff($){
  my ($dev) = @_;
  my $room;
  my $state = lc(ReadingsVal($dev,"state","in unknown state"));
  my $name = (split(/,/,AttrVal($dev,"rhasspyName","error")))[0];
  if (AttrVal($dev,"rhasspyRoom","")){$room = " in ".(split(/,/,AttrVal($dev,"rhasspyRoom","")))[0]};
  $state=~s/.*on/turned on/;
  $state=~s/.*off/turned off/;
  return "Ok - ".$name.$room." is now ".$state
}

and add a response to the SetOnOff-Mapping of a device

SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}

Links